首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

修改 MySQL 錯誤日誌路徑:從啟動腳本與 systemd 入手

     編輯:MySQL 資料庫相關知識

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 設定。

方案一:SysV init 腳本 (/etc/init.d/mysqld)

# 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
# 腳本邏輯會自動讀取,無需改腳本

方案二:systemd 服務單元 (CentOS 7+/RHEL 7+/Ubuntu 16.04+)

# 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

方案三:mysqld_safe 直接修改 (舊版/源碼安裝)

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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved