使用Docker在Linux上定時備份MySQL數(shù)據(jù)庫
在Linux上運行MySQL容器后,為了保證數(shù)據(jù)的安全性,我們可以設(shè)置自動備份任務(wù),采取每周全量備份、每天增量備份的方式。以下是一篇詳細(xì)的實現(xiàn)指南,涵蓋了備份方式的選擇、腳本編寫及定時任務(wù)配置。
1.備份方式概述
- 每周全量備份:備份整個數(shù)據(jù)庫內(nèi)容,通常選擇周日。
- 每天增量備份:僅備份每天新增或修改的數(shù)據(jù),相較全量備份節(jié)省存儲空間和時間。
2.運行環(huán)境要求
確保系統(tǒng)具備以下條件:
- Docker:已安裝,并確保MySQL在Docker容器中運行。
- crontab:用于定時任務(wù)調(diào)度。
3.編寫備份腳本
創(chuàng)建一個備份腳本,包含全量和增量備份邏輯。
- 創(chuàng)建目錄:用于存儲備份文件。建議如下結(jié)構(gòu):
/backup/mysql/
├── full/ # 全量備份文件夾
└── incremental/ # 增量備份文件夾
可以用以下命令創(chuàng)建這些文件夾:
mkdir -p /backup/mysql/full
mkdir -p /backup/mysql/incremental
- 編寫備份腳本(mysql_backup.sh)
新建文件 /backup/mysql/mysql_backup.sh,內(nèi)容如下:
#!/bin/bash
# 配置部分
CONTAINER_NAME="your_mysql_container" # MySQL容器名稱
BACKUP_DIR="/backup/mysql" # 備份存儲根目錄
FULL_BACKUP_DIR="$BACKUP_DIR/full" # 全量備份文件夾
INCREMENTAL_BACKUP_DIR="$BACKUP_DIR/incremental" # 增量備份文件夾
DATE=$(date +"%Y%m%d")
# 保留的備份數(shù)量
MAX_BACKUPS=10
# 每周日進(jìn)行全量備份
if [[ $(date +%u) -eq 7 ]]; then
echo "開始全量備份..."
BACKUP_FILE="$FULL_BACKUP_DIR/mysql_full_$DATE.sql"
docker exec $CONTAINER_NAME sh -c "mysqldump --all-databases -uroot -pYourPassword" > "$BACKUP_FILE"
gzip "$BACKUP_FILE" # 壓縮備份文件
echo "全量備份完成并壓縮,存儲路徑:$BACKUP_FILE.gz"
else
# 每天增量備份
echo "開始增量備份..."
BACKUP_FILE="$INCREMENTAL_BACKUP_DIR/mysql_inc_$DATE.sql"
docker exec $CONTAINER_NAME sh -c "mysqlbinlog --read-from-remote-server --host=localhost --user=root --password=YourPassword --raw mysql-bin.*" > "$BACKUP_FILE"
gzip "$BACKUP_FILE" # 壓縮備份文件
echo "增量備份完成并壓縮,存儲路徑:$BACKUP_FILE.gz"
fi
# 清理多余備份,保留最近的10個備份
cleanup_backups() {
local BACKUP_FOLDER=$1
local BACKUP_FILES_COUNT=$(ls -1 "$BACKUP_FOLDER" | wc -l)
if (( BACKUP_FILES_COUNT > MAX_BACKUPS )); then
local FILES_TO_DELETE=$((BACKUP_FILES_COUNT - MAX_BACKUPS))
echo "超過 $MAX_BACKUPS 份備份,開始刪除舊備份..."
ls -1tr "$BACKUP_FOLDER" | head -n $FILES_TO_DELETE | while read -r FILE; do
rm -f "$BACKUP_FOLDER/$FILE"
echo "已刪除過期備份:$BACKUP_FOLDER/$FILE"
done
fi
}
# 執(zhí)行清理操作
cleanup_backups "$FULL_BACKUP_DIR"
cleanup_backups "$INCREMENTAL_BACKUP_DIR"
注意將 your_mysql_container 替換為實際MySQL容器名稱,YourPassword 替換為實際的MySQL root用戶密碼。
- 賦予腳本執(zhí)行權(quán)限
chmod +x /backup/mysql/mysql_backup.sh
4. 設(shè)置定時任務(wù)
使用 crontab 來實現(xiàn)自動定時備份。通過 crontab 設(shè)置如下計劃:
? 每天的凌晨2點執(zhí)行備份腳本。
編輯 crontab
打開 crontab 編輯器:
crontab -e
添加以下行配置定時任務(wù):
0 2 * * * /backup/mysql/mysql_backup.sh >> /backup/mysql/backup.log 2>&1
5. 驗證備份是否成功
可以手動執(zhí)行腳本:
/backup/mysql/mysql_backup.sh
在 /backup/mysql/full 和 /backup/mysql/incremental 中檢查是否生成了對應(yīng)的 .sql 文件。每日備份日志存儲在 /backup/mysql/backup.log,可以通過 tail -f /backup/mysql/backup.log查看任務(wù)執(zhí)行情況。
6.恢復(fù)數(shù)據(jù)
- 恢復(fù)全量備份:直接將最新的全量備份文件導(dǎo)入MySQL。
- 應(yīng)用增量備份:先導(dǎo)入全量備份,然后逐個執(zhí)行增量備份文件。
通過以上步驟,我們便可以在Docker上實現(xiàn)MySQL的每日增量備份和每周全量備份,確保數(shù)據(jù)的持續(xù)性和安全性。