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

一 问题背景

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

现状分析如下:

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

相关推荐
木头左2 小时前
【Nginx】内网服务源 IP 白名单实战:动态域名解析放行网段 + 端口接管零改造
运维·nginx·白名单·反向代理
禁默3 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk81633 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
翔云1234564 小时前
RocksDB中,客户端每写入一次数据,需要访问几次磁盘
运维·数据库·mysql
爱莉希雅&&&5 小时前
GitLab 完整学习笔记
linux·运维·服务器
小杨爱科普7 小时前
制造业上自动化改造,改造部分的专利到底归谁
运维·经验分享·自动化
陈希1237 小时前
Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位
linux·服务器·网络
方便面不加香菜8 小时前
Docker Container --容器及容器的操作案例详解
运维·docker·容器
测试界的小码农10 小时前
【Linux 命令实战(03):文件创建、复制、移动与删除,掌握 touch、mkdir、cp、mv、rm】
linux·服务器·php
|_⊙11 小时前
网络层协议 IP
服务器·网络·tcp/ip