MySQL 運行異常時,錯誤日誌是首要診斷依據。但日誌路徑因安裝方式 (官方安裝包、Yum/Apt、Docker、源碼編譯)、作業系統、配置參數而異。本文提供通用查找方法與查看技巧。
一、標準路徑對照表
| 安裝方式 / OS | 預設錯誤日誌路徑 | 檔案命名 |
| Windows (MSI/Zip) | C:\ProgramData\MySQL\MySQL Server X.Y\Data\ | 主機名.err |
| Linux (Yum/RPM - Oracle/Percona) | /var/log/mysqld.log 或 /var/log/mysql/error.log | mysqld.log / error.log |
| Linux (Apt/Debian/Ubuntu) | /var/log/mysql/error.log | error.log |
| Linux (源碼編譯 / 自定義) | datadir 目錄下 | 主機名.err |
| Docker (官方映像) | 標準輸出 (stdout/stderr) | docker logs container_name |
| MariaDB | /var/log/mysql/mariadb.log 或 datadir | 同 MySQL |
二、通用查找方法 (適用所有環境)
方法 1:SHOW VARIABLES 直接查詢 (最準確)
mysql -u root -p -e "SHOW VARIABLES LIKE 'log_error';"
-- 輸出範例:/var/log/mysql/error.log 或 /var/lib/mysql/host.err
方法 2:查看配置檔 log_error 參數
grep -i log_error /etc/my.cnf /etc/mysql/my.cnf /usr/my.cnf ~/.my.cnf 2>/dev/null
# 若未設定,則使用預設路徑 (datadir/主機名.err)
方法 3:從進程啟動參數推斷
ps aux | grep mysqld
# 觀察 --log-error=... 參數;若無,則用 --datadir 定位
方法 4:find 系統搜尋 (最後手段)
# 以主機名搜尋
HOST=$(hostname)
find / -name "${HOST}.err" -o -name "mysqld.log" -o -name "error.log" 2>/dev/null | head -20
# 或搜尋近期修改的 mysql 相關日誌
find /var/log /var/lib/mysql /usr/local/mysql -name "*.log" -o -name "*.err" -mtime -7 2>/dev/null
三、查看與分析技巧
# 即時追蹤 (最常用)
tail -f /var/log/mysql/error.log
# 最近 100 行
tail -100 /var/log/mysql/error.log
# 關鍵字搜尋 (不區分大小寫)
grep -i "error\|fail\|crash\|assertion\|corrupt\|innodb" /var/log/mysql/error.log
# 特定時間範圍 (配合 journald/systemd)
journalctl -u mysqld --since "1 hour ago" | grep -i error
# Docker 環境
docker logs mysql_container --since 1h 2>&1 | grep -i error
四、關鍵錯誤代碼速查
| 代碼/關鍵字 | 典型原因 | 對策方向 |
Can't create test file | 資料目錄權限/路徑錯誤 | 檢查 datadir 權限、SELinux/AppArmor |
InnoDB: Unable to lock ./ibdata1 | 另一實例在跑 / 殘留鎖檔 | kill 殘留進程、刪除 ibdata1 同目錄 .lock |
[ERROR] Plugin 'InnoDB' registration failed | ib_logfile 大小不符 / 損壞 | 停止服務、刪除 ib_logfile*、重啟 (自動重建) |
Table './db/tbl' is marked as crashed | MyISAM 表損壞 | REPAIR TABLE tbl; 或 myisamchk -r |
Access denied for user | 帳號/密碼/Host 不匹配 | 檢查 mysql.user、FLUSH PRIVILEGES |
Too many connections | 連線數超過 max_connections | 調大參數、檢查連線池洩漏、KILL 閒置連線 |
五、日誌輪轉與保留建議
# logrotate 設定 (/etc/logrotate.d/mysql)
/var/log/mysql/*.log {
daily
rotate 30
compress
missingok
notifempty
create 640 mysql mysql
sharedscripts
postrotate
mysqladmin -u root -p flush-logs 2>/dev/null || true
endscript
}