連不上mysql時一般有以下四種報錯:
1:Can't connect to MySQL server
2:Lost connection to MySQL server
3:Sorry, due to line fault, temporarily unable to browse, we are dealing with.
4:MySQL server has gone away
一:Can't connect to MySQL server
可能的原因:
1,mysql服務端沒有啟起來
2,網絡不通(iptables,selinux,網絡不穩定)
對應的解決方案:
1,dba先確定mysql服務是否正常
2,mysql服務正常的情況下找運維確認網絡問題
二: Lost connection to MySQL server
有四種情況可能會導致這樣的報錯:
1,網絡問題
2,查詢的結果集太大,比如一個查詢要返回幾百萬個結果
3,客戶端發起數據庫連接的時候由於connect_timeout設置時間太短而報錯,如果是由於這個原因引起的報錯可以通過SHOW GLOBAL STATUS LIKE 'Aborted_connects'查看這個值是否有增加
4,查詢有blob類型,超過了max_allowed_packet參數的限制
這四種情況對應的解決方案:
1,運維監控網絡是否有問題
2,將 net_read_timeout值調大
3,將connect_timeout值調大
4,將max_allowed_packet值調大
三: Sorry, due to line fault, temporarily unable to browse, we are dealing with.
這個錯誤不是mysql原生的錯誤,在網上也沒有找到有類似的資料.目前發現有三種情況會有這種報錯:
1,網絡有問題
2,數據庫連接數過多
3,連數據庫的帳號密碼有誤
四: MySQL server has gone away
有以下12種情況可能會導致這樣的報錯:
1,默認的wait_timeout值為8個小時,如果空閒連接超過這個值會被kill
2,dba手動kill
3,客戶端的帳號沒有權限連接mysql server
4,客戶端TCP/IP連接超時,如使用mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...)或者mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)函數
5,當客戶端禁用了自動重連接( automatic reconnection)
6,查詢語句不正確
7,查詢語句太長,超過了max_allowed_packet的限制
8,一條insert或者replace語句更新的行數過多
9,域名解析失敗
10,防火牆屏蔽了3306端口
11,一個線程fork了多個子進程,當多個子進程共用一個連接時會導致報錯
12,mysql服務端掛了
報MySQL server has gone away的錯誤原因比較多,我們可以從三個方面來應對這個問題:
1,運維
a,確認防火牆規則
b,dns服務器無異常
d,合理配置php.ini中連接mysql的參數
connect_timeout,默認為60s
mysqli.reconnect,默認為off
2,DBA
a,確定mysql服務和連接數無異常
b,設置合理的wait_timeout值
c,設置在服務器端合理的max_allowed_packet值
d,確認帳號權限無誤
3,開發
a,建議使用mysqli替代mysql
b,盡量少用長連接
c,mysqli.ping()可以在連接斷開後自動重連,mysql.ping()從mysql5.0.3後就不支持自動重連了
d,子進程之間不要共用一個數據庫連接
以gamiss為例,我們來看一下max_allowed_packet和超時有關的參數:
>show variables like 'max_allowed_packet';
+--------------------+------------+
| Variable_name | Value |
+--------------------+------------+
| max_allowed_packet | 1073741824 |
+--------------------+------------+
>show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 60 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 120 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 86400 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 120 |
| net_write_timeout | 120 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 3600 |
| thread_pool_idle_timeout | 60 |
| wait_timeout | 86400 |
+-----------------------------+----------+
來看一下這幾個與連不上數據庫相關的超時參數:
connect_timeout:在獲取鏈接時,等待握手的超時時間,一般默認即可(10s),為了避免因為網絡不佳導致連接擁塞可以適當增大這個值.線上配置為60s
wait_timeout/interactive_timeout:連接狀態持續為sleep的超時時間,默認為28800(8小時),現上調整到了24小時
net_read_timeout:服務器端等待客戶端發送數據的超時時間,默認60s,線上為120s
net_write_timeout:服務器端寫數據到客戶端的超時時間,默認60s,線上為120s
再看一下max_allowed_packet參數:max_allowed_packet的默認值是1M(1048576),最大值是1G(1073741824),我們目前線上的值已經是上限值了.
從上面的配置可以看到這些參數的設置相對來說都很大了,數據庫正常情況下程序報連不上數據庫應該和數據庫本身的參數配置沒有關系.我們需要從其它方向來解決這個問題.