程式無法連線 MySQL 時,通常拋出以下四類錯誤:
原因:MySQL 服務未啟動、網路不通(iptables/selinux/網路抖動)。
排查:DBA 確認服務狀態 → 運維排查網路連通性與防火牆規則。
四大誘因:
① 網路抖動/中斷
② 查詢結果集過大(百萬級行)
③ connect_timeout 設定過小(可查 Aborted_connects 計數器)
④ BLOB/TEXT 欄位超過 max_allowed_packet 限制
對策:運維監控網路 → 增大 net_read_timeout → 增大 connect_timeout → 增大 max_allowed_packet。
三大場景:網路故障、資料庫連線數耗盡、帳號密碼錯誤。需結合應用日誌與 MySQL Threads_connected、Max_used_connections 綜合判斷。
服務端主動斷開:
① wait_timeout(預設 8h)空閒斷開
② DBA 手動 KILL
③ 客戶端帳號無權限
④ TCP/IP 讀寫超時(MYSQL_OPT_READ/WRITE_TIMEOUT)
⑤ 客戶端禁用自動重連
⑥ SQL 語法錯誤
⑦ 單條 SQL 超過 max_allowed_packet
⑧ 單次 INSERT/REPLACE 影響行數過多
⑨ DNS 解析失敗
⑩ 防火牆封鎖 3306
⑪ 多執行緒共用單一連線(fork 子進程)
⑫ MySQL 服務崩潰
| 角色 | 核心行動 |
|---|---|
| 運維 | 確認防火牆規則、DNS 穩定、PHP/應用連線參數(connect_timeout=60、mysqli.reconnect=On) |
| DBA | 服務與連線數監控、調大 wait_timeout(建議 24h)、設定合理 max_allowed_packet、核對帳號權限 |
| 開發 | 棄用 mysql_* 改用 mysqli/PDO、減少長連線、使用 mysqli_ping() 自動重連、子進程獨立連線 |
某生產環境配置:max_allowed_packet=1G(上限)、connect_timeout=60s、wait_timeout=86400s、net_read/write_timeout=120s。參數已寬鬆,若仍報錯需向應用碼、網路路徑、中介軟體層深挖。