网站数据备份

接上一篇【Typecho迁移】

我们完成了数据的保存,但是不可能每次都 依赖我们手动去备份,这里使用数据同步工具rsync 以及cron

来自动化完成数据的备份

rsync 是一个用于文件和目录同步的强大工具。它在 Unix-like 系统上广泛使用,特别是在数据备份和远程文件传输场景中。以下是关于 rsync 的详细介绍:

1. 主要特点:

  • 效率rsync 只传输文件的差异部分,而不是整个文件。这使得同步非常高效,特别是当文件已经存在但只有少量更改时。
  • 多种传输方式:可以在本地文件系统之间进行同步,也可以在本地和远程服务器之间进行同步。默认情况下,rsync 使用 rsh 进行远程同步,但也可以配置为使用 SSH,从而增加安全性。
  • 保留文件属性rsync 可以保留文件的权限、时间戳、所有者和组,这使得备份和恢复更为准确。
  • 压缩和解压缩:在传输过程中,rsync 可以压缩数据以减少网络带宽的使用,并在目标端进行解压缩。
  • 删除选项:可以配置 rsync 在目标目录中删除那些在源目录中不存在的文件,从而确保两个位置完全同步。

2. 常见用途:

  • 备份rsync 是一个流行的备份工具,可以用来创建文件和目录的完整备份或增量备份。
  • 镜像:可以使用 rsync 创建网站或文件服务器的镜像。
  • 迁移:当迁移数据到新的硬盘或服务器时,rsync 是一个非常有用的工具。
  • 分发:对于需要将文件或软件分发到多个位置的组织,rsync 是一个理想的解决方案。

3. 安全性:

虽然 rsync 本身不提供端到端的加密,但它可以与 SSH 一起使用,从而提供安全的远程同步功能。此外,rsync 还支持使用 rsync daemon 进行同步,该守护进程可以配置为使用密码进行身份验证。

4. 其他特性:

  • 排除模式:可以指定某些文件或目录不进行同步。
  • 硬链接和符号链接支持rsync 可以识别和处理硬链接和符号链接。
  • 进度显示:可以显示同步过程中的进度和速度。

总的来说,rsync 是一个非常灵活和强大的工具,适用于各种文件同步和传输需求。其简单的命令行界面和丰富的选项使其成为系统管理员和开发人员的首选工具。

安装 rsync

在大多数 Linux 发行版中,你可以使用包管理器来安装 rsync

  • Debian/Ubuntu:

    sudo apt-get update
    sudo apt-get install rsync

过程:使用宝塔定时任务每天备份数据到指定文件夹下,再将备份数据利用自动化脚本每天发送到另一台服务器保存

image-20230916211457205

我们的目的

A主机站点文件/www/backup/site备份到B站点/Blog_backup/websit
A主机数据库文件/www/backup/database备份到B站点/Blog_backup/database

安装ssh

安装ssh的目的在于我们要免密操作B主机

确保两台主机都已安装 SSH 客户端 和 服务器(默认有)

  • Debian/Ubuntu:
sudo apt-get update
sudo apt-get install openssh-client openssh-server

启动 SSH 服务(在主机B上)

sudo systemctl start sshd
sudo systemctl enable sshd

配置 SSH 公钥身份验证(推荐)

为了无密码登录,可以在主机A上为 SSH 创建公钥/私钥对,并将公钥复制到主机B。

  • 在主机A上生成密钥对(如果尚未生成):这个命令是用来生成新的公钥/私钥对的
ssh-keygen

会提示输入保存路径 输入enter默认保存/root/.ssh/id_rsa.pub

接着会提示输入私钥密码,回车则是不配置

  • 查看公钥
cat /root/.ssh/id_rsa.pub
  • 将主机A的公钥复制到主机B:
ssh-copy-id [email protected]

这会要求输入主机B上用户的密码。完成后,应该能够从主机A无密码登录到主机B。

验证是否可以通过ssh无密码登陆到主机:

ssh [email protected]

如果一切设置正确,你应该能够在不输入密码的情况下登录到远程服务器。但是,为了安全起见,确保检查远程服务器上的 ~/.ssh/authorized_keys 文件,以确保只有你想要的密钥被添加

