如何利用简单脚本实现自动化定时备份,省下几十美元

2024年4月12日
Share

在数字化时代,数据是企业的核心资产之一。无论是客户信息、财务记录还是业务关键的项目文件,数据的安全和完整性对企业来说至关重要。不幸的是,数据丢失的情况比想象中更为常见,其原因包括硬件故障、软件错误、人为操作失误甚至是自然灾害等。例如,一家中型企业因服务器硬盘损坏且未及时备份,导致了价值数十万美元的数据永久丢失,严重影响了业务运营和客户信任。

因此,定期备份数据不仅是一个良好的业务实践,它还能防止在遭遇不可预测的灾难时发生不可挽回的损失。下面,我将指导即便是计算机操作经验较少的用户如何通过一个简单的脚本来设置自动化的服务器备份。

1. 环境准备和脚本概述

在开始之前,确保你有两台服务器:一台是主要工作服务器(服务器A),另一台用作备份(服务器B)。你将需要服务器B的IP地址、SSH用户名和访问端口。

2. 脚本编写

脚本的第一部分包括定义一系列变量,这些变量将用于指定源数据的位置、备份存放的位置、服务器的连接细节等。

#!/bin/bash

# 源目录,即服务器A上需要备份的数据目录
SRC_DIR="/docker/data"

# 目标目录,即服务器B上将存放备份数据的目录
DST_DIR="/root/data/backup"

# 服务器B的IP地址
SERVER_B_IP="your_server_b_ip"

# 服务器B的SSH用户名
SSH_USER="your_ssh_username"

# 服务器B的SSH端口
SSH_PORT="22"

# 备份文件前缀
BACKUP_NAME_PREFIX="docker_data_backup"

# 压缩文件格式
ARCHIVE_FORMAT="tar.gz"

3. 自动生成备份文件名

备份文件名包含日期和时间,确保每个备份文件都是独一无二的,从而避免覆盖之前的备份。

# 生成备份文件名
current_date=$(date +"%Y%m%d_%H%M%S")
backup_filename="${BACKUP_NAME_PREFIX}_${current_date}.${ARCHIVE_FORMAT}"

4. 压缩源目录

使用 tar 命令压缩指定的源目录。这一步是准备将文件传输到备份服务器前的必要步骤。

# 压缩源目录
tar -czf "${backup_filename}" -C "${SRC_DIR}" .

5. 传输备份文件到服务器B

通过 scp 命令安全地将备份文件从服务器A传输到服务器B。

# 传输备份文件到服务器B
scp -P "${SSH_PORT}" "${backup_filename}" "${SSH_USER}@${SERVER_B_IP}:${DST_DIR}"

6. 清理和维护

在备份完成后,删除服务器A上的本地备份文件,并在服务器B上保留最新的三个备份,删除其余旧文件。

# 删除本地备份文件
rm -f "${backup_filename}"

# 保留最多3个备份文件
ssh -p "${SSH_PORT}" "${SSH_USER}@${SERVER_B_IP}" "ls -t ${DST_DIR}/${BACKUP_NAME_PREFIX}* | tail -n +4 | xargs --no-run-if-empty rm -f"

使用chmod命令为脚本添加可执行权限

chmod +x backup.sh

接下来,我们需要在A服务器上安装并配置SSH免密登录到B服务器。请在A服务器上执行以下命令

# 安装sshpass(如已安装,请忽略)
sudo apt-get install sshpass

# 生成SSH密钥
ssh-keygen -t rsa -b 4096

# 一路回车即可

# 将公钥复制到B服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 服务器端口 user@B服务器IP地址

可以检测一下,A服务器直接用ssh -p 服务器端口 user@B服务器IP地址是否可以免密登录B服务器,如果可以,说明可以继续下一步。使用crontab -e命令打开服务器A上的cron配置:

crontab -e

在打开的cron配置文件中,添加以下一行内容以设置每天早上4点30分执行backup.sh脚本。请确保将/path/to/backup.sh替换为实际的脚本文件路径。

30 4 * * 1 /root/backup.sh

这条命令的含义是:在每周一的4点30分,执行 /root/backup.sh 脚本。并将/docker/data目录压缩备份到服务器B的/root/data/backup目录下,同时保留最多3份备份。

如果修改了服务器的时区,最好还是重启下 服务,不然不会生效

sudo service cron restart  //重启服务

sudo systemctl stop cron.service //停止服务