WordPress备份: 整站备份+MySQL导出+还原恢复+FTP迁移【自动脚本】

对于博主而言,除了研究原创文章和拓展流量之外,最重要的就是WordPress备份了。

回想起很久很久以前,在使用虚拟主机建站时,博主根本就没做过备份。

原因主要有两点:

一是因为当时用WordPress建站只是一种简单的爱好,对博客的重要性认识不足;二是知识欠缺,脑子里压根就没有备份这根弦。

直到有一天,悲剧来了。。

不知道此刻正在看文章的你是否也和博主一样,忍受不了管理后台的WordPress更新提示。每次看到有更新的插件,总忍不住去升级。

一般来说,为了系统安全,插件和主题升级到最新版本是推荐的,有时候也是必需的。

但这往往会忽略一个重要问题,就是兼容性。

这包括两个方面:插件和主机系统的兼容性,以及插件和插件之间的兼容性。

比如,某个插件旧的版本是用PHP5.X写的,新版本则是用PHP7.X写的,而你的主机系统使用的是PHP5.X,升级后则可能就会出现不兼容。

或者,一个插件升级后和另一个或几个插件运行时有冲突,同样会导致不兼容。

不兼容的后果就是:网站打不开!500 Internal Server Error

WordPress 500 Internal Server Error / 500错误

是不是有点眼熟?

于是,那天我登入WordPress后台,在升级了几个插件之后,网站突然就显示500错误了。

当时博主的建站知识非常有限,只能去找虚拟主机商家解决。

一封接着一封的工单,耗费了差不多一整天的时间,最后主机商答应可以限时下载他们自己备份的网站数据。

但是,这个数据是十几天前的。因为他们只提供每半月一次的WordPress整站备份。

好在博客更新并不频繁,而且后续网站恢复也很顺利,所以丢失的数据并不算多。但是,这仍然让博主感觉非常不愉快,并且直到现在,想起来多少还有些后怕。

(现在看来,其实当时并不需要那么麻烦,只要把插件目录一个一个的改名再启用,然后找出异常插件并将其停用就可以了。)

从这件事上,博主学到了两点教训:

①WordPress整站数据一定要经常备份

②插件一定不要着急升级,最好等一段时间(比如半个月)后再升级,并且升级前做好整站备份和SnapShot快照备份(如果你的VPS支持的话)

所以,自那之后,博主所有的网站都会每周备份至少两次。

起初是通过手动备份,压缩整站数据并导出数据库,保存在服务器上,同时下载到电脑里。

后来,随着博主对Linux命令的日益熟练,发现在WordPress备份过程中,很多手动操作完全可以通过简单的编程来实现全程自动化,从而极大提高备份效率。

博主目前使用WordPress备份脚本(详见下文),每天定时自动备份一次,并上传到远程 VPS/FTP 空间。同时,本机VPS和远程VPS均保留最近N次的备份数据。

此外,使用Hostwinds提供的SnapShot快照备份功能,还可以随时备份整个VPS系统,更进一步确保网站数据的安全。

本机VPS + 远程VPS + SnapShot快照,构建起三重备份存储,再也不用担心数据丢失了。

WordPress备份丢失

当然,这完全得益于使用VPS且纯命令管理的这种建站方式。而那种采用可视化面板(比如 cPanel 或者 DirectAdmin )的建站方式,几乎是没有机会学习和实践这些Linux知识的。

下面,本文将分享博主自用的两种WordPress备份方法:以前使用过的手动备份命令,以及目前正在使用的自动备份脚本。

同时,也会涉及WordPress的还原和恢复,以及WordPress搬家和迁移等操作介绍。

#1、手动备份命令

在Linux系统下,对WordPress进行手动备份其实也并不难。主要涉及两部分:网站源文件备份和对应的数据库备份。

① 网站源文件备份

为了方便管理,我们先建立一个文件夹专门存放备份数据,比如 /home/backup/

# mkdir /home/backup

以本站 seoimo.com 为例,压缩网站根目录并移动到 /home/backup/ 文件夹下(为方便管理,博主添加了备份日期,建议你也这样做):

# cd /home/wwwroot
# tar -zcvf seoimo-2019-07-08.tar.gz seoimo.com
# mv seoimo-2019-07-08.tar.gz /home/backup/

好了,整站已经备份完成。接下来,开始备份网站数据库。

② 网站数据库备份

首先,打开 /home/backup/ 文件夹,我们需要将数据库备份在这里:

# cd /home/backup
# lnmp database list

