一、MySQL故障排查
1.?單實例常見故障
(1)連接失敗類問題
-
ERROR 2002 (HY000): Can't connect to MySQL server
原因:MySQL未啟動或端口被防火墻攔截。
解決:啟動MySQL服務(systemctl start mysqld
)或開放端口(如3306)367。 -
ERROR 1045 (28000): Access denied
原因:密碼錯誤或權限不足。
解決:修改配置文件添加skip-grant-tables
,重啟后重置密碼并授權367。
(2)性能與資源類問題
-
Too many connections
原因:連接數超出max_connections
限制。
解決:臨時調整(SET GLOBAL max_connections=10000;
)或永久修改配置文件36。 -
Host blocked due to connection errors
原因:同一IP頻繁連接失敗超過max_connect_errors
閾值。
解決:執行mysqladmin flush-hosts
或增大max_connect_errors
值36。
(3)數據損壞與表修復
-
表文件損壞(如MYI文件錯誤)
原因:非正常關機或磁盤空間不足。
解決:使用myisamchk -r
修復或通過phpMyAdmin修復表36。 -
InnoDB數據文件損壞
解決:設置innodb_force_recovery=4
啟動數據庫,備份后重建表37。
2.?主從復制故障
-
Slave_IO_Running為NO
原因:主從server-id
重復或網絡中斷。
解決:修改從庫server-id
并重啟同步367。 -
Slave_SQL_Running為NO(主鍵沖突)
解決:跳過錯誤(SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
)或設置從庫只讀36。 -
中繼日志損壞
解決:重新指定同步點(CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...;
)36。
二、生產環境優化策略
1.?硬件與存儲優化
-
CPU:選擇多核高主頻處理器(如Intel Xeon),支持高并發處理17。
-
內存:建議至少4GB,優先分配大內存給
innodb_buffer_pool_size
(占物理內存70%~80%)157。 -
磁盤:使用SSD或RAID 10陣列,避免RAID 5(寫性能差)157。
2.?查詢與索引優化
-
索引設計
-
選擇性高列優先:如用戶ID而非性別字段25。
-
覆蓋索引:避免回表查詢(如
SELECT name FROM users WHERE name='Alice'
)25。 -
復合索引:遵循最左前綴原則(如索引
(col1,col2)
需條件包含col1
)25。
-
-
SQL語句優化
-
避免全表掃描:使用
EXPLAIN
檢查執行計劃29。 -
分頁優化:用
WHERE id > 1000 LIMIT 10
替代LIMIT 1000,10
25。 -
批量操作:合并INSERT語句減少事務開銷25。
-
3.?配置參數調優
-
緩沖池:
innodb_buffer_pool_size
設置為物理內存的70%~80%57。 -
連接管理:調整
max_connections
(默認151)和wait_timeout
(建議120秒)57。 -
日志配置:開啟慢查詢日志(
slow_query_log=ON
)并設置合理閾值(long_query_time=1
)25。
4.?架構與維護優化
-
讀寫分離:通過主從復制分離讀/寫流量,使用中間件(如ProxySQL)1410。
-
分庫分表:按業務拆分大表,減少單表壓力14。
-
定期維護:
-
使用
OPTIMIZE TABLE
減少碎片57。 -
監控工具:Percona Monitoring或Prometheus+Grafana10。
-
三、高級技巧與注意事項
-
關閉DNS解析:在配置中添加
skip-name-resolve
提升連接速度(需改用IP授權)8。 -
磁盤調度策略:設置為
deadline
或noop
(SSD適用)以提高I/O效率8。 -
網絡優化:調整TCP緩沖隊列(
net.ipv4.tcp_max_syn_backlog
)和隨機端口范圍8。