本指南将基于Linux环境(CentOS 7或Ubuntu 20.04),利用Docker容器技术模拟生产与演练环境,确保在不影响真实业务的情况下,完整验证备份文件的有效性。首先需要确保服务器已安装Docker环境。
如果系统尚未安装Docker,请执行以下命令进行快速安装。Docker将用于隔离演练环境,避免污染宿主机配置。
CentOS系统安装命令:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
Ubuntu系统安装命令:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install -y docker-ce
sudo systemctl start docker
sudo systemctl enable docker
为了规范管理,我们需要在服务器上创建一个专门用于存放备份文件和脚本的工作目录。
mkdir -p /data/drill_system/{backups,scripts,logs}
cd /data/drill_system
为了演示恢复流程,我们首先启动一个模拟的生产数据库容器,并写入一些初始数据。实际生产环境中,这一步对应的是你正在运行的真实业务数据库。
执行以下命令,启动一个名为mysql-prod的容器,设置Root密码为ProdPass123!。
docker run -d \
--name mysql-prod \
-e MYSQL_ROOT_PASSWORD=ProdPass123! \
-e MYSQL_DATABASE=app_db \
-p 3306:3306 \
mysql:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
等待约30秒待数据库初始化完成,然后向其中写入测试数据。
sleep 30
docker exec -i mysql-prod mysql -uroot -pProdPass123! app_db -e "CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(50));"
docker exec -i mysql-prod mysql -uroot -pProdPass123! app_db -e "INSERT INTO users VALUES (1, 'ZhangSan'), (2, 'LiSi');"
恢复演练的前提是有规范的备份文件。我们需要编写一个备份脚本,将生产数据全量导出并打上时间戳存储。
创建文件/data/drill_system/scripts/backup_prod.sh并写入以下内容:
!/bin/bash
BACKUP_DIR="/data/drill_system/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILE_NAME="prod_backup_${TIMESTAMP}.sql"
CONTAINER_NAME="mysql-prod"
DB_PASS="ProdPass123!"
echo "开始备份数据库..."
使用docker exec执行mysqldump,将结果重定向到宿主机文件
docker exec ${CONTAINER_NAME} mysqldump -uroot -p${DB_PASS} --single-transaction --routines --triggers --events app_db > ${BACKUP_DIR}/${FILE_NAME}
if [ $? -eq 0 ]; then
echo "备份成功: ${FILE_NAME}"
仅保留最近3份备份文件,避免磁盘占满
ls -t ${BACKUP_DIR}/prod_backup_.sql | tail -n +4 | xargs -I {} rm {}
else
echo "备份失败,请检查日志"
exit 1
fi
赋予脚本执行权限并手动执行一次,生成初始备份文件:
chmod +x /data/drill_system/scripts/backup_prod.sh
/data/drill_system/scripts/backup_prod.sh
这是本指南的核心部分。该脚本将自动获取最新的备份文件,在一个临时的Docker容器中恢复数据,并执行数据校验逻辑,最后输出结果。

