引言

本文提供了一种快速备份典型 web 托管场景中最常见事物的方法: 网站文件和数据库数据。 我们将建立一个完整的网站文件夹每日备份和复制这些数据到一个远程服务器(这也可以为另一个 VPS 工作)。 我们还将设置一个 rsync 示例来复制增量更改。 最后,我们将建立一个 MySQL 数据库的备份。 所描述的过程使用一些简单的 Bash 命令、 rsync 和 cron 来安排备份。 例如数据,我们可以按照本教程安装 Wordpress。 它将把 Wordpress 放在 / var / www / Wordpress 目录和一个 MySQL 数据库 Wordpress 中,现在我们需要备份所有数据。

Digitalocean 提供了快照和备份,可以很好地处理备份和快照。 还有一些优秀的备份即服务解决方案,它们使用最少的配置。 但是有时候我们想要使用另一个备份服务器或者内部服务器,我们想要一个快速的方法把数据从网络主机拉回到我们的服务器。 在这种情况下,这些建议可能会有所帮助。

备份有两种方法: 增量备份和完全备份。 完全备份复制所有数据,而快照只处理自上次更新以来的更改。

完全备份

完全备份通常执行以下操作:

  • 对文件夹中的所有文件进行归档
  • 将产生的归档文件复制到远程服务器。

如前所述,我们的数据将驻留在 / var / www / wordpress 目录中。

mkdir -p /backup/wordpress

上面的命令将创建一个 / backup 目录,以及一个 / backup / wordpress 目录(如果它们不存在的话)。 为了创建数据的完整快照,我们使用名为 tar 的 linux 工具。

tar -czf /backup/wordpress/initial_backup.tar.gz
/var/www/wordpress

Tar 将在 f ile 的初始备份.Tar.gz 中返回一个 g z ip 归档文件。 如果需要详细的输出(文件名列表) ,我们可以添加一个 v 标志(所以我们得到 tar-czvf)。 我们将文件命名为 initial backup.tar.gz,这样我们就知道这是一个初始备份,它与 tar 一起存档,iz 以 gzip 格式压缩。 Tar 将使用我们提供的任何参数作为源,在我们的例子中,它将备份 / var / www / wordpress 目录。 我们可以传递两个或更多的参数,不管它们是文件还是文件夹。

tar -czf /backup/cms_systems_backup.tar.gz /var/www/wordpress
/var/www/drupal /var/www/joomla

最后一个命令将备份我们安装的所有 cms 系统。

现在,对于未来的备份,我们可能需要添加备份执行的日期:

tar -czf /backup/wordpress/wordpress-`date '+%m%d%y'`.tar.gz
/var/www/wordpress

让我们看看我们现在有什么:

[[email protected] ~]# ls -l /backup/wordpress/
total 9760
-rw-r--r-- 1 root root 4995743 Apr 17 12:16 initial_backup.tar.gz
-rw-r--r-- 1 root root 4995743 Apr 17 12:25 wordpress-041713.tar.gz
[[email protected] ~]#

我们有两个文件,一个叫做 initial backup,一个叫做 wordpress-041713(写这篇文章的时间是2013年4月17日)。 现在,为了安排这个日程,我们需要创建一个 crontab 条目。 是一个 linux 任务调度器: 我们告诉它什么时候做什么任务。 无论如何,我们打开 crontab 编辑器:

EDITOR=nano crontab -e

它将在文本编辑器中打开一个 crontab 文件。 默认情况下,DO CentOS 图像包含 vim 作为编辑器,这需要一些设置,因此我们为此使用了一个更简单的编辑器,称为 nano 编辑器。 我们可以使用默认的编辑器:

crontab -e

现在,我们需要告诉 cron 进行备份,比如说,每天凌晨3:30,希望不会有太多流量。 我们也会告诉它把任何发现发电子邮件给我们。 我们把这些内容放到 crontab 中:


[email protected]
30 3 * * * /bin/tar -czf /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz /var/www/wordpress

我们用 CTRL-X 保存文件,然后用 y 和 Enter 确认。 上面的命令将告诉 linux 每天3:30重复我们的命令。 我们还告诉 cron 把结果发电子邮件给我们。 您将收到以下消息: / bin / tar: 从成员名称中删除前导的‘ / ’ ,作为所有内容都通过的标志。 在出现错误的情况下,消息将包含详细信息,以便我们能够修复这个问题。 因此,每日备份已经准备好并开始工作。

将备份复制到另一个远程服务器

要将备份复制到另一个远程服务器,我们将使用 scp 安全复制。 首先,我们需要生成一个 SSH 密钥:

ssh-keygen

我们可以暂时保留密码短语为空,使用 / root / 。 Ssh / id rsa 备份密钥文件(或 / home / username /)。 如果我们不是以 root 身份运行的话,ssh / id rsa 备份)。 现在我们可以检查公钥部分:

cat .ssh/id_rsa_backup.pub

