我有一台 Ubuntu 服务器,托管一个 PHP5 / MySQL webapp。我还有另一台服务器(异地),其中有一个目录,仅用于备份我的 webapp 服务器。目前,我有一个简单的 cron 作业,它执行以下操作:
- 将 /var/www 复制到本地备份目录。命令:
cp -ua /var/www /backup/www
- 执行 information_schema 和我的应用程序数据库的 mysqldump 并将这些文件复制到本地备份目录。
- 将备份服务器作为 sshfs 卷挂载。
- 将所有文件从本地备份目录复制到 sshfs 卷。
问题:
- 这是一个有效的解决方案吗?或者专用的备份程序会工作得更好/更快吗?
- 我是否涵盖了我需要的一切?例如:是否也应该备份配置文件(PHP、Apache2、MySQL)?
- 如果有专用的备份程序可以更好地满足我的需求,您会推荐哪一个?
谢谢你的建议
答案1
我建议使用可以进行增量备份的工具,因为这样你就可以回到几天前更改的文件。我们使用迪尔维什为此(可从 ubuntu 存储库获得) - 基本上它是一个用 perl 编写的 rsync 包装器,可以更轻松地设置系统来运行常规增量备份,然后根据给定的规则使它们过期。
在我们的系统中,我们会将备份保留 7 天,但会将每周的第一个备份保留 1 个月,将每月的第一个备份保留 1 年,因此通常您可以找到一段时间前修改和删除的文件。对于小而重要的东西,我们的有效期要长得多。
至于您应该备份什么,在我看来,如果您有空间,请备份所有内容,除非您确定不需要备份。使用增量 rsync 备份,您只会复制自上次备份以来已更改的文件 - 我宁愿在备份驱动器上保留属于操作系统的额外 3gb 静态数据,也不愿在需要恢复时发现缺少一个重要文件。
至少我会备份 /etc/ 的全部内容,以及 /var 的大部分内容,具体取决于服务器上运行的内容。
如果您的 mysql 数据库相当小,那么您当前的方法可能是可以接受的,但由于您需要锁定数据库才能生成转储,因此这在大型数据库上并不实用。因此,许多人运行从属 mysql 服务器(它只是备份服务器上主服务器的只读副本),并使用它来生成备份。
这mysql 文档关于如何做到这一点的说明相当好,我第一次在一个晚上就完成了它,而之前并没有太多的 mysql 经验。
我们的从属 mysql 服务器与 dirvish 绑定,因此它每天都会生成每个单独数据库的转储,以及 /var/lib/mysql 的完整副本(在执行此操作之前它会停止 mysql 服务器)
答案2
看在 Ubuntu 机器上备份 mySQL 和 SVN 的便捷方法,这几乎概括了您的需要。
简而言之;
- 有几个标准软件包;我对
backupninja
和有很好的体验rdiff-backup
。看看有哪些可用,哪些适合您的需求,然后选择一个。 - 您应该备份
/etc/
(服务器配置)、所有 Web 内容、RCS 数据和数据库。我通常还会复制主目录,因为我通常有一堆不错的小脚本,它们确实不适合放在其他地方,如果我必须恢复服务器,最好有一个“已知”的 shell 设置、首选编辑器等。 - 当你做上述事情时,请至少在脑海中计划一下“当事情变糟时我该怎么办?”(即了解备份中的内容以及如何从中恢复。)
答案3
我已经将我需要的所有内容备份到 tar 中,然后将其复制到外部备份。该脚本还将删除 7 天前的备份。我忘了在哪里找到它,但我没有写它。
!/bin/bash
# fecha has a formated date
fecha=`date +"%d-%m-%Y"`
# Backup and gzip the directory
sudo tar cvzpf /backups/backup-$fecha.tgz --same-owner --exclude="/export/*" --exclude="/backups/*" --exclude="/home/error.log" --exclude="/proc/*" --exclude="/media/*" --exclude="/dev/*" --exclude="/mnt/*" --exclude="/sys/*" --exclude="/tmp/*" / 2>/home/error.log
# Rotate the logs, delete older than 7 days
find /backups/ -mtime +7 -exec rm {} \;