linux自动化定时备份与异地容灾可通过mysqldump、scp和crontab实现:先配置ssh免密登录,再编写含导出、上传、清理的绝对路径备份脚本,最后用crontab定时执行并记录日志。

要让 Linux 实现自动化定时备份并达成异地容灾,核心是三件事:本地可靠备份、安全传到远端、按时自动执行。不依赖复杂工具,用系统自带的 mysqldump、scp 和 crontab 就能落地,关键在路径、权限和环境细节。
配置 SSH 免密登录(异地传输前提)
scp 上传备份文件必须跳过密码输入,否则定时任务会卡住。
- 在数据库服务器上生成密钥:
ssh-keygen -t rsa(连续回车,默认保存在/root/.ssh/id_rsa.pub) - 把公钥内容复制出来,登录目标容灾服务器,在
/root/.ssh/authorized_keys文件末尾粘贴(若文件不存在,先touch authorized_keys并设权限chmod 600 authorized_keys) - 测试是否生效:
ssh root@目标IP date,能直接返回时间就说明通了
编写带清理的备份脚本
脚本需包含导出、上传、过期清理三个动作,所有路径用绝对路径,避免 crontab 执行时找不到命令或目录。
- 创建脚本文件,例如
/data/mysql/backup/backup.sh - 内容示例(注意替换容器名、账号密码、目标IP):
#!/bin/bash BACKUP_DIR="/data/mysql/backup/back_dir" DATETIME=$(date +\%F) # 导出全库(适用于 Docker MySQL) docker exec -i mysql /usr/bin/mysqldump --all-databases --single-transaction --routines --triggers --events -uroot -proot > $BACKUP_DIR/all_databases_$DATETIME.sql # 上传到异地服务器 scp $BACKUP_DIR/all_databases_$DATETIME.sql root@192.168.50.100:/data/mysql/backup/back_dir/ # 清理 7 天前的本地 SQL 文件 find $BACKUP_DIR -mtime +7 -name "*.sql" -delete
- 赋予执行权限:
chmod +x /data/mysql/backup/backup.sh - 手动运行一次验证:
/data/mysql/backup/backup.sh,确认本地生成文件、远程收到、旧文件被删
设置 Crontab 定时任务
定时任务必须用绝对路径调用脚本,并建议重定向日志便于排查。
- 编辑当前用户定时任务:
crontab -e - 添加一行(例如每天凌晨 2:30 执行):
30 2 * * * /data/mysql/backup/backup.sh >> /data/mysql/backup/backup.log 2>&1 - 检查是否生效:
crontab -l,确认输出中包含刚加的那行 - 注意:crontab 默认 PATH 很窄,脚本里如果调用
mysqldump或docker,最好写全路径(如/usr/bin/mysqldump、/usr/bin/docker),或在脚本开头显式声明:PATH=/usr/local/bin:/usr/bin:/bin
补充建议:增强容灾可靠性
基础方案跑通后,可加几项提升健壮性:
- 上传失败时保留本地备份不删除——把
find ... -delete改成先ls -l记录,或用if scp ...; then find ... -delete; fi控制逻辑 - 远程目录也定期清理,避免磁盘占满,可在同一脚本里追加一条远程清理命令:
ssh root@192.168.50.100 'find /data/mysql/backup/back_dir -mtime +7 -name \"*.sql\" -delete' - 备份成功后发通知(比如用
mail或简单写入系统日志:logger "MySQL backup completed on $(date)")











