「事前防範勝於事後救火」。建立三層防線:備份兜底、定期巡檢、啟動自檢。提供可直接落地的 Shell 腳本、Cron 任務、Systemd/SysV 啟動掛鉤方案。
mysqldump --single-transaction --master-data=2 + log-bin + expire_logs_days。myisamchk --fast --silent / mysqlcheck --all-databases --check。#!/bin/bash # check_mysql_tables.sh # 用法:放入 /usr/local/mysql/bin/,chmod +x DATADIR="/var/lib/mysql" MYSQLCHECK="/usr/bin/mysqlcheck" USER="root" PASS="your_password" # 1. mysqlcheck 原生檢查(支持 InnoDB/MyISAM,無需停庫) $MYSQLCHECK -u$USER -p$PASS --all-databases --check --silent --fast # 2. 若仍需 myisamchk(純 MyISAM 環境),防參數過長用 find+xargs # find $DATADIR -name "*.MYI" -print0 | xargs -0 myisamchk --fast --silent exit 0
| 場景 | 調度方式 | 配置示例 |
|---|---|---|
| 傳統 Linux (SysVinit) | /etc/crontab | 0 3 * * 0 mysql /usr/local/mysql/bin/check_mysql_tables.sh(每週日 3:00) |
| 現代 Linux (Systemd) | Systemd Timer | 創建 mysql-check.service + mysql-check.timer,OnCalendar=weekly |
| 啟動前檢查 (SysV) | /etc/rc.local | 在 service mysql start **之前**調用腳本 |
| 啟動前檢查 (Systemd) | 服務依賴 | [Unit] Before=mysql.service + Type=oneshot |
# /etc/systemd/system/mysql-check.service [Unit] Description=MySQL Tables Check Before=mysql.service [Service] Type=oneshot ExecStart=/usr/local/mysql/bin/check_mysql_tables.sh User=mysql # /etc/systemd/system/mysql-check.timer [Unit] Description=Weekly MySQL Check Timer [Timer] OnCalendar=weekly Persistent=true [Install] WantedBy=timers.target # 啟用 systemctl daemon-reload systemctl enable --now mysql-check.timer
skip_external_locking=OFF,巡檢時服務器可能修改表導致誤報。建議啟用 skip_external_locking=ON(默認)並用 mysqlcheck 連接服務器檢查。myisamchk *.MYI 可能超過命令行長度限制,改用 find ... -print0 | xargs -0。--datadir 參數,為每個實例部署獨立 Timer/服務。--silent 僅錯誤輸出,避免 Cron 郵件風暴。kill -9 mysqld),重啟驗證啟動檢查生效。