创建文件/data/drill_system/scripts/auto_drill.sh:
!/bin/bash
配置变量
WORK_DIR="/data/drill_system"
BACKUP_DIR="${WORK_DIR}/backups"
LOG_FILE="${WORK_DIR/}/logs/drill.log"
DRILL_PORT=3307
DRILL_CONTAINER_NAME="mysql-drill-test"
DB_PASS="DrillPass123!"
NOTIFY_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN_HERE" 替换为你的钉钉或企业微信Webhook
记录日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
发送通知函数(可选)
send_notify() {
local status=$1
local msg=$2
如果配置了webhook,则发送curl请求,此处仅作逻辑展示
if [ "$NOTIFY_WEBHOOK" != "" ]; then
curl -X POST "$NOTIFY_WEBHOOK" -H 'Content-Type: application/json' -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"演练$status: $msg\"}}"
log "模拟发送通知: 演练$status - $msg"
fi
}
log "========== 开始恢复演练 =========="
1. 寻找最新的备份文件
LATEST_BACKUP=$(ls -t ${BACKUP_DIR}/prod_backup_.sql 2>/dev/null | head -n 1)
if [ -z "$LATEST_BACKUP" ]; then
log "错误: 未找到备份文件!"
send_notify "失败" "未找到备份文件"
exit 1
fi
log "检测到最新备份文件: $LATEST_BACKUP"
2. 清理旧的演练环境
docker rm -f ${DRILL_CONTAINER_NAME} >/dev/null 2>&1
log "已清理旧的演练容器"
3. 启动新的演练数据库容器
log "正在启动演练数据库容器..."
docker run -d \
--name ${DRILL_CONTAINER_NAME} \
-e MYSQL_ROOT_PASSWORD=${DB_PASS} \
-e MYSQL_DATABASE=app_db \
-p ${DRILL_PORT}:3306 \
mysql:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
等待MySQL服务就绪
log "等待MySQL服务启动..."
for i in {1..30}; do
if docker exec ${DRILL_CONTAINER_NAME} mysqladmin ping -h localhost --silent; then
log "MySQL服务已就绪"
break
fi
sleep 1
done
4. 执行恢复操作
log "开始恢复数据..."
docker exec -i ${DRILL_CONTAINER_NAME} mysql -uroot -p${DB_PASS} app_db < ${LATEST_BACKUP}
if [ $? -ne 0 ]; then
log "错误: 数据恢复失败!"
docker rm -f ${DRILL_CONTAINER_NAME}
send_notify "失败" "数据恢复失败"
exit 1
fi
log "数据恢复完成"
5. 数据完整性校验(关键步骤)
检查users表是否存在,且行数是否大于0
TABLE_EXISTS=$(docker exec ${DRILL_CONTAINER_NAME} mysql -uroot -p${DB_PASS} app_db -N -e "SHOW TABLES LIKE 'users';")
ROW_COUNT=$(docker exec ${DRILL_CONTAINER_NAME} mysql -uroot -p${DB_PASS} app_db -N -e "SELECT COUNT() FROM users;")
if [ -z "$TABLE_EXISTS" ]; then
log "校验失败: users表不存在"
docker rm -f ${DRILL_CONTAINER_NAME}
send_notify "失败" "数据校验失败,表不存在"
exit 1
fi
if [ "$ROW_COUNT" -lt 1 ]; then
log "校验失败: 数据行数异常,当前行数: $ROW_COUNT"
docker rm -f ${DRILL_CONTAINER_NAME}
send_notify "失败" "数据行数异常"
exit 1
fi
log "校验成功: users表存在,且包含 $ROW_COUNT 行数据"
6. 清理演练环境
docker rm -f ${DRILL_CONTAINER_NAME}
log "演练环境已清理"
log "========== 演练成功结束 =========="
send_notify "成功" "恢复演练通过,数据一致"
赋予脚本执行权限:
chmod +x /data/drill_system/scripts/auto_drill.sh
在配置定时任务前,必须手动执行一次演练脚本,确保逻辑无误。
/data/drill_system/scripts/auto_drill.sh
执行完毕后,查看日志输出,确认每一步都显示“成功”或“校验通过”。
cat /data/drill_system/logs/drill.log
如果看到类似以下输出,说明演练成功:
[2023-10-27 10:00:00] ========== 开始恢复演练 ==========
[2023-10-27 10:00:00] 检测到最新备份文件: /data/drill_system/backups/prod_backup_20231027_095500.sql
[2023-10-27 10:00:01] MySQL服务已就绪
[2023-10-27 10:00:02] 数据恢复完成
[2023-10-27 10:00:02] 校验成功: users表存在,且包含 2 行数据
[2023-10-27 10:00:03] ========== 演练成功结束 ==========
为了实现“定期”演练,我们使用Linux自带的cron服务。建议将演练时间设置在业务低峰期(例如每天凌晨3点)。
编辑当前用户的crontab:
crontab -e
在文件末尾添加以下内容(注意将脚本路径替换为实际路径,并确保auto_drill.sh中的所有变量路径均为绝对路径):
每天凌晨03:00执行数据库恢复演练
0 3 /data/drill_system/scripts/auto_drill.sh >> /data/drill_system/logs/cron.log 2>&1
保存并退出。如果使用的是vi编辑器,按ESC输入:wq回车即可。
为了验证演练机制是否真的能发现问题,我们可以人为破坏备份文件,再次运行脚本,观察是否触发告警。
将最新的备份文件内容清空或写入乱码:
LATEST_BACKUP=$(ls -t /data/drill_system/backups/prod_backup_.sql | head -n 1)
echo "This is a broken backup file" > ${LATEST_BACKUP}
/data/drill_system/scripts/auto_drill.sh
查看日志,应能看到“错误: 数据恢复失败”或“校验失败”的记录,证明脚本能够有效识别无效的备份文件,达到了演练的目的。
tail -20 /data/drill_system/logs/drill.log
上一篇: 搞定服务器掉线自动重连,从此告别半夜修仙
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图