利用 Linux crontab 搭配 Shell 腳本實現 MySQL 定時自動備份,提供兩種備份模式(tar 打包資料目錄 / mysqldump 導出 SQL)完整部署步驟。
mkdir -p /mysqldata
vi /usr/sbin/bakmysql
模式 A:tar 打包資料目錄(適用 MyISAM、停機或鎖表窗口)
#!/bin/bash
rq=$(date +%Y%m%d)
tar zcvf /mysqldata/mysql_${rq}.tar.gz /var/lib/mysql
模式 B:mysqldump 導出 SQL(通用、不停機、支援 InnoDB)
#!/bin/bash
rq=$(date +%Y%m%d)
mysqldump --all-databases -u root -p'YourPassword' --single-transaction --hex-blob \
| gzip > /mysqldata/mysql_${rq}.sql.gz
注意:
- /var/lib/mysql 為資料目錄,部分安裝為 /usr/local/mysql/data,請確認實際路徑。
- 密碼含特殊字元請用單引號包裹。
- 生產環境建議建立專用備份帳號,僅授 SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, RELOAD 權限。
chmod +x /usr/sbin/bakmysql
vi /etc/crontab
新增行(每天凌晨 3:01 執行):
01 3 * * * root /usr/sbin/bakmysql
格式:分 時 日 月 週 使用者 命令。
/etc/rc.d/init.d/crond restart # 或 systemctl restart crond (CentOS 7+)
次日於 /mysqldata 目錄將看到:
mysql_20240101.tar.gz # 或 mysql_20240101.sql.gz
find /mysqldata -mtime +7 -name "mysql_*.gz" -delete 自動刪除 7 天前備份。rsync -avz /mysqldata/ user@backup-server:/remote/path/ 推送至異地。mail 或 Webhook 發送狀態。exec >> /var/log/mysql_backup.log 2>&1 記錄詳細輸出。GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, RELOAD ON *.* TO 'backup'@'localhost' IDENTIFIED BY 'strongpass';#!/bin/bash,否則 cron 執行失敗。/usr/bin/mysqldump、/bin/tar、/bin/date)。--defaults-extra-file=/root/.my.cnf 指定密碼檔(權限 600)。mysqldump --single-transaction --quick 避免記憶體暴漲;超大庫建議改用 xtrabackup(參見文章 247001)。