在MySQL中进行增量备份的最佳方法是什么?

在MySQL中进行增量备份的最佳方法是什么?,mysql,database,backup,Mysql,Database,Backup,我们使用的是MySQL版本5.0,大多数表都是InnoDB。我们运行到从属服务器的复制。我们正在考虑每天备份MySQL日志文件 问题 是否有其他不使用日志文件进行增量备份的方法 执行增量备份时的最佳做法是什么 AFAIK执行增量备份的唯一方法是使用二进制日志。如果要执行完整备份(InnoDB hotcopy),您还有其他选项,但增量意味着您需要记录所有事务 您需要问问自己为什么要备份数据。由于您有一个用于复制的从机,我假设备份主要用于在意外删除时恢复数据 我可能会每1小时轮换一次日志,并对其进

我们使用的是MySQL版本5.0,大多数表都是InnoDB。我们运行到从属服务器的复制。我们正在考虑每天备份MySQL日志文件

问题
  • 是否有其他不使用日志文件进行增量备份的方法
  • 执行增量备份时的最佳做法是什么

AFAIK执行增量备份的唯一方法是使用二进制日志。如果要执行完整备份(InnoDB hotcopy),您还有其他选项,但增量意味着您需要记录所有事务

您需要问问自己为什么要备份数据。由于您有一个用于复制的从机,我假设备份主要用于在意外删除时恢复数据


我可能会每1小时轮换一次日志,并对其进行备份。这意味着,还原将使数据保留最多1小时,并且您可以还原到自上次完整快照以来的任何时间点。

您可以使用mysqldump定期转储架构,对每个架构使用始终相同的文件名和路径(即替换最新的一个)

然后将其与任何支持增量/增量备份的备份工具相结合,例如rdiff备份、duplicity、Replicati或Areca备份。duplicity文档中的一个示例:

由于duplicity使用librsync,因此增量归档文件占用了大量空间 高效且仅记录自 最后一次备份


这样,您的第一次备份将是第一次完全转储的压缩副本,第二次备份将包含第一次和第二次转储的压缩差异,依此类推。您可以恢复任意时间点的mysqldump文件,然后将该文件恢复到MySQL中。

自上次回答以来,已经过了很多时间,在这段时间内,出现了几种实现增量备份的解决方案和工具

两个主要问题:

  • Percona XtraBackup是一个针对MySQL的开源热备份实用程序- 基于在备份期间不锁定数据库的服务器。信息技术 还允许您创建增量备份。更多细节

    它非常简单,看起来像这样:

    xtrabackup --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base
    
  • mysqlbackup
    是一个实用程序,包含在mysql企业版中 版本它很像percona xtrabackup。详细的比较
    可以找到
    它具有参数
    --incremental
    ,允许您进行增量备份。更多细节

这两个实用程序进行物理备份(复制数据库文件),但您仍然可以对binlog文件进行逻辑备份

您可以自己编写脚本,也可以使用github的现成脚本:

事实上,还有一些付费解决方案是这些工具的漂亮包装:

进行增量备份时的最佳做法是什么?

这完全取决于您的体系结构、数据量以及您可以接受的最大允许停机时间间隔。允许的最大数据丢失间隔。在设置备份之前考虑这些事项。


我只想提到一个很好的做法,但非常重要,而且常常被遗忘。定期在另一台不相关的服务器上测试并运行恢复脚本。

那么我们如何做到这一点呢?在PHP/MySQL中有一些示例代码吗?循环日志的命令是FLUSH BINARY LOGS。请注意,二进制文件确实包含对所有数据库的更改。在开始应用二进制日志之前,您必须将所有数据库恢复到相同的状态。如果您需要有关我的博客的更多详细信息,我正好描述了执行二进制日志的这种方法。
mysqlbackup --defaults-file=/home/dbadmin/my.cnf --incremental --incremental-base=history:last_backup --backup-dir=/home/dbadmin/temp_dir --backup-image=incremental_image1.bi backup-to-image