脚本自动备份WordPress到Dropbox

数据是无价的,所以博客的备份一定要稳妥,原先丢失过一次数据,虽然没有引起严重后果但也足以让我印象深刻了。WordPress的备份无非三种方式:

  • 插件备份
  • 脚本备份
  • 第三方服务

插件备份 WordPress 无非是最简单的方式,推荐新手使用。插件可以备份博客到 Email 、FTP 或是 Dropbox 。备份到 Email 时,有个小技巧就是邮件标题或内容一般都会有插件名,然后就可以在接受邮箱中添加规则,将标题含有特殊字段的邮件标注已读并移动到 Backup 文件夹,这样也是很好的备份手段。奈何我本身不喜欢插件备份的形式, Email 的附件一般限制大小 25MB,所以就选择了使用脚本备份到 Dropbox 这种更加灵活的方式。这种方法仅限使用在有 SSH 管理权限的主机或空间中,比如 VPS、OpenShift。

使用脚本备份的方法也很简单,分为三个步骤:

  1. 下载设定 Dropbox 脚本
  2. 编辑自动备份脚本
  3. 添加定时运行

一、设定Dropbox脚本

首先需要一个 Dropbox 的账号,如果没有账号可以在这里注册。登录Dropbox,打开https://www.dropbox.com/developers/apps,点击Creat app创建新的app,依次点击Dropbox API、Full Dropbox,app name随便取名,创建成功后进入刚刚创建的app管理页面,能看到App key、App secret后这个地方就完成了。dropbox-app

接着使用 SSH 连接自己的 VPS 主机,进行下列操作:

mkdir backup #创建目录
cd backup #进入目录
wget https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh –no-check-certificate #下载dropbox备份脚本
chmod +x dropbox_uploader.sh #加执行权限
sh dropbox_uploader.sh info #运行脚本

首次运行需要进入之前创建的 app 的设置中生成 token ,之后输入 y 进行确认,会在当前目录下生成 .dropbox_uploader 文件记录 token 值。也就是说,如果你想要其他用户使用这个脚本,需要复制这个文件到其他用户目录下,或者以其他用户身份运行,重新生成一个 token 进行配置。

二、编辑自动备份脚本

需要写一个 shell 脚本,使用顺手的编辑器,在其中粘贴进去以下内容:

$ vim baksite.sh
#!/bin/bash
SCRIPT_DIR=”/home/username/backup” #之前下载的脚本的位置
DROPBOX_DIR=”/backup” #保存到Dropbox中的/backup文件夹
BACKUP_SRC=”/var/www/wordpress/wp-content/uploads” #这个是你想要备份的本地VPS上的文件,不同的目录用空格分开
BACKUP_DST=”/tmp”
MYSQL_SERVER=”localhost”
MYSQL_USER=”root” #这个是你mysql的用户名名称
MYSQL_PASS=”yearliny” #这个是你mysql用户的密码
# 下面的不用改
NOW=$(date +”%Y.%m.%d”)
OLD_DROPBOX_DIR=/backup/$(date -d -30day +%Y.%m.%d)
DESTFILE=”$BACKUP_DST/$NOW.tar.gz”
# 备份mysql数据库并和其它备份文件一起压缩成一个文件
mysqldump -u$MYSQL_USER -h$MYSQL_SERVER -p$MYSQL_PASS --all-databases “$NOW-Databases.sql”
tar cfzP “$DESTFILE” $BACKUP_SRC “$NOW-Databases.sql”
# 用脚本上传到dropbox
$SCRIPT_DIR/dropbox_uploader.sh upload “$DESTFILE” “$DROPBOX_DIR/$NOW.tar.gz”
# 删除本地的临时文件
rm -f “$NOW-Databases.sql” “$DESTFILE”
$SCRIPT_DIR/dropbox_uploader.sh delete “$OLD_DROPBOX_DIR.tar.gz”
echo $NOW “All done!”
chmod +x baksite.sh
sh baksite.sh

保存,使用添加执行权限,就能执行该脚本。这个脚本能够自动保存 WordPress 的文件夹和全部数据库(不止 WordPress 的数据库)打包上传到 Dropbox 的 bakcup 文件夹下,并且自动删除30天前的旧备份文件,避免占用空间。

