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

一 问题背景

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

现状分析如下:

  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 会自动加载新任务

相关推荐
测试修炼手册4 小时前
[测试工具] 用 Codex 做测试实战:从需求分析到自动化用例落地
运维·自动化·需求分析
米高梅狮子4 小时前
03.网络类服务实践
linux·运维·服务器·网络·kubernetes·centos·openstack
June`5 小时前
网络编程时内核究竟做了什么???
linux·服务器·网络
原来是猿5 小时前
腾讯云服务器端口开放完全指南
服务器·网络·腾讯云
你的保护色5 小时前
【无标题】
java·服务器·网络
Elnaij5 小时前
Linux系统与系统编程(9)——自设计shell与基础IO
linux·服务器
IpdataCloud6 小时前
稳定的企业级IP数据接口怎么选?可用性指标+离线库高可用方案
运维·网络·tcp/ip
WebGIS开发6 小时前
地信职业百科②:GIS运维
运维·gis·就业·转行
淘矿人6 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
JiaWen技术圈6 小时前
nginx 安全响应头 介绍
运维·nginx·安全