首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 錯誤日誌路徑修改實戰:從 my.cnf 失效到啟動腳本精準定位

     編輯:MySQL 綜合教學

問題現象:my.cnf 配置不生效

嘗試在 /etc/my.cnf 的 [mysqld] 或 [mysqld_safe] 區塊設置 log-error=/new/path/error.log,重啟後日誌仍寫入舊路徑 /var/log/mysqld.log。

根因分析:啟動參數優先級

通過 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 \
  --pid-file=/var/run/mysqld/mysqld.pid \
  --skip-external-locking \
  --port=3306 \
  --socket=/var/lib/mysql/mysql.sock

命令行參數 > 配置文件 > 編譯默認值,故 my.cnf 設置被忽略。

溯源定位:誰在傳遞參數?

  1. chkconfig --list 確認服務由 mysqld init 腳本管理
  2. 檢視 /etc/init.d/mysqld 腳本,發現關鍵讀取邏輯:
    
    get_mysql_option mysqld datadir "/var/lib/mysql"
    datadir="$result"
    
    get_mysql_option mysqld socket "$datadir/mysql.sock"
    socketfile="$result"
    
    get_mysql_option mysqld_safe log-error "/var/log/mysqld.log"  ← 這裡有默認值!
    errlogfile="$result"
    
    get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld.pid"
    mypidfile="$result"
    
  3. get_mysql_option 函數會優先讀取命令行參數,再讀取 my.cnf,最後用硬編碼默認值
  4. 解決方案:修改 init 腳本默認值(推薦)

    編輯 /etc/init.d/mysqld,修改 get_mysql_option 調用的默認值參數:

    
    # 原代碼
    get_mysql_option mysqld_safe log-error "/var/log/mysqld.log"
    errlogfile="$result"
    
    # 修改為
    get_mysql_option mysqld_safe log-error "/data/logs/mysql/error.log"
    errlogfile="$result"
    

    同步修改 pid-file、socket 等相關路徑保持一致性。

    驗證生效

    
    # 重啟服務
    service mysqld restart
    
    # 驗證進程參數
    ps aux | grep mysqld
    # 應顯示 --log-error=/data/logs/mysql/error.log
    
    # 驗證日誌文件
    tail -f /data/logs/mysql/error.log
    # 應有新寫入內容
    

    替代方案對比

    方案優點缺點適用場景
    修改 init 腳本默認值根治、持久化、符合發行版管理規範需 root、升級包可能覆蓋生產環境標準部署
    在 my.cnf 設置並清空腳本默認值集中配置管理需確保腳本不再硬編碼傳參自定義編譯/非標準部署
    systemd 覆蓋 (Override)不修改原文件、系統級管理需 systemd 版本、學習成本RHEL 7+/CentOS 7+/Ubuntu 16.04+
    直接修改啟動命令快速測試非持久化、重啟失效臨時調試

    systemd 覆蓋方案實操(現代 Linux)

    
    # 創建覆蓋單元
    systemctl edit mysqld
    
    # 編輯器中輸入
    [Service]
    Environment=MYSQLD_OPTS="--log-error=/data/logs/mysql/error.log"
    
    # 重載並重啟
    systemctl daemon-reload
    systemctl restart mysqld
    

    最佳實踐建議

    1. 日誌目錄預建:mkdir -p /data/logs/mysql && chown mysql:mysql /data/logs/mysql
    2. 統一規劃:datadir、log-error、pid-file、socket 同層級目錄規劃
    3. 權限鎖定:日誌目錄僅 mysql 用戶可寫,防篡刪
    4. 輪轉配置:配合 logrotate 避免單文件過大
    5. 變更記錄:運行手冊記錄路徑變更歷史,便災難恢複

    相關延伸主題

    • MySQL 系統變量與啟動參數關係
    • MySQL 慢查詢日誌配置與分析
    • MySQL Binlog 管理最佳實踐
    • systemd 管理 MySQL 服務進階
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved