4.3.2 制作差异备份或增量备份

假设你的 MySQL 服务器上的大部分数据随着时间的推移保持不变,你可以提高速度并减少定期备份所需的存储空间,方法是每次不备份服务器上的所有数据,而只备份对随时间发生的数据。为此,在首先制作包含所有数据的完整备份后,您可以执行以下操作之一:

  • 执行一系列差异备份。  每个差异备份都包括自上次执行完整备份以来对数据所做的所有更改。例如,要将数据恢复到 time t,您只需首先恢复完整备份,然后在其之上恢复 time 的差异备份t

  • 执行一系列的增量备份。  每个增量备份仅包括自上次备份以来的更改,上一次备份本身可以是完整备份或增量备份。增量系列中的第一个备份始终是差异备份;但在那之后,每个增量备份只包含自上次增量备份以来所做的更改。因此,每个后续的增量备份通常比差异备份更小,而且制作起来更快;这允许您进行非常频繁的增量备份,然后使您能够在必要时将数据库还原到更精确的时间点。然而,t,从恢复全量备份开始,然后逐个恢复增量备份,直到完成时间t的增量备份。

MySQL Enterprise Backup 支持增量备份和差异备份。您应该通过查看诸如您拥有多少存储空间、您必须能够以多快的速度恢复数据等因素来决定采用哪种备份策略。

MySQL Enterprise Backup 将差异备份视为以完整备份为基础的增量备份的特例。要创建差异备份,只需按照下面的说明执行增量备份,并确保使用我们下面描述的方法将完整备份指定为增量备份的基础;您还应该忽略任何仅适用于处理多个增量备份的说明。

有关用于增量备份的mysqlbackup选项的描述, 请参阅第 14.7 节,“增量备份选项” 。使用以下两个选项之一启用增量备份: 和 选项。有关它们的区别, 请参阅 仅使用重做日志创建增量备份。--incremental--incremental-with-redo-log-only

创建增量备份时,必须向 mysqlbackup指示上一次完全备份或增量备份的时间点。为方便起见,您可以使用该 选项从存储在先前备份目录或服务器上的元数据中--incremental-base自动派生必要的日志序列号(LSN)。或者,您可以使用该选项指定一个明确的 LSN 值 --start-lsn,向 mysqlbackup提供来自先前完整或增量备份的结束 LSN( 有关使用该选项时适用的一些限制, 请参阅增量备份的其他注意事项--start-lsn)。

要准备要恢复的备份数据,您可以将所有增量备份与原始完整备份结合起来。通常,您会在指定的时间段后执行新的完整备份,之后您可以丢弃较旧的增量备份数据。

仅使用重做日志创建增量备份

与创建增量备份的选项相比, 这--incremental-with-redo-log-only 可能会带来一些好处 :--incremental

  • InnoDB 表的更改是根据InnoDB 重做日志的内容确定的。由于重做日志文件具有您事先知道的固定大小,因此从中读取更改所需的 I/O 比扫描 InnoDB 表空间文件以定位更改的页面所需的 I/O 更少,具体取决于数据库的大小、数量DML 活动的数量,以及重做日志文件的大小。

  • 由于重做日志文件充当循环缓冲区,随着新 DML操作的发生,旧更改的记录将被覆盖,因此您必须根据日志文件的大小和生成的重做数据量规定的可预测计划进行新的增量备份为您的工作量。否则,重做日志可能无法回溯到足以记录自上次增量备份以来的所有更改,在这种情况下,mysqlbackup将很快确定它无法继续并返回错误。您的备份脚本应该能够捕获该错误,然后使用 --incremental选项代替。

    例如:

    • 要计算重做日志的大小,请发出命令 SHOW VARIABLES LIKE 'innodb_log_file%'并根据输出将 innodb_log_file_size 设置乘以 的值 innodb_log_files_in_group。要计算物理级别的重做日志大小,请查看datadirMySQL 实例的目录并汇总与模式匹配的文件的大小ib_logfile*

    • InnoDB LSN值对应于写入重做日志的字节数。要在某个时间点检查 LSN,请发出命令 SHOW ENGINE INNODB STATUS并查看 LOG标题下的内容。在规划备份策略时,定期记录 LSN 值,并从当前值中减去较早的值,以计算每小时、每天等生成了多少重做数据。

    在 MySQL 5.5 之前,通常的做法是将重做日志保持在相当小的水平,以避免在 MySQL 服务器被杀死而不是正常关闭时启动时间过长。使用 MySQL 5.5 及更高版本, 崩溃恢复的性能得到显着提高,如 优化 InnoDB 配置变量中所述,因此如果这有助于您的备份策略和数据库工作负载,您可以使重做日志文件更大。

  • --start-lsn这种类型的增量备份不像标准--incremental选项 那样容忍太低的值。例如,您不能进行完整备份,然后--incremental-with-redo-log-only 使用相同的--start-lsn 值进行一系列备份。确保将上一次备份的精确结束LSN指定为下一次增量备份的开始LSN;不要使用任意值。

    笔记

    为确保 LSN 值在连续增量备份之间完全匹配,建议您在使用该 --incremental-base选项时始终使用该 --incremental-with-redo-log-only 选项。

  • 判断这种增量备份对于特定的MySQL实例是否实用和高效:

    • 测量 InnoDB 重做日志文件中数据变化的速度。定期检查LSN 以确定在几个小时或几天内累积了多少重做数据。

    • 将重做日志累积的速率与重做日志文件的大小进行比较。使用这个比率来查看进行增量备份的频率,以避免备份失败的可能性,因为历史数据在重做日志中不可用。例如,如果您每天生成 1GB 的重做日志数据,而您的重做日志文件的总大小为 7GB,那么您应该安排比每周一次更频繁的增量备份。您可能每隔一两天执行一次增量备份,以避免在突然更新产生比平时更多的重做时出现潜在问题。

    • 基准增量备份时间同时使用 --incremental--incremental-with-redo-log-only 选项,以确认重做日志备份技术是否比传统的增量备份方法执行得更快并且开销更少。结果可能取决于数据的大小、DML 活动的数量以及重做日志文件的大小。在具有实际数据量和实际工作负载的服务器上进行测试。例如,如果您有巨大的重做日志文件,在增量备份过程中读取它们可能需要与使用传统增量技术读取 InnoDB 数据文件一样长的时间。反之,如果你的数据量很大,

