萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 啟動失敗排查案例:/var/log/pacct 巨大文件導致 File size limit exceeded

MySQL 無故啟動失敗,mysqld_safe 輸出 File size limit exceeded,數據目錄檔案正常、ulimit 無限制。經 find / -size +2G 定位到 /var/log/pacct (2GB+)——系統審計日誌未輪轉。清空該文件後 MySQL 秒級恢復。本文記錄排查思路、根因分析與預防機制。

故障現象

$ mysql.server start
Starting MySQL... [FAIL]

# 移除啟動腳本輸出重定向後
$ /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/var/run/mysqld.pid
File size limit exceeded
nohup: ...

排查路徑

  1. 檢查數據目錄:最大檔案僅幾百 MB,非原因
  2. 檢查 ulimit -a:file size (blocks) unlimited,無軟/硬限制
  3. 全盤掃描大文件:find / -size +2048000k -type f 2>/dev/null
  4. 發現 /var/log/pacct 2.1GB

根因分析

  • pacct:accton 進程記帳系統生成的二進制審計日誌,記錄每個命令執行的資源使用
  • 系統管理員啟用 accton on 但未配置日誌輪轉
  • 文件增長至 2GB+,觸發某種隱式限制(可能是 32 位元 signed int 邊界、檔案系統配額、或 mysqld_safe 腳本內部 ulimit -f 設置)
  • mysqld_safe 以 root 啟動,繼承 Shell 的文件大小限制上下文,導致寫入日誌/啟動過程中觸發 EFBIG

解決與預防

緊急恢復

# 清空 pacct(保留檔案 inode,避免 accton 進程報錯)
> /var/log/pacct
# 或
truncate -s 0 /var/log/pacct

# 立即啟動 MySQL
mysql.server start  # 成功

永久預防:配置 logrotate

# /etc/logrotate.d/psacct
/var/log/pacct {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0600 root root
    sharedscripts
    postrotate
        /usr/sbin/accton /var/log/pacct 2>/dev/null || true
    endscript
}

替代方案:禁用進程記帳(若不需要)

systemctl stop psacct
systemctl disable psacct
# 或
accton off

舉一反三:MySQL 啟動失敗通用排查清單

  1. 錯誤日誌第一眼:tail -100 /var/log/mysqld.log / journalctl -u mysqld
  2. 磁碟空間/Inode:df -h / df -i
  3. 權限/擁有者:chown -R mysql:mysql /data/mysql
  4. 配置語法:mysqld --validate-config (8.0+) / mysqld --help --verbose 2>&1 | head -20
  5. 端口衝突:netstat -tlnp | grep 3306
  6. SELinux/AppArmor:ausearch -m avc -ts recent / aa-status
  7. 系統資源限制:ulimit -a、systemd LimitNOFILE/LimitNPROC
  8. 異常大文件:find /var/log /tmp /data -size +1G

總結

「File size limit exceeded」不一定是 MySQL 自身配置問題,系統級大文件(審計日誌、核心轉儲、舊備份)同樣能觸發進程文件大小限制。建立日誌輪轉標準化、磁碟告警、啟動前健康檢查機制,將此類「無關痛癢」的系統級故障排除在資料庫故障域之外。

copyright © 萬盛學電腦網 all rights reserved