我们需要将 SSH 密钥的这个公共部分复制到远程服务器上的一个文件授权密钥。 我想我们已经有了一个叫做 backup.example.com 服务器的远程服务器和一个用户备份。 这可能是一个空的新创建的数字 alocean VPS (液滴) ,但用户必须事先创建。 这部分我们只做一次。

scp .ssh/id_rsa_backup.pub
[email protected]:/home/backup/backup_key.pub

我们会被提示输入用户的备份密码。 我们复制了这个文件,现在让我们把它添加到它应该在的地方,在授权的密钥。 我不能假设这个用户已经建立了文件和文件夹,所以让我们检查一下这些信息:

ssh [email protected] "mkdir -p /home/backup/.ssh"
ssh [email protected] "chmod 700 /home/backup/.ssh"
ssh [email protected] "touch /home/backup/.ssh/authorized_keys"
ssh [email protected] "chmod 600 /home/backup/.ssh/authorized_keys"
ssh [email protected] "mkdir -p /home/backup/backups"

上面的几个命令为 SSH 创建了一个用于工作的目录(如果它不存在的话)和一个授权密钥文件,这个文件需要用于备份工作。 我们还创建了一个备份目录来存储文件。 现在剩下的是将我们的公钥复制到该文件。

ssh [email protected] "cat /home/backup/backup_key.pub >>
/home/backup/.ssh/authorized_keys"

现在我们可以用这把钥匙在未来复制东西。

现在,让我们复制那边的备份文件:

scp -i .ssh/id_rsa_backup
/backup/wordpress/wordpress-041713.tar.gz
[email protected]:/home/backup/backups

如果我们的密钥设置是正确的,文件将被复制,我们不会被要求密码。 我们可以检查文件是否真的存在:

ssh [email protected] "ls -l /home/backup/backups"

好的,我们现在可以将这个操作安排到 crontab 中,再次启动 crontab 编辑器:

EDITOR=nano crontab -e

我们现在将修改我们的备份行: 我们希望添加信息,以复制我们的备份档案创建时。 因此,我们附加新的命令,使它看起来像这样:

30 3 * * * /bin/tar -czf /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz /var/www/wordpress;/usr/bin/scp -i
/root/.ssh/id_rsa_backup /backup/wordpress/wordpress-`date
+\%m\%d\%y`.tar.gz
[email protected]:/home/backup/backups

注意: 这不是通常的做法,最好是设置一个脚本来完成所有的任务,然后安排脚本。 但为了简短起见,我们将使用该表单。

增量备份

但是如果我们在另一台服务器上有自己的备份软件呢? 我们只想同步数据,然后让其他服务器做备份工作。 此外,我们要保存档案邮票。 然后我们使用 rsync。 这里的用例是,我们希望将从 / var / www / wordpress 到远程服务器的所有内容增量复制到 / home / backup / snapshots / wordpress 目录。 这里有一个简单的命令可以做到这一切:

ssh [email protected] "mkdir -p /home/backup/sync"
rsync -avz --delete -e "ssh -i /root/.ssh/id_rsa_backup"
/var/www/wordpress [email protected]:/home/backup/sync

第一行创建一个快照目录,第二行复制更改后的文件。 这意味着文件被修改,新创建或删除。 我们也可以把它安排在 cron:

EDITOR=nano crontab -e

Crontab 行应该是这样的:

30 3 * * * /usr/bin/rsync -avz --delete -e "ssh -i
/root/.ssh/id_rsa_backup" /var/www/wordpress
[email protected]:/home/backup/sync

现在我们的远程服务器总是有一个新的同步数据副本,我们可以在那里做备份。

备份数据库

我们还可以备份我们的数据库。 首先,我们要转储数据。 如果我们遵循 wordpress 安装指南,我们也有一个数据库 wordpress,用户 wordpressuser 通过密码访问。 我们可以这样做初始转储:

mkdir /backup/mysql
mysqldump < wordpress -u wordpressuser -ppassword | gzip >
/backup/mysql/initial.sql.gz

这个命令创建了 initial.SQL.gz gziped SQL 文件。 为了每天完成,我们可以像以前一样用 cron 来安排。 我们生成的 cron 行应该是这样的:

0 4 * * * /usr/bin/mysqldump < wordpress -u wordpressuser
-ppassword | /bin/gzip > /backup/mysql/mysql--`date +\%m\%d\%y`.sql.gz

现在,我们还可以将它与 scp 或 rsync 组合起来进行远程复制。

0 4 * * * /usr/bin/mysqldump < wordpress -u wordpressuser
-ppassword | /bin/gzip > /backup/mysql/mysql-`date +\%m\%d\%y`.sql.gz;
/usr/bin/scp -i /root/.ssh/id_rsa_backup /backup/mysql/mysql-`date
+\%m\%d\%y`.sql.gz  [email protected]:/home/backup/

有了这个设置,我们就有了应对紧急情况的基本数据备份。