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

MySQL 資料庫規範化設計與預防性維護(三):系統啟動期自動檢查表、System V/BSD 啟動腳本整合實戰

     編輯:MySQL 資料庫相關知識

建立「預防性維護時間表」是 DBA 核心職責:定期備份、定期檢查、啟動期檢查。本篇聚焦**作業系統啟動階段自動檢查表**,對比 BSD 風格 (/etc/rc.local) 與 System V 風格 (/etc/rc.d/) 兩種啟動體系的整合方式,給出可直接部署的腳本範本。

為何需要啟動期檢查?

  • 非正常關機(斷電、崩潰、OOM Killer)導致 MyISAM 表標記「未正確關閉」。
  • 啟動時自動掃描並修復,將故障暴露在**業務流量進入前**,避免線上報錯。
  • 配合 myisam_recover_options=BACKUP,FORCE (5.1+) 可實現服務內建自動修復,但離線 myisamchk 更徹底、可控。

BSD 風格系統:/etc/rc.local 整合(簡單、通用)

適用:FreeBSD、OpenBSD、NetBSD、Linux(傳統 SysVinit 兼容 rc.local)。

# /etc/rc.local (在 mysqld 啟動命令之前插入)
# 檢查並修復所有 MyISAM 表
if [ -x /usr/local/mysql/bin/myisamchk ]; then
    echo "Checking MyISAM tables..."
    cd /usr/local/mysql/var
    /usr/local/mysql/bin/myisamchk -s -r *.MYI 2>/dev/null
    # -s 靜默、-r 修復模式(自動修復發現的錯誤)
fi

# 然後啟動 MySQL
/usr/local/mysql/bin/mysqld_safe --user=mysql &

System V 風格系統:/etc/rc.d/ 獨立啟動腳本(標準、可控)

適用:RHEL/CentOS 6、Solaris、AIX、HP-UX 等商業 Unix。

建立 /etc/rc.d/init.d/mysql.check:

#!/bin/sh
# chkconfig: 2345 19 81  # 啟動順序 19 (在 mysqld 通常 60 之前),關閉順序 81
# description: MySQL tables pre-start check and repair

case "$1" in
    start)
        echo -n "Checking MySQL tables: "
        if [ -x /usr/local/mysql/bin/myisamchk ]; then
            cd /usr/local/mysql/var
            /usr/local/mysql/bin/myisamchk -s -r *.MYI 2>/dev/null
            RETVAL=$?
            if [ $RETVAL -eq 0 ]; then echo "OK"; else echo "FAILED"; fi
        else
            echo "SKIPPED (myisamchk not found)"
            RETVAL=0
        fi
        ;;
    stop)
        # 無需操作
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac
exit $RETVAL

安裝與排序:

chmod +x /etc/rc.d/init.d/mysql.check
# 假設 mysql 啟動腳本連結為 S60mysqld (啟動順序 60)
ln -s /etc/rc.d/init.d/mysql.check /etc/rc.d/rc3.d/S19mysql.check
# S19 < S60 確保檢查在 mysqld 啟動前完成

Linux 實務建議:統一用 rc.local 或 systemd

  • 現代 Linux (CentOS 7+/RHEL 7+/Ubuntu 16.04+) 採用 **systemd**,rc.local 兼容但非首選。
  • systemd 單元範例 /etc/systemd/system/mysql-check.service:
    [Unit]
    Description=MySQL Pre-start Table Check
    Before=mysqld.service
    ConditionPathExists=/usr/local/mysql/bin/myisamchk
    
    [Service]
    Type=oneshot
    User=mysql
    WorkingDirectory=/usr/local/mysql/var
    ExecStart=/usr/local/mysql/bin/myisamchk -s -r *.MYI
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    
  • 啟用:systemctl enable mysql-check && systemctl start mysql-check。

關鍵參數選擇:-r (修復) vs 純檢查

  • myisamchk -s *.MYI:純檢查,發現錯誤**不修復**,僅報錯(適合人工介入環境)。
  • myisamchk -s -r *.MYI:檢查並**自動修復**(適合無人值守啟動期)。
  • 生產環境建議:**啟動期用 -r 自動修復**,並配合 myisam_recover_options=BACKUP,FORCE 雙重保障。

完整預防性維護清單

頻率任務工具/命令備註
每日全庫備份mysqldump / Percona XtraBackup異地存儲、驗證可還原
每日慢查詢分析pt-query-digest / mysqldumpslow優化 Top 10
每週表檢查巡檢myisamchk -s -C / mysqlcheck -A -c離線/線上視引擎
每月索引碎片整理OPTIMIZE TABLE / ALTER TABLE ... ENGINE=InnoDB配合 ANALYZE TABLE
啟動時MyISAM 表自動修復myisamchk -s -r / myisam_recover_options本文核心
變更時Schema 變更審計pt-online-schema-change / gh-ost無鎖變更
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved