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

一 问题背景

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

现状分析如下:

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

相关推荐
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
AI职业加油站1 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏1 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
-梅1 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog1 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发
张洛闻Eren1 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
琥珀色糖1 天前
SimlpeHttp
linux·服务器
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
第十人i1 天前
Linux 日志管理系统:journald 配置与优化
linux·服务器
布裘1 天前
【银河麒麟】V4桌面图标消失,右击鼠标没反应排查
运维·银河麒麟·桌面环境