一 问题背景
服务器数据如何实现备份同步?本文以服务器数据库数据同步到移动硬盘为例,当然也可以同步给其他服务器,基本思路是一致的。
现状分析如下:
-
一台linux服务器作为数据库服务器,数据在这个目录下,/home/oracle/bak/db。
-
现在我准备插一个移动硬盘到这个服务器上,每天同步数据下载到硬盘里面的db目录下面。
约束条件:
- 需要2个目录保证同步更新
- 服务器关机重启之后也能同步更新
第一步:配置移动硬盘开机自动挂载
如果服务器重启,系统必须能够自动把移动硬盘挂载到指定的位置,否则同步任务会失败。我们通过配置 /etc/fstab 文件来实现
1 插入硬盘,并找到它的UUID和文件系统类型
使用 blkid 命令来查找。UUID是硬盘的唯一标识符,比设备名(如 /dev/sdb1)更可靠,因为设备名可能会变化
bash
blkid
输出中有:
/dev/sdc1: UUID="7a7ca6e9-5836-42cb-9d7e-d6d2adb6a5ca" TYPE="exfat"
显示了这个设备,还有格式
2 创建挂载点
这个目录将是硬盘在系统中的"家"。我们创建 /mnt/backup_disk 作为挂载点
bash
mkdir -p /mnt/backup_disk
3 编辑 /etc/fstab 文件
bash
vim /etc/fstab
在文件末尾添加一行,格式如下。请将 你的UUID、你的文件系统类型 替换成第一步中记下的信息。
bash
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=你的UUID /mnt/backup_disk 你的文件系统类型 defaults,nofail 0 2
nofail:这个选项非常重要,它保证即使插入硬盘失败,服务器也能正常启动,不会卡住。
举例:如果你的是 ext4 格式,这行可能是 UUID=1234-5678 /mnt/backup_disk ext4 defaults,nofail 0 2。
4 测试挂载配置
bash
mount -a
如果没有输出信息,说明配置成功。你可以用 df -h | grep backup_disk 检查硬盘是否已经挂载上。
如果失败,继续尝试上面步骤。保证硬盘挂载成功。
第二步:编写同步脚本
使用 rsync 命令,它是 Linux 下最常用的同步工具,特点是可以增量同步,只传输变化的部分,非常高效
1 创建脚本文件
bash
sudo vim /usr/local/bin/sync_oracle_backup.sh
2 写入脚本内容
确保源目录路径是你的数据目录,目标目录是挂载点下的 db 文件
bash
#!/bin/bash
# 源目录 (Oracle 备份目录)
SOURCE_DIR="/home/oracle/bak/db/"
# 目标目录 (移动硬盘上的目录)
DEST_DIR="/mnt/backup_disk/db/"
# 日志文件
LOG_FILE="/var/log/oracle_backup_sync.log"
# 检查移动硬盘是否挂载,如果没有则尝试挂载
if ! mountpoint -q /mnt/backup_disk; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:移动硬盘未挂载,尝试挂载..." >> $LOG_FILE
mount /mnt/backup_disk
# 再次检查
if ! mountpoint -q /mnt/backup_disk; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:挂载失败,退出同步。" >> $LOG_FILE
exit 1
fi
fi
# 在移动硬盘上创建目标目录(如果不存在)
mkdir -p "$DEST_DIR"
# 执行 rsync 同步
# -a 归档模式,保留权限、时间戳等属性
# -v 显示详细信息
# --delete 删除目标端有但源端没有的文件,使两边完全一致
echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始同步..." >> $LOG_FILE
rsync -av --delete "$SOURCE_DIR" "$DEST_DIR" >> $LOG_FILE 2>&1
# 检查 rsync 命令是否成功
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - 同步成功完成。" >> $LOG_FILE
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - 同步过程中出现错误。" >> $LOG_FILE
fi
echo "----------------------------------------" >> $LOG_FILE
--delete 选项说明:这个选项会让目标目录(移动硬盘)完全镜像源目录。也就是说,如果源目录删除了某个文件,下次同步时,移动硬盘上的对应文件也会被删除。如果你不希望这样,可以去掉这个参数。
3 赋予脚本执行权限
bash
sudo chmod +x /usr/local/bin/sync_oracle_backup.sh
4 手动执行一次测试
bash
sudo /usr/local/bin/sync_oracle_backup.sh
然后检查日志 /var/log/oracle_backup_sync.log 或目标目录,看看是否成功。
手动执行需要一定的时间,需要命令执行完后才能检查
第三步:设置定时任务 (cron)
使用 cron 服务来让脚本每天自动运行
1 编辑 root 用户的 crontab
bash
sudo crontab -e
因为脚本中涉及到挂载等操作,使用 root 权限执行最稳妥。
2 添加定时任务
在文件末尾添加一行,指定执行时间。下面的例子是每天凌晨 2:00 执行脚本
bash
0 2 * * * /usr/local/bin/sync_oracle_backup.sh
时间说明:0 2 * * * 代表每天2:00。你可以根据需要调整,比如 0 */6 * * * 代表每6小时一次。
保存并退出(wq),cron 会自动加载新任务