最近更新于 2024-08-12 08:53
环境
需要备份的服务器(A):Ubuntu 22.04 x86_64
用于存储备份的服务器(B):Ubuntu 22.04 x86_64
A 服务器是基于 LNMP 搭建的 WordPress,B 服务器是我自己闲置的服务器。备份思路是在 A 服务器创建一个脚本实现导出数据库和打包 WordPress 文件的操作,然后通过 ssh 将文件传输到远程服务器(注意会消耗服务器上传流量)。ssh 连接通过秘钥验证,具体配置参考:https://blog.iyatt.com/?p=4060
也不一定必须要两台服务器,借助 ssh 备份到本地也行。比如使用类似 Frp 的工具,实现本地设备内网穿透到需要备份的服务器,通过访问需要备份的服务器就能访问到本地设备,这样要备份的服务器只需要向自己发起 ssh 连接,间接连接到本地,就能往本地发送文件了。Frp 配置参考:https://blog.iyatt.com/?p=3821
操作
我这里的操作都是使用的 root 用户
A 服务器创建脚本
在家目录(或自定义目录)下创建文件文件,这里命名为 backup.sh,写入内容参考下面(数据库用户、密码、WordPress 数据库名、B 服务器用户、地址等需要根据实际情况自己修改)
#/usr/bin/env bash
getTime()
{
date '+%Y-%m-%d %H:%M:%S'
}
cd ~
# 删除所有以前的导出文件
rm -rf wordpress*
echo ""
# 导出数据库
echo "$(getTime) 开始导出数据库"
mysqldump -u root --password="" wordpress_db > wordpress_db.sql # MySQL:用户名 root,无密码,WP 数据库名 wordpress_db
# 复制 WordPress 目录到家目录下
echo "$(getTime) 开始复制 WordPress"
cp -r /var/www/wordpress ~/wordpress # WP 安装路径 /var/www/wordpress
# 打包文件,下面三选一
echo "$(getTime) 开始打包 WordPress"
# tar cf wordpress.tar wordpress/ # 直接打包,文件最大,打包速度最快
tar czf wordpress.tar.gz wordpress/ # 压缩为 gzip
# tar cjf wordpress.tar.bz2 wordpress/ # 压缩为 bz2,文件最小,一般比 gzip 可能也小不了多少
# 在远程服务器上创建一个日期时间命名的文件夹
dir="~/"$(date +"%Y%m%d-%H%M%S")
ssh -i "~/.ssh/aliyun" "root@3.12.45.92" "mkdir $dir" # B 服务器私钥路径在 A 服务器上的位置:~/.ssh/aliyun,B 服务器用户名:root,B 服务器地址:3.12.45.92
# 传输文件到远程服务器
echo "$(getTime) 开始传输文件"
scp -i "~/.ssh/aliyun" ~/wordpress_db.sql "root@3.12.45.92:$dir" # 数据库文件 ~/wordpress_db.sql
scp -i "~/.ssh/aliyun" ~/wordpress.tar.gz "root@3.12.45.92:$dir" # WordPress 文件 ~/wordpress.tar.gz
echo "$(getTime) 结束"
创建好 shell 脚本文件以后,为脚本添加可执行权限
chmod a+x ~/backup.sh
上面脚本会在远程服务器连接的用户的家目录下创建日期时间命名的文件夹,并把备份的 WP 和数据库文件传输进去。
A 服务器创建定时任务
执行
crontab -e
首次使用 cron 自行选择一种文本编辑器确认(没用过 vim 的不要选 vim,不知道命令的用不了,nano 编辑器底部有操作说明,更适合新手)
编辑格式参考:
每天 13:33 执行一次 /root/backup.sh > /root/backup.log(执行 backup.sh 同时将输出内容保存到 /root/backup.log【作为日志】,一个 > 是覆盖写入,>> 是追加写入)
要设置其它条件,自行查阅 crob 设置方法