PHP Pdo MySQL Server has gone away


#2006 MySQL Server has gone away

#2013 Lost connection to MySQL server during query


mysql 導致這個行爲的地方有兩個 interactive_timeout 、wait_timeout

可以通過修改mysql配置文件/etc/my.cnf來延長時間。這裏設置的是10秒

[mysqld]
wait_timeout=10
interactive_timeout=10



當sql執行間歇時間過長,特別是php做守護進程的時候。Mysql鏈接很容易斷開。由於種種原因不能使用持久鏈接或者修改mysql配置。所以,只能嘗試捕捉pdo exception 重連。需要設置 

->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

否則無法捕捉到該warning異常


幾個查看狀態的mysql 命令

show processlist;
show variables like 'max_connections';
show variables ;


以下是interactive_timeout 和wait_timeout 的說明

官方解釋:
    interactive_timeout
           The number of seconds the server waits for activity on an interactive                               connection before closing it.
          等待一個交互進程變成活動狀態的最長時間
     wait_timeout
           The number of seconds the server waits for activity on a noninteractive                           connection before closing it. This timeout applies only
           to TCP/IP and Unix socket file connections, not to connections made using                  named pipes, or shared memory.
            等待一個未交互進程變成活動狀態的最長時間

首先理解交互進程,它指的是這個進程正在等待該進程的提交、撤銷操作;未交互進程指的是該進程的一個操作已經完成,正在sleep,等待下個操作進行。

實際操作看看這兩個參數的效果:
SET GLOBAL interactive_timeout=20;
SET GLOBAL wait_timeout=50;

 s1  s2
start transaction  
 update t set c1 = 1;  
 等待20s不提交  
 發現直接被斷開  
   update t set c1 = 1

 等待50s
   被直接斷開
   


參考

http://blog.itpub.net/12309491/viewspace-697887/



1)interactive_timeout:
參數含義:服務器關閉交互式連接前等待活動的秒數。交互式客戶端定義爲在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。
參數默認值:28800秒(8小時)

(2)wait_timeout:
參數含義:服務器關閉非交互連接之前等待活動的秒數。
在線程啓動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,取決於客戶端類型(由mysql_real_connect()的連接選項CLIENT_INTERACTIVE定義)。
參數默認值:28800秒(8小時)

MySQL服務器所支持的最大連接數是有上限的,因爲每個連接的建立都會消耗內存,因此我們希望客戶端在連接到MySQL Server處理完相應的操作後,應該斷開連接並釋放佔用的內存。如果你的MySQL Server有大量的閒置連接,他們不僅會白白消耗內存,而且如果連接一直在累加而不斷開,最終肯定會達到MySQL Server的連接上限數,這會報'too many connections'的錯誤。對於wait_timeout的值設定,應該根據系統的運行情況來判斷。在系統運行一段時間後,可以通過show processlist命令查看當前系統的連接狀態,如果發現有大量的sleep狀態的連接進程,則說明該參數設置的過大,可以進行適當的調整小些。

問題:
   如果在配置文件my.cnf中只設置參數wait_timeout=100,則重啓服務器後進入,執行:
   Mysql> show variables like “%timeout%”;
會發現參數設置並未生效,仍然爲28800(即默認的8個小時)。
查詢資料後,要同時設置interactive_timeout和wait_timeout纔會生效。
【mysqld】
wait_timeout=100
interactive_timeout=100
重啓MySQL Server進入後,查看設置已經生效。


問題1:這裏爲什麼要同時設置interactive_timeout,wait_timeout的設置纔會生效?

問題2:interactive的值如果設置的和wait_timeout不同,爲什麼Interactive_timeout會覆蓋wait_timeout?

問題3:在進行MySQL優化時,因爲interactive_timeout決定的是交互連接的時間長短,而wait_timeout決定的是非交互連接的時間長短。如果在進行連接配置時mysql_real_connect()最後一個參數client_flag不設置爲CLIENT_INTERACTIVE,是不是interactive_timeout的值不會覆蓋wait_timeout?

問題4:爲了減少長連接的數量,在設置優化時是不是可以將interactive_timeout的值設置的大些,而wait_timeout的值設置的小些?但是問題2的描述好像又不允許這樣。。。


參考


http://www.cnblogs.com/jiunadianshi/articles/2475475.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章