要从SSH会话中退出,你可以使用以下方法:

输入 exit 命令:

编写脚本来测试备份

将A站点的备份文件/www/backup/site保存到B站点/Blog_backup/websit

A站点数据库的备份文件/www/backup/database保存到B站点/Blog_backup/database

模板文件如下(A主机运行):

transfer_backup.sh

#!/bin/bash

# A站点的备份文件路径
SITE_BACKUP_PATH="/www/backup/site"
DATABASE_BACKUP_PATH="/www/backup/database"

# B站点的目标路径
REMOTE_SITE_TARGET="user@B_site_address:/Blog_backup/website"
REMOTE_DATABASE_TARGET="user@B_site_address:/Blog_backup/database"

# 使用rsync传输文件
rsync -avz $SITE_BACKUP_PATH/ $REMOTE_SITE_TARGET
rsync -avz $DATABASE_BACKUP_PATH/ $REMOTE_DATABASE_TARGET

注意,冒号 : 是用来分隔SSH目标地址和远程路径的。确保冒号后面直接跟着远程服务器上的路径。

REMOTE_SITE_TARGET="[email protected]:/Blog_backup/website"
REMOTE_DATABASE_TARGET="[email protected]:/Blog_backup/database"

注意:

  1. 替换user为B站点的用户名。
  2. 替换B_site_address为B站点的IP地址或域名。
  3. 为了使脚本工作,A站点的SSH公钥应该已经添加到B站点的~/.ssh/authorized_keys文件中,这样脚本在执行时不会要求输入密码。
  4. 脚本中的-avz参数表示归档模式、详细输出和压缩数据。

保存上述脚本到一个文件,例如transfer_backup.sh,然后给它执行权限:

chmod +x transfer_backup.sh

现在,可以运行脚本来传输备份文件:

./transfer_backup.sh

这个脚本将A站点的备份文件同步到B站点的指定目录。

以上测试成功

定时任务执行

需求:编写一个自动化脚本让他运行,每1分钟备份一次

要每1分钟自动运行脚本,你可以使用 cron,一个Unix系统上的定时任务调度程序。

以下是如何设置 cron 任务来每1分钟运行你的备份脚本:

  1. 打开cron配置

    输入以下命令:

    crontab -e

    这将打开一个编辑器,允许你为当前用户添加或修改cron任务。

  2. 添加新的cron任务

    在编辑器的底部,添加以下行:

    * * * * * /transfer_backup.sh

    这表示每分钟都会运行 /Backup_script/transfer_backup.sh 脚本。

* * * * * /Backup_script/transfer_backup.sh 这样写为什么是一分钟?

cron的语法中,每一行都代表一个定时任务,而每行中的五个星号分别代表:

  1. 分钟 (0 - 59)
  2. 小时 (0 - 23)
  3. 一个月中的某天 (1 - 31)
  4. 月份 (1 - 12)
  5. 一周中的某天 (0 - 7)(0和7都代表星期日)

当你写 * * * * *,这意味着:

  • 每分钟
  • 每小时
  • 每天
  • 每月
  • 每周的某一天

因此,它每分钟都会运行。

如果你想要每小时的第30分钟运行脚本,你会写:

30 * * * * /path/to/script.sh

如果你想要每天中午12点运行脚本,你会写:

0 12 * * * /path/to/script.sh

所以,* * * * * 的意思就是“每当时间变化时都运行”,这就是为什么它每分钟都会运行的原因。

编写自动化脚本,以分钟为单位输入选择

#!/bin/bash

# 获取当前脚本的目录
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 询问用户每隔多少分钟运行脚本
read -p "每隔多少分钟你想运行备份脚本? " interval

# 检查输入是否为数字
if ! [[ "$interval" =~ ^[0-9]+$ ]]; then
    echo "错误: 请输入一个有效的数字。"
    exit 1
fi

# 添加到cron
(crontab -l; echo "*/$interval * * * * $DIR/transfer_backup.sh") | crontab -

echo "备份脚本现在将每隔 $interval 分钟运行一次。"