输入 root 数据库密码(参考 #6 + 搭建LAMP环境),即可查看当前数据库列表。

选择需要备份网站的对应数据库,以本站的 sjk_seoimo 为例:

# mysqldump -uroot -p sjk_seoimo > sjk_seoimo-2019-07-08.sql

再次输入 root 数据库密码,即可完成数据库备份。

通过命令 # ls -la 查看当前目录,应该能看到已经备份好了的压缩包。

此时,可通过 FTP 工具下载到本地电脑保存,也可以上传到其他 VPS/FTP 上保存。

#2、自动备份脚本

如果只是偶尔备份几次,用上面的方法进行手动备份倒没太大的不便。

但如果你需要经常备份,比如每天备份一次,那么手动备份的效率就太低了。

设想一下,你需要每天至少登录一次VPS,接着运行一系列命令,然后再上传到其他 VPS 或者 FTP 空间。

甚至,如果你想下载到本地电脑,几百MB甚至几个GB的压缩包,也是够传一段时间的。

实际上,在手动备份几次之后,博主就已经厌倦了这种单调且低效的备份方式。

所以,自己写了一个相对简单适用的WordPress自动备份脚本。

其主要功能有以下几点:

①自动备份当前VPS上所有WordPress根目录(网站数据)以及对应的数据库;
②同时备份整个数据库目录,以及网站相关目录比如SSL证书等;
③支持自动FTP上传到其他VPS或者FTP空间;
④支持自定义备份频率和保留最近N次备份;
⑤支持自动恢复(从本机VPS或者远程FTP),以及搬家/迁移。

默认折叠,请单击展开 / 折叠 ..

首先,安装备份脚本:

# cd /home/wwwroot/ && wget https://www.seoimo.com/downloads/shells/wp-backup-seoimo.sh

然后,修改相关信息(具体可参看文中说明):

# vi /home/wwwroot/wp-backup-seoimo.sh

最后,设置定时备份(例如每两天/每隔一天的凌晨00:20):

# echo -e “20 0 */2 * * bash /home/wwwroot/wp-backup-seoimo.sh” >> /var/spool/cron/root

当然,你也可以自定义备份频率,比如每天或者每三天等,只需把上面命令中的 */2 改成 */1 或者 */3 即可。但是,建议不要间隔太长,每天或者每两天备份一次比较好。

好了,你可以查看已经成功添加了定时备份任务:

# crontab -l

现在,你可以尝试手动备份一次:

# bash /home/wwwroot/wp-backup-seoimo.sh

查看备份目录,已经新建了一份备份:

# ls -la /home/backup/

有几点需要设置的变量(关于远程FTP、备份名称和备份保留次数等等),说明如下;若是没有远程FTP,相关设置可以不填,备份只保存在本机VPS上面。

FTP_IP=111.111.111.111 (远程FTP地址)
FTP_USER="ftpusername" (远程FTP用户名)
FTP_PASSWD="ftpuserpasswd" (远程FTP密码)
BACKUP_NAME="seoimo-wp-backup" (备份名称,建议只更改 seoimo 即可)
BACKUP_NUMBER=5 (备份保留次数)
MYSQL_ROOT_PASSWD="mysqlrootpasswd" (ROOT数据库密码)
FTP_BACKUP="/home/backup" (远程FTP备份目录,默认即可)
DIR_BACKUP="/home/backup" (本机VPS备份目录,默认即可)

#3、脚本使用方法

除了上面提到的相关变量需要设置以外,此脚本在使用前还需要做如下几点配置。主要是在本机VPS和远程 VPS/FTP 空间上的配置。

①本机 VPS 上的配置

第一、需要安装下 ftp 命令,否则可能会提示 -bash: ftp: command not found 错误:

# yum install ftp -y

然后,新建备份目录 /home/backup/ :

# mkdir /home/backup

如果已经提前创建好了此备份目录,则可直接跳过该步。

②远程 VPS/FTP 上的配置

这里演示的是远程VPS上创建 FTP 用户的操作,如果你已有 FTP 账户,可直接跳过该步。

首先,仍然是新建备份目录 /home/backup/ :

# mkdir /home/backup

其次,在lnmp1.6环境下安装 FTP 服务端:

# yum install ftp -y
# cd /root/lnmp1.6-full
# bash pureftpd.sh

然后,添加 FTP 用户:

# cd ~ && lnmp ftp add

自行设置FTP用户名、密码以及备份目录的绝对路径 /home/backup/ 如下:

+-------------------------------------------+
| Manager for LNMP, Written by Licess |
+-------------------------------------------+
| https://lnmp.org |
+-------------------------------------------+
Enter ftp account name: ftpusername
Enter password for ftp account ftpusername: ftpuserpasswd
Enter directory for ftp account ftpusername: /home/backup
Password:
Enter it again:
Created FTP User: ftpusername Sucessfully.

最后,为了防止在使用 FTP 工具上传时,可能会提示 “553 Can’t open that file: Permission denied” 的错误,建议更改下权限:

# chown www:www -R /home/backup

至此,关于FTP备份的准备工作已全部完成。

#4、写在最后

此WordPress自动备份脚本是在 CentOS7 + LNMP1.6/Apache 环境下进行编写和测试的,所以,博主也只推荐在此环境下使用。

假如,你是完全按照本站中的VPS建站教程搭建的WordPress博客,那么运行此脚本时应该不会有大的问题。

但是,鉴于博主水平有限,此备份脚本难免不会出现BUG。如果你在使用过程中发现了问题,或者有好的建议,烦请在下面留言讨论。

《WordPress备份: 整站备份+MySQL导出+还原恢复+FTP迁移【自动脚本】》有17条评论

17 条评论

  1. 博主您好,我按照教程的的方式重装了个lnmp1.6,然后恢复数据之后网站无法打开,发现apache无法启动,报错如下,请问这个该如何处理 感谢~
    restart apache... AH00526: Syntax error on line 29 of /usr/local/apache/conf/vhost/www.lalala.xyz.conf:
    SSLCertificateFile: file '/etc/letsencrypt/live/www.lalala.xyz/fullchain.pem' does not exist or is empty
    failed

    回复
    • 看下此文件是否存在:

      # cat /etc/letsencrypt/live/www.lalala.xyz/fullchain.pem

      若不存在,检查下SSL证书是否有错,或者重新生成下SSL证书:

      # lnmp ssl add
      回复
      • 我看了一下,这个文件存在的,然后我尝试了重新生成证书,可能是之前尝试重新生成证书次数太多,提示已经颁发太多证书·····················这该怎么办········

        回复
      • 另外,我尝试重启apache,报错如下
        restart apache... AH00526: Syntax error on line 84 of /usr/local/apache/conf/vhost/lalala.xyz.conf:
        SSLCertificateFile: file '/usr/local/apache/conf/ssl/lalala.xyz/lalala.xyz.cer' does not exist or is empty failed

        在此之前,网站运行了挺久的,之前也没见过类似的证书报错呀

        回复
        • 确定绑定的域名带不带 www ?我看到你两次回复的域名不一样。
          如果SSL证书还在,先备份起来,再研究如何导入。
          如果操作之前进行了系统snapshot备份,恢复一下就好了。
          至于生成次数过多的问题,LE证书好像是每个域名每周最多申请五次,超过了就要等几天再申请了。

          回复
          • ls大法好,我通过恢复之前的snapshot,把相关证书文件备份下来,然后恢复到新的snapshot,放回相应位置,就解决了,感谢

            回复
  2. 博主,你好
    我想问下在更换域名,IP,从新安装Word Press后如何使用以前备份的数据,直接替换好像不行。谢谢!

    回复
    • WordPress搬家吗?私以为不管换不换域名,其实都不难,要点有这几个:
      ①进入旧主机 phpmyadmin,导出数据库;
      ②打包旧域名 old.com 文件夹(注意 .htaccess 别漏了);
      ③新主机上绑定好域名以及https,建立好数据库;
      ④进入新主机 phpmyadmin,导入第一步里备份的数据库,然后按本站介绍的替换方式进行替换域名;
      ⑤新主机新域名 new.com 文件夹里解压第二步骤备份的 old.com,把其内的所有文件移动到 new.com 文件夹里(注意 .htaccess 别漏了);或者,直接把解压后的 old.com 文件夹重命名为 new.com;
      ⑥如果数据库名字和密码有改动,注意修改 wp-config.php 内的对应信息;
      ⑦如果旧网站上开启了缓存,注意在 wp-config.php 和 wp-content 目录下的 wp-cache-config.php和object-cache.php 里的绝对路径修改一下;
      ⑧最后,再把根目录下 .htaccess 域名更改下;
      WordPress搬家,不管是从VPS到VPS,还是VPS到虚拟主机,抑或是虚拟主机到虚拟主机,注意到以上这几步骤,熟练的话,基本半个小时就可以搞定了,尤其是开启了ssh传输的情况下。
      文中介绍的脚本备份方式,有一定的局限性,前提是两个VPS的建站环境必须一样,包括各种软件的版本也建议一致。否则,就有可能出错。
      这个备份脚本是博主自用的,其实更适合在当前VPS上备份和恢复。
      而上面介绍的这几步,更具有普适性。

      回复
  3. 博主对WordPress的UpdraftPlus插件怎么看?那个可以一键Google Drive备份,看上去很安全。

    回复
    • 不错的插件,以前也用过。安全但不够方便,一旦WP打不开,再好的插件也白搭。

      回复

发表评论