# 編輯 crontab (以 mysql 用戶或 root)
crontab -e
# 每日 01:01 執行
1 1 * * * /data/task/backupmysql.sh
/data/task/backupmysql.sh#!/bin/bash
# MySQL 每日備份腳本,保留 7 天
BACKUP_DIR="/data/backup/mysql"
MYSQL_BIN_DIR="/usr/local/mysql/bin"
DB_USER="dbuser"
DB_PASS="dbpassword"
DB_NAME="dbname"
TIMESTAMP=$(date +%Y%m%d%H)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}-${TIMESTAMP}.sql.gz"
# 確保備份目錄存在
mkdir -p "${BACKUP_DIR}"
# 邏輯備份 + 即時壓縮
${MYSQL_BIN_DIR}/mysqldump \
-u"${DB_USER}" -p"${DB_PASS}" \
--single-transaction --quick --routines --triggers --events \
"${DB_NAME}" | gzip > "${BACKUP_FILE}"
# 檢查備份檔案大小(防止空檔)
if [ ! -s "${BACKUP_FILE}" ]; then
echo "$(date) ERROR: Backup file is empty!" >> "${BACKUP_DIR}/backup.log"
exit 1
fi
# 刪除 7 天前備份
find "${BACKUP_DIR}" -name "${DB_NAME}-*.sql.gz" -type f -mtime +7 -delete
# 記錄日誌
echo "$(date) SUCCESS: ${BACKUP_FILE} ($(du -h ${BACKUP_FILE} | cut -f1))" >> "${BACKUP_DIR}/backup.log"
--single-transaction:InnoDB 一致性快照,無鎖。--quick:逐行讀取,避免大表佔用記憶體。--routines --triggers --events:備份存儲過程、觸發器、事件。gzip 管線壓縮,節省 70%~90% 空間。find -mtime +7 -delete:保留 7 天,自動清理。~/.my.cnf [client] 區塊存放密碼,腳本移除 -p 參數。DB_LIST,每庫獨立檔案。rsync -avz --password-file=... ${BACKUP_DIR}/ user@backup-server::module/。pigz 替代 gzip,多核加速。# 完全備份
xtrabackup --backup --target-dir=/data/backup/full_$(date +%F) --user=root --password=xxx
# 增量備份
xtrabackup --backup --target-dir=/data/backup/inc_$(date +%F) \
--incremental-basedir=/data/backup/full_2024-05-01 --user=root --password=xxx
# 還原準備
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full_2024-05-01
xtrabackup --prepare --target-dir=/data/backup/inc_2024-05-02 --incremental-dir=/data/backup/full_2024-05-01
XtraBackup 物理熱備、無鎖、速度快(流式複製)、支援增量,**大型生產庫首選**。
一個健壯的備份腳本包含:**參數化配置、單交易無鎖導出、即時壓縮、自動清理、詳細日誌、非零退出碼、異地同步、定期演練**。小庫用 mysqldump 足矣,大庫請上 XtraBackup。