服务器数据如何实现备份同步?

一 问题背景

服务器数据如何实现备份同步?本文以服务器数据库数据同步到移动硬盘为例,当然也可以同步给其他服务器,基本思路是一致的。

现状分析如下:

  1. 一台linux服务器作为数据库服务器,数据在这个目录下,/home/oracle/bak/db。

  2. 现在我准备插一个移动硬盘到这个服务器上,每天同步数据下载到硬盘里面的db目录下面。

约束条件:

  1. 需要2个目录保证同步更新
  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 会自动加载新任务

相关推荐
lucia_zl2 小时前
linux收集进程性能数据
linux·运维·chrome
董可伦2 小时前
Flink DataStream2Table 总结
服务器·python·flink
Cc琎2 小时前
api接口分布在多台服务器, 如何同步用户的每日请求次数
java·运维·服务器·redis·php
小码吃趴菜2 小时前
服务器预约系统linux小项目-第一节课
运维·服务器
搬山境KL攻城狮3 小时前
ssh密钥对使用
运维·ssh
道亦无名4 小时前
Linux下是STM32的编译修改配置文件tensorflow
linux·运维
Azure DevOps4 小时前
Azure DevOps Server:2026年3月份补丁
运维·microsoft·azure·devops
User_芊芊君子10 小时前
影音自由新玩法:Plex+cpolar 解锁异地访问,告别网盘限速烦恼
服务器·nginx·测评
wanhengidc10 小时前
云手机的运行环境如何
运维·服务器·游戏·智能手机·生活