做一个站点,都必须考虑备份的问题,因为自己在维护上可能会有疏忽,VPS 的提供商也可能在没有预兆的情况下发生各种意外,甚至站点也可能受到攻击,从而导致网站的资料丢失。对于 WordPress 站点来说,最重要的就是数据库和 WordPress 程序,而 Apache2 和 MySQL 的配置文件,最好也备份一下。
当然,网上有很多文章介绍 WordPress 站点的备份和恢复方法,但是本人觉得都不尽如人意。在对一些资料进行了综合之后,本人采用了这样的方法对自己的 WordPress 站点进行备份,即:将 WordPress 数据库、WordPress 程序、Apache2 配置文件、MySQL 配置文件的备份相关的命令放在一个脚本中让其定时自动运行;再从要用于存储备份文件的 VPS 上将其下载,并存放到特定路径(而这也通过脚本的形式自动运行来完成)。本文可能会让某些人觉得没什么新东西,我也觉得确实如此。如果不妥之处,敬请指教,请勿吐槽。
Part Ⅰ. 站点所在 VPS
(A) 备份数据库。很多文章都介绍了用诸如 BackWPup、BackupToDropbox、BackUpWordpress 之类的插件进行定时自动备份,但是这仅仅是对于数据库而已。我尝试过通过 BackWPup 将数据库定时备份并发送到邮箱。邮件是能收到,但是总是提示文件太大,无法发送。我想,如果备份到 Dropbox 等网盘的话,不知是否有办法自动删除较旧的文件,从而避免网盘空间被逐步填满殆尽。其实,用 MySQL 的 mysqldump 命令导出数据库即可。该命令可以将数据库导出为压缩文件,也可以导出为sql文件,可以导出所有数据库为一个文件,也可以导出单个或几个数据库分别备份(假设)。可以在文件名中加入当前日期(`date +%y%m%d`)。
注意:为了从其他 VPS 上下载,需要将这些文件放在站点目录。为了后面自动删除文件的方便,请将文件名中仅日期不同的文件放在同一目录(当然,需要事先手动创建好各个目录)。比如,下面的命令就将 whole.XXXXXX.sql.gz(XXXXXX为日期)放在 /var/www/backup/sql/whole 目录。
# 将全部数据库导出为压缩文件
mysqldump -uroot --all-databases |gzip > /var/www/backup/databases/whole_compressed/whole.`date +%y%m%d`.sql.gz
# 将全部数据库导出为 sql 文件
mysqldump -uroot --all-databases > /var/www/backup/databases/whole_sql/whole.`date +%y%m%d`.sql
# 将 WordPress 的数据库导出为压缩文件(假设数据库的名称为 mywp)
mysqldump -uroot --databases mywp |gzip > /var/www/backup/databases/mywp_sql/mywp.`date +%y%m%d`.sql.gz
# 将 WordPress 的数据库导出为 sql 文件
mysqldump -uroot --databases mywp > /var/www/backup/databases/mywp_sql/mywp.`date +%y%m%d`.sql
另外由于 mysqldump 命令需要输入密码,所以为了能让该命令自动执行,需要在与存放该命令所在脚本的同一目录创建一个 .my.cnf 文件,在其中输入如下内容:
[mysqldump]
user=username // MySQL 用户名
password=password // 上述 MySQL 用户的密码
(B) 备份 WordPress 程序以及 Apache2 和 MySQL 的配置文件。在此之前,请确保安装了 zip。若没有,就安装:apt-get install zip 。这里假设 WordPress 是单独放在一个目录(/var/www/wordpress)中。
zip -r /var/www/backup/wordpress/wordpress.`date +%y%m%d`.zip /var/www/wordpress/*
zip -r /var/www/backup/apache2/apache2.`date +%y%m%d`.zip /etc/apache2/*
zip -r /var/www/backup/mysql/mysql.`date +%y%m%d`.zip /etc/mysql/*
注意,zip、cp、mv 会覆盖现有同名文件,而 wget 会保留多个文件。
(C) 删除超过一定数量时最旧的文件。之前我想过删除一定天数之前产生的文件。但是后来发现这样是不行的,如果如果站点发生意外的天数已经超过这个设定的天数,那么就有可能在这个天数范围内,没有备份文件产生,于是一旦超过该天数,备份文件就会被一删而空,备份也就失去了意义。于是,就考虑保留一定数量的文件,而删除最旧的。
将名称中仅日期不同的文件放在同一目录,通过ls命令计算目录中文件的数量和选取最旧的那个文件,通过if条件语句来判断文件数量是否超过设定值,于是 “当whole_compressed目录中的文件数量大于3时,删除最旧的文件” 的语句如下:
if [ $(ls -l /var/www/backup/databases/whole_compressed |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /var/www/backup/databases/whole_compressed/* | tail -1)
fi
其他6个目录如法炮制。
(D) 将以上各命令置于一个脚本文件中(姑且称为脚本吧),比如 /root/backup.sh。其内容如下:
#!/bin/sh
mysqldump -uroot --all-databases --events |gzip > /var/www/backup/databases/whole_compressed/whole.`date +%y%m%d`.sql.gz
mysqldump -uroot --all-databases --events > /var/www/backup/databases/whole_sql/whole.`date +%y%m%d`.sql
mysqldump -uroot --databases mywp |gzip > /var/www/backup/databases/mywp_compressed/mywp.`date +%y%m%d`.sql.gz
mysqldump -uroot --databases mywp > /var/www/backup/databases/mywp_sql/mywp.`date +%y%m%d`.sql
zip -r /var/www/backup/wordpress/wordpress.`date +%y%m%d`.zip /var/www/wordpress/*
zip -r /var/www/backup/apache2/apache2.`date +%y%m%d`.zip /etc/apache2/*
zip -r /var/www/backup/mysql/mysql.`date +%y%m%d`.zip /etc/mysql/*
if [ $(ls -l /var/www/backup/databases/whole_compressed |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /var/www/backup/databases/whole_compressed/* | tail -1)
fi
if [ $(ls -l /var/www/backup/databases/whole_sql |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /var/www/backup/databases/whole_sql/* | tail -1)
fi
if [ $(ls -l /var/www/backup/databases/mywp_compressed |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /var/www/backup/databases/mywp_compressed/* | tail -1)
fi
if [ $(ls -l /var/www/backup/databases/mywp_sql |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /var/www/backup/databases/mywp_sql/* | tail -1)
fi
if [ $(ls -l /var/www/backup/apache2 |grep "^-"|wc -l) -gt 3 ]; then
if [ $(ls -l /var/www/backup/wordpress |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /var/www/backup/wordpress/* | tail -1)
fi
rm $(ls -t /var/www/backup/apache2/* | tail -1)
fi
if [ $(ls -l /var/www/backup/mysql |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /var/www/backup/mysql/* | tail -1)
fi
(E) 脚本的定时自动运行。执行 crontab -e
,在打开的文件末尾加入如下一行,表示每天凌晨两点自动运行 /root/backup.sh。
0 2 * * * sh /root/backup.sh
Part Ⅱ. 存放备份文件的 VPS
为了备份在多处,这样的 VPS 可以不止一个。这里需要通过 wget 从站点所在的 VPS 下载备份文件,再移动到存放备份文件的目录。
这里的 /root/back.sh 文件的内容大致如下:
#!/bin/sh
wget http://站点域名/backup/databases/whole_compressed/whole.`date +%y%m%d`.sql.gz
mv whole.`date +%y%m%d`.sql.gz /root/backup_XXX/databases/whole_compressed/whole.`date +%y%m%d`.sql.gz
wget http://站点域名/backup/databases/whole_sql/whole.`date +%y%m%d`.sql
mv whole.`date +%y%m%d`.sql/root/backup_XXX/databases/whole_sql/whole.`date +%y%m%d`.sql
wget http://站点域名/backup/databases/mywp_compressed/mywp.`date +%y%m%d`.sql.gz
mv mywp.`date +%y%m%d`.sql.gz /root/backup_XXX/databases/mywp_compressed/mywp.`date +%y%m%d`.sql.gz
wget http://站点域名/backup/databases/mywp_sql/mywp.`date +%y%m%d`.sql
mv mywp.`date +%y%m%d`.sql /root/backup_XXX/databases/mywp_sql/mywp.`date +%y%m%d`.sql
wget http://站点域名/backup/wordpress/wordpress.`date +%y%m%d`.zip
mv wordpress.`date +%y%m%d`.zip /root/backup_XXX/databases/wordpress/wordpress.`date +%y%m%d`.zip
wget http://站点域名/backup/apache2/apache2.`date +%y%m%d`.zip
mv apache2.`date +%y%m%d`.zip /root/backup_XXX/apache2/apache2.`date +%y%m%d`.zip
wget http://站点域名/backup/mysql/mysql.`date +%y%m%d`.zip
mv mysql.`date +%y%m%d`.zip /root/backup_XXX/mysql/mysql.`date +%y%m%d`.zip
if [ $(ls -l /var/www/backup_XXX/databases/whole_compressed |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /root/backup_XXX/databases/whole_compressed/* | tail -1)
fi
if [ $(ls -l /root/backup_XXX/databases/whole_sql |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /root/backup_XXX/databases/whole_sql/* | tail -1)
fi
if [ $(ls -l /root/backup_XXX/databases/mywp_compressed |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /root/backup_XXX/databases/mywp_compressed/* | tail -1)
fi
if [ $(ls -l /root/backup_XXX/databases/mywp_sql |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /root/backup_XXX/databases/mywp_sql/* | tail -1)
fi
if [ $(ls -l /root/backup_XXX/apache2 |grep "^-"|wc -l) -gt 3 ]; then
if [ $(ls -l /root/backup_XXX/wordpress |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /root/backup_XXX/wordpress/* | tail -1)
fi
rm $(ls -t /root/backup/apache2/* | tail -1)
fi
if [ $(ls -l /root/backup_XXX/mysql |grep "^-"|wc -l) -gt 3 ]; then
rm $(ls -t /root/backup_XXX/mysql/* | tail -1)
fi
执行 crontab -e,在其中加入如下一行,使 /root/backup.sh 每天凌晨三点自动运行。
0 3 * * * sh /root/backup.sh
其实这种方法不只是用于 WordPress 站点,对于使用其他 CMS 的站点应该也是适用的。关于通过这样的方法备份站点之后,怎样进行恢复或更换域名搬家,将在下一篇文章中介绍。
欢迎分享或转载,转载请注明出处。
本文固定链接:https://www.oixxu.com/automatically-regularly-backup-wordpress-site/