注意:Windows系统下编辑过脚本文件的话,需要注意一下 Line endings 应设定为 Unix,Sublime Text 编辑器的修改方法如下图所示,其他编辑器自行搜索方法:

当然,即使你在 Windows 系统下编辑的脚本没有配置 Unix,在 Linux 下的 Vim 装满长期下依然可以修改,命令模式下输入 :set fileformat=unix ,然后保存文件即可。

如果想要排除某个文件夹不进行备份,可以修改脚本中的 BACKUP_SRC ,加上 --exclude 参数排除文件夹,需要注意的是 --exclude 参数位置需要在我们要打包目标文件夹参数之前。举个例子,我需要备份 /var/www/wordpress/ 目录,但是要排除 /var/www/wordpress/wp-content/cache 目录,我们可以这么修改脚本:

BACKUP_SRC=”--exclude=/var/www/wordpress/wp-content/cache /var/www/wordpress/” 

OK,一切都会按照我们的预期进行。有个需要注意的细节就是,我们需要排除的 cache 目录需要是绝对路径,并且后面不要加上一个 / 斜杠,免得出现问题。

三、添加定时运行

由于脚本需要 root 权限才能运行,所以需要以 root 身份定时运行脚本。添加下列内容:

sudo crontab -e
0 0 * * * /home/user/backup/backup.sh >>/var/log/sitebak.log

后面的路径修改为之前自己编辑的自动备份脚本的绝对目录位置,保存退出,即可每天零点备份一次博客,并输出每次运行的信息到/var/log/sitebak.log,可谓十分放心~如果你想要自己设定crontab的任务时间,可以查看crontab的用法

注意:test.sh > logtest.sh >>log两种方法所保存的日志是存在差异的,第一种方法只会保存最后一次的运行结果,即最后一次的运行信息和覆盖掉原先的日志。而第二种方法却会记录每次的执行信息到文件最底部。

四、如何恢复备份文件

前面我们已经备份了整个数据库、必要的网站文件以及 Web server 配置,那么等到需要的时候,又该如何恢复呢?

首先需要从 Dropbox 上下载我们之前备份的文件。

./dropbox_uploader.sh download /backup/2017.9.25.tar.gz a.tar.gz

使用脚本的download参数就能把存放到Dropbox中/backup/2017.9.25.tar.gz这个文件下载至当前文件夹并命名为a.tar.gz。

tar -xzvf a.tar.gz

执行上列命令解压压缩包,解压完成后可以使用ll命令查看文件列表,我们的数据安然的在那里,就可以利用他们恢复到之前的样子了。值得一提的是,如果不是迁移到新主机,大多数时候只需要恢复数据库或一部分网站文件,而不需要全部恢复。

数据库

导入数据库非常简单,在 shell 窗口切换至存放备份数据的文件夹,然后只需要执行一行命令。

mysql -u root -p password < databases.sql

其中高亮部分的usernamepassword都替换成自己的 MySQL 账户的用户名和密码,databases则为自己的数据库名称。

网站文件

如果你原先的网站文件在/var/www/html,那么一行命令就可恢复。

sudo mv -rf var/www/html /var/www/html

HTTP服务器的恢复方法和恢复网站文件一致,直接把配置文件移动过去即可。

注意

这里有一个小坑在于我们使用的 Dropbox 脚本使用 curl 上传我们备份的文件,所以上传的文件有多大,就需要占用多大内存。所以请确保你的 VPS 有足够的内存,或者增加 SWAP 空间以防止上传失败。

另外最好定期检查备份文件是否按照我们的预期备份,否则当你需要恢复网站时却没有备份就会后悔终生。

勿忘数据无价。

“脚本自动备份WordPress到Dropbox”的4个回复

  1. API方式适合文件数不多的项目,多的话会比较慢,而且失败率高。
    而且API方式对于一些文件类型,并不能完善判断是否更改,很多直接重新上传了。

    我现在用安装dropbox程序的方式来同步。比较节省流量和时间

    1. 备份的文件是压缩打包好的数据库和网站文件,所以上传的文件数始终是1,至于容易失败,我却没有体会。目前博客内容不多,只使用了过滤垃圾评论插件,所以整个WordPress和数据库也就17M,每天备份一份,留有30份存档,这种备份方式目前来说还是很妥当的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注