保存上述脚本到文件备份脚本同目录,例如setup_cron.sh,然后给它执行权限:

chmod +x setup_cron.sh

运行脚本:

./setup_cron.sh

当运行这个脚本时,它会询问每隔多少分钟想运行备份脚本。输入一个数字,例如5,那么备份脚本将每隔5分钟运行一次。

注意:这个脚本会将新的cron任务添加到现有的cron任务中,而不会覆盖它们。如果你多次运行这个脚本,它会多次添加任务。如果需要修改或删除任务,请使用crontab -e命令。

image-20230917001545878

rsync 是一个增量数据传输工具,它只传输文件之间的差异,而不是每次都传输整个文件。这意味着如果你已经传输了一个文件,并且该文件在下一次运行 rsync 时没有发生变化,那么该文件不会再次被传输。 虽然我们设置1分钟备份一次,但如果数据没变化是不会备份的

停止脚本

如果你想要结束正在前台执行的上述脚本,你可以简单地按 Ctrl + C 来中断它。

但如果你想从 cron 中删除由上述脚本添加的任务,你可以创建一个新的脚本来实现这一点。以下是一个简单的脚本,用于从 cron 中删除特定的任务:

一旦你设置了cron任务,该任务会在后台由cron守护进程管理,与你是否登录到服务器无关。

即使你从SSH会话中退出,只要服务器仍在运行,cron任务仍会按照你设置的时间间隔执行。

这就是为什么cron非常适合定期执行任务,如备份、更新或其他自动化任务,因为它不依赖于用户保持登录或交互式会话。

所以我们要结束该脚本就必须使用主动结束

编写一个新脚本结束该任务

#!/bin/bash

# 获取当前脚本的目录
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 删除与transfer_backup.sh相关的cron任务
crontab -l | grep -v "$DIR/transfer_backup.sh" | crontab -

echo "已删除与transfer_backup.sh相关的cron任务。"

保存上述脚本到一个文件,例如 remove_cron_job.sh,然后给它执行权限:

chmod +x remove_cron_job.sh

运行脚本:

./remove_cron_job.sh

这将从 cron 中删除与 transfer_backup.sh 相关的任务。

实际应用:

我的博客数据每天四点多备份,

image-20230917003620740

为了方便我们自定义脚本运行时间

#!/bin/bash

# 获取当前脚本的目录
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 询问用户选择执行的时间单位
while true; do
    echo "请选择你想按照哪个时间单位执行备份脚本:"
    echo "1. 分钟"
    echo "2. 小时"
    echo "3. 天"
    read -p "请输入序号 (1/2/3): " choice

    case $choice in
        1) unit="分钟"; break ;;
        2) unit="小时"; break ;;
        3) unit="天"; break ;;
        *) echo "错误: 请输入有效的序号 (1, 2, 或 3)。" ;;
    esac
done

# 询问用户每隔多少时间单位执行
while true; do
    read -p "每隔多少$unit你想运行备份脚本? " interval

    # 检查输入是否为数字
    if [[ "$interval" =~ ^[0-9]+$ ]]; then
        case $unit in
            分钟) [[ $interval -ge 1 && $interval -le 59 ]] && break || echo "错误: 请输入一个在1到59之间的数字。" ;;
            小时) [[ $interval -ge 1 && $interval -le 23 ]] && break || echo "错误: 请输入一个在1到23之间的数字。" ;;
            天) [[ $interval -ge 1 && $interval -le 31 ]] && break || echo "错误: 请输入一个在1到31之间的数字。" ;;
        esac
    else
        echo "错误: 请输入一个有效的数字。"
    fi
done

# 根据用户选择的时间单位设置cron
case $unit in
    分钟) cron_time="*/$interval * * * *";;
    小时) cron_time="0 */$interval * * *";;
    天) cron_time="0 0 */$interval * *";;
esac

# 添加到cron
(crontab -l; echo "$cron_time $DIR/transfer_backup.sh") | crontab -

echo "备份脚本现在将每隔 $interval $unit 运行一次。"

image-20230917005446461

如果觉得我的文章对你有用,请随意赞赏