增量备份的其他注意事项

增量备份功能主要用于 InnoDB 表,或只读或很少更新的非 InnoDB 表。增量备份检测InnoDB 数据文件中页面级别的更改 ,而不是表行;已更改的每个页面都已备份。因此,空间和时间的节省与更改的 InnoDB 行或列的百分比不完全成比例。

对于非 InnoDB 文件,如果该文件自上次备份以来发生了更改,则整个文件将包含在增量备份中,这意味着与 InnoDB 表的情况相比,备份资源的节省并不显着。

您不能使用该 --compress选项执行增量备份。

当基于使用该选项创建的备份(完整或增量)进行增量备份时 --no-locking,使用该 --skip-binlog选项跳过二进制日志的备份,因为二进制日志信息在这种情况下对mysqlbackup不可用。

--start-lsn如果使用该选项 ,则不会将二进制日志文件复制到增量备份中。要包括增量备份所涵盖期间的二进制日志文件,请改用该 --incremental-base选项,它为 mysqlbackup提供必要的信息,以确保上一次备份中包含的二进制日志数据与当前增量备份之间不存在间隙。

增量备份示例

此示例使用mysqlbackup对 MySQL 服务器进行增量备份,包括所有数据库和表。我们展示了两种选择,一种使用 --incremental-base选项,另一种使用--start-lsn选项。

使用该--incremental-base选项,您不必跟踪一个备份和下一个备份之间的 LSN 值。相反,您可以只指定先前目录备份的位置(完整或增量), mysqlbackup会根据先前目录的元数据计算出此备份的起点。因为您需要一组已知的目录名称,所以您可能希望使用硬编码名称或在您自己的备份脚本中生成一系列名称,而不是使用该 --with-timestamp选项。

$ mysqlbackup --defaults-file=/home/dbadmin/.my.cnf --incremental \
  --incremental-base=dir:/incr-backup/wednesday \
  --incremental-backup-dir=/incr-backup/thursday \
  backup
...many lines of output...
mysqlbackup: Backup created in directory '/incr-backup/thursday'
mysqlbackup: start_lsn: 2654255717
mysqlbackup: incremental_base_lsn: 2666733462
mysqlbackup: end_lsn: 2666736714

101208 17:14:58 mysqlbackup: mysqlbackup completed OK!

请注意,如果您的上次备份是单个文件而不是目录备份,您仍然可以 --incremental-base通过指定 您在完整备份期间 使用该选项提供的临时目录的位置来 使用。dir:directory_path--backup-dir

作为指定 的替代方法 ,您可以告诉mysqlbackup查询 服务器表 中记录的最后一次成功备份的值 (这要求最后一次备份是使用 连接到服务器 的mysqlbackup进行的)。--incremental-base=dir:directory_pathend_lsnbackup_history--incremental-base=history:last_backup

您还可以使用该--start-lsn选项来指定增量备份应该从哪里开始。你必须在备份结束时记录 mysqlbackup报告的先前备份的 LSN :

mysqlbackup: Was able to parse the log up to lsn 2654255716

该号码也记录在 备份期间meta/backup_variables.txt指定的文件夹中的文件中。然后使用该 选项--backup-dir将该数字提供给 mysqlbackup 。--start-lsn然后增量备份包括指定 LSN之后的所有更改。因为以前备份的位置不是很重要,所以可以使用 --with-timestamp自动创建命名子目录。

$ mysqlbackup --defaults-file=/home/dbadmin/.my.cnf --incremental \
  --start-lsn=2654255716 \
  --with-timestamp \
  --incremental-backup-dir=/incr-backup \
  backup
...many lines of output...
mysqlbackup: Backup created in directory '/incr-backup/2010-12-08_17-14-48'
mysqlbackup: start_lsn: 2654255717
mysqlbackup: incremental_base_lsn: 2666733462
mysqlbackup: end_lsn: 2666736714

101208 17:14:58 mysqlbackup: mysqlbackup completed OK!

要改为创建增量备份映像,请使用以下命令,指定 --backup-dir用于存储备份元数据和一些临时文件的临时目录:

$ mysqlbackup --defaults-file=/home/dbadmin/.my.cnf --incremental \
  --start-lsn=2654255716 \
  --with-timestamp \
  --backup-dir=/incr-tmp \
  --backup-image=/incr-backup/incremental_image.bi \
  backup-to-image

但在下面的示例中,由于 --backup-image没有提供要创建的映像文件的完整路径,因此增量备份映像是在 指定的文件夹下创建的 --backup-dir

$ mysqlbackup --defaults-file=/home/dbadmin/.my.cnf --incremental \
  --start-lsn=2654255716 \
  --with-timestamp \
  --backup-dir=/incr-images \
  --backup-image=incremental_image1.bi \
  backup-to-image

关于如何使用增量备份恢复数据库,请参阅第 5.2.3 节,“恢复增量备份”

下一步:

  • 根据日期或数据库活动量确定的定期计划,进行更多的增量备份。

  • 或者,通过进行完整、未压缩压缩的备份,定期重新开始循环。通常,这个里程碑发生在您可以存档和清除最旧的备份数据时。