在我的 Linux 机器上,我使用自制的备份脚本,它实际上只是几个 rsync 调用。我已经测试了恢复,一切似乎都正常,但是这个设置是否存在问题?
我主要关心的是此备份的原子性。据我所知,Linux 中的文件没有锁定。如果只部分写入,文件是否可以复制?数据库、xml 文件或任何其他具有结构或语法的频繁写入的文件是否可能在备份位置最终损坏或无法使用?
答案1
对于原子备份,理想情况下您需要停止对正在备份的区域的所有写访问,这意味着停止所有可能写入它们的服务。
如果您使用 LVM,那么快照功能会使这项工作变得轻松很多,因为您只需要在创建只读快照所需的时间内停止服务,这几乎是即时的。您可以从快照中获取备份,然后将其删除,直到下一次备份运行需要新的备份。请参阅http://tldp.org/HOWTO/LVM-HOWTO/snapshots_backup.html了解更多详情。
但是,不要让快照保持活动状态的时间比需要的时间长,因为这会对性能产生影响(尽管这些问题通常比在备份运行时必须有完全的停机时间要小得多)。
答案2
对于数据库来说,有时转储数据然后备份转储会更安全。例如,MySql 附带这个工具 mysqldump 可以完成此操作。
我用巴库拉进行备份,我已将其配置为运行 mysqldump 以将数据库转储到转储目录中,然后 bacula 备份此目录。我对 SVN 做了类似的事情。
我没有自动恢复过程,但至少我的数据格式很容易导入 MySql,也可能很容易导入其他数据库,因为转储文件只是 SQL
答案3
是的,它们仍然可以复制。如上文所述,我会将数据库转储到一个文件中,然后使用 bzip 进行压缩,最后将它们 rsync 到任意位置
# mysqldump --all-databases -u user -p | bzip2 -c > mysqlbackup.sql.bz2
# <rsync stuff here>
然后将其加载到新数据库中
# bzip2 -d mysqlbackup.sql.bz2
# mysql -u user -p < mysqlbackup.sql
为了进一步缓解疑虑,我有时会回过头来lsof -F | grep <keyword>
看看要传输的文件是否正在使用或打开。如果 lsof 返回 null,那么我知道我可以继续。您可以使用它来搜索打开的 MySQL 表,因为 MySQL 正在向该表写入数据。一旦 lsof 返回 null,您就可以继续传输文件。
答案4
根据这一页,您应该将数据库备份到文件,然后在 rsync 之前停止它。这不是理想的选择,因为您每次都必须备份整个数据库。专门的数据库备份程序是最好的。