生產環境故障多樣,但核心成因可歸類。本文整理七大類高頻問題:服務崩潰、連線失敗、記憶體不足、封包過大、表滿、權限忽略、表不存在,提供標準化排查流程。
mysqld 進程死掉,還是客戶端問題:mysqladmin version 檢查運行時間/var/log/mysql/error.log 或 datadir/hostname.errdmesg | grep -i kill| 錯誤訊息 | 核心原因 | 排查指令 | 解決方案 |
|---|---|---|---|
| Can't connect to local MySQL server | 服務未啟動、Socket 路徑錯、埠被佔 | ps aux | grep mysqldnetstat -tlnp | grep 3306ls -l /var/run/mysqld/ | 啟動服務、修正 my.cnf socket、殺佔用進程 |
| Host 'x' is blocked | 超過 max_connect_errors 次失敗 | mysqladmin flush-hosts | 調大 max_connect_errors、檢查應用重連邏輯 |
| Too many connections | 達到 max_connections | SHOW PROCESSLISTSHOW STATUS LIKE 'Threads_connected' | 調大參數、修復連線洩漏、啟用連線池 |
| Access denied | 帳號/密碼/主機不匹配 | SELECT User, Host, plugin FROM mysql.user | 重設密碼、修正 host、確認認證插件 |
ERROR 2008: MySQL client ran out of memory MySQL: Out of memory at line 42, 'malloc.c' needed 8136 byte (8k), memory in use: 12481367 bytes
max_allowed_packet 過小 → 調大至 64M+ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes
mysql --max_allowed_packet=128MSET GLOBAL max_allowed_packet=128M + my.cnf 永久生效max_heap_table_size / tmp_table_size 上限 → 調大參數、改用 InnoDBinnodb_data_file_path=ibdata1:12M:autoextendFound wrong password for user: 'user@host'; Ignoring user
mysql.user 表中 authentication_string 格式錯誤、版本升級未執行 mysql_upgrademysql_upgrade -u root -p、重建使用者、檢查 plugin 欄位lower_case_table_names 參數控制:
lower_case_table_names=1| 工具/指令 | 用途 |
|---|---|
SHOW PROCESSLIST / SHOW FULL PROCESSLIST | 當前執行緒、鎖等待、長查詢 |
SHOW ENGINE INNODB STATUS | InnoDB 內部狀態、鎖、死鎖、緩衝池 |
SHOW GLOBAL STATUS / SHOW GLOBAL VARIABLES | 計數器與參數快照 |
mysqladmin status / variables / extended-status | 命令列快速查看 |
pt-stalk (Percona Toolkit) | 條件觸發自動收集診斷資料 |
sys.schema_* / sys.statement_analysis (sys schema) | 標準化診斷視圖 |
KILL query_id)SHOW ENGINE INNODB STATUS、系統資源 (top、iostat、free)故障不可避免,但「標準化診斷流程、完整觀測體系、定期演練」能將 MTTR (平均修復時間) 從小時壓縮至分鐘。建議團隊建立故障知識庫,每次故障產出一份 RCA 文件。