一、連接類問題
1. 無法連接數據庫
-
現象:應用或客戶端無法連接MySQL服務。
-
排查步驟:
-
檢查服務狀態:
bash
復制
下載
systemctl status mysqld # 檢查MySQL是否運行 netstat -tuln | grep 3306 # 確認3306端口是否監聽
-
檢查網絡問題:
-
防火墻是否放行3306端口:
bash
復制
下載
iptables -L -n | grep 3306
-
使用
telnet
或nc
測試網絡連通性:bash
復制
下載
telnet <MySQL_IP> 3306
-
-
檢查用戶權限:
-
確認用戶是否有遠程訪問權限:
sql
復制
下載
SELECT Host, User FROM mysql.user; GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
-
-
檢查配置文件:
-
查看
my.cnf
中是否綁定到127.0.0.1
:ini
復制
下載
bind-address = 0.0.0.0 # 允許所有IP連接
-
-
二、性能類問題
1. 查詢緩慢
-
排查步驟:
-
開啟慢查詢日志:
sql
復制
下載
SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; -- 定義慢查詢閾值(秒)
-
分析慢查詢:
-
查看慢查詢日志文件路徑:
sql
復制
下載
SHOW VARIABLES LIKE 'slow_query_log_file';
-
使用
mysqldumpslow
工具分析日志:bash
復制
下載
mysqldumpslow -s t /var/log/mysql/slow.log
-
-
使用
EXPLAIN
分析SQL執行計劃:sql
復制
下載
EXPLAIN SELECT * FROM table WHERE condition;
-
檢查索引缺失:
-
查看表索引狀態:
sql
復制
下載
SHOW INDEX FROM table_name;
-
使用
OPTIMIZE TABLE
優化表:sql
復制
下載
OPTIMIZE TABLE table_name;
-
-
2. 鎖競爭或死鎖
-
排查步驟:
-
查看當前鎖狀態:
sql
復制
下載
SHOW ENGINE INNODB STATUS; -- 查看事務和鎖信息 SHOW OPEN TABLES WHERE In_use > 0;
-
殺死阻塞進程:
sql
復制
下載
SHOW PROCESSLIST; -- 找到阻塞的進程ID KILL <process_id>;
-
設置鎖超時(避免長事務):
sql
復制
下載
SET GLOBAL innodb_lock_wait_timeout = 30; -- 默認50秒
-
三、數據一致性問題
1. 表損壞或數據丟失
-
排查步驟:
-
檢查表狀態:
sql
復制
下載
CHECK TABLE table_name; -- 檢查表是否損壞
-
修復表:
sql
復制
下載
REPAIR TABLE table_name; -- 僅對MyISAM表有效
-
使用
innodb_force_recovery
(InnoDB引擎):-
修改
my.cnf
并重啟:ini
復制
下載
innodb_force_recovery = 1 -- 從1到6逐步嘗試(6為最高修復級別)
-
-
2. 主從復制錯誤
-
排查步驟:
-
查看復制狀態:
sql
復制
下載
SHOW SLAVE STATUS\G -- 關注Slave_IO_Running和Slave_SQL_Running
-
跳過指定錯誤(謹慎操作):
sql
復制
下載
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; -- 跳過1個錯誤 START SLAVE;
-
重新同步數據:
-
使用
mysqldump
重新導出主庫數據并導入從庫。
-
-
四、日志與錯誤分析
1. 錯誤日志分析
-
查看錯誤日志路徑:
sql
復制
下載
SHOW VARIABLES LIKE 'log_error';
-
常見錯誤碼:
-
1045:權限錯誤 → 檢查用戶密碼和主機白名單。
-
2003:連接超時 → 檢查網絡和防火墻。
-
1213:死鎖 → 優化事務邏輯。
-
2. 二進制日志(Binlog)恢復
-
恢復誤刪數據:
bash
復制
下載
mysqlbinlog --start-datetime="2023-10-01 00:00:00" /var/log/mysql/binlog.000001 | mysql -u root -p
五、資源瓶頸排查
1. CPU/內存過高
-
排查步驟:
-
查看系統資源:
bash
復制
下載
top -c # 查看進程CPU/內存占用 vmstat 2 5 # 監控系統資源
-
優化MySQL配置:
-
調整
innodb_buffer_pool_size
(建議為物理內存的70%)。 -
減少并發連接數(
max_connections
)。
-
-
六、備份與恢復
1. 定期備份
-
物理備份:
bash
復制
下載
innobackupex --user=root --password=xxx /backup/
-
邏輯備份:
bash
復制
下載
mysqldump -u root -p --all-databases > backup.sql
2. 恢復數據
-
全量恢復:
bash
復制
下載
mysql -u root -p < backup.sql
七、高級故障排查工具
-
Percona Toolkit:分析慢查詢、死鎖和索引問題。
-
pt-query-digest:分析慢查詢日志。
-
mytop:實時監控MySQL線程和查詢。
八、預防措施
-
監控告警:使用Prometheus + Grafana監控MySQL狀態。
-
定期優化:每周執行
OPTIMIZE TABLE
和ANALYZE TABLE
。 -
權限最小化:避免使用
root
賬號運行應用。 -
測試備份恢復流程:確保備份文件可恢復。
通過以上步驟,可系統化定位并解決MySQL的常見故障。對于復雜問題,建議結合日志、監控工具和數據庫快照進一步分析。