MySQL 錯誤日誌預設寫在 /var/log/mysqld.log 或 data 目錄 hostname.err。若需變更路徑 (如集中日誌掛載點、分盤、權限隔離),修改 /etc/my.cnf 常不生效,因啟動腳本 (mysqld_safe/systemd) 以參數 --log-error 直接傳遞覆蓋配置檔。本文提供針對不同啟動方式的修改方案。
# 查看實際啟動參數
ps aux | grep mysqld
# 輸出範例:
# /bin/sh /usr/bin/mysqld_safe --datadir=/data/mysql --socket=/var/lib/mysql/mysql.sock --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid
# /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --user=mysql --log-error=/var/log/mysqld.log ...
--log-error 參數在命令列直接指定,**覆蓋** my.cnf 中的 log-error 設定。
# 1. 編輯啟動腳本
vi /etc/init.d/mysqld
# 2. 找到 get_mysql_option 呼叫處
get_mysql_option mysqld_safe log-error "/var/log/mysqld.log"
errlogfile="$result"
# 3. 修改預設路徑或改為讀取配置檔
# 選項 A:直接改路徑
get_mysql_option mysqld_safe log-error "/data/logs/mysql/error.log"
# 選項 B (推薦):讓腳本優先讀取 my.cnf
# 確保 my.cnf [mysqld_safe] 區段有 log-error=/data/logs/mysql/error.log
# 腳本邏輯會自動讀取,無需改腳本
# 1. 查看服務單元
systemctl cat mysqld
# 或
vi /usr/lib/systemd/system/mysqld.service
# 2. 修改 ExecStart 或 Environment
# 典型單元檔片段:
[Service]
EnvironmentFile=-/etc/sysconfig/mysql
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
# 3. 編輯 /etc/sysconfig/mysql (或 /etc/default/mysql)
MYSQLD_OPTS="--log-error=/data/logs/mysql/error.log"
# 4. 重載並重啟
systemctl daemon-reload
systemctl restart mysqld
vi /usr/bin/mysqld_safe
# 找到預設錯誤日誌路徑
log_error="/var/log/mysqld.log"
# 修改為
log_error="/data/logs/mysql/error.log"
# 或使其讀取配置檔 [mysqld_safe] log-error
# 1. 重啟後查看進程參數
ps aux | grep mysqld | grep log-error
# 應顯示新路徑
# 2. 查看新日誌檔案
tail -f /data/logs/mysql/error.log
# 應有啟動訊息:[Note] /usr/sbin/mysqld: ready for connections.
# 3. 觸發一個錯誤測試
mysql -u root -p -e "SELECT * FROM non_exist_table;"
# 新日誌應記錄 ERROR 1146
/data/logs/mysql/ 掛載獨立磁碟/LVM,設定 logrotate 週期壓縮保留 30 天。750 mysql:mysql,檔案 640 mysql:mysql。/etc/my.cnf:[mysqld_safe]
log-error = /data/logs/mysql/error.log
[mysqld]
log-error = /data/logs/mysql/error.log 確保手動啟動 mysqld、mysqld_safe、systemd 皆一致。rsyslog/Filebeat/Fluent Bit 將錯誤日誌實時轉發至 ELK/Loki/ClickHouse。