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

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

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

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

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

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

笔记

对于 MySQL Enterprise Backup 4.1.5 及更高版本,您可以使用该选项轻松创建差异备份 --incremental-base=history:last_full_backup

有关用于增量备份的mysqlbackup选项的描述, 请参阅第 16.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 值,并从当前值中减去较早的值,以计算每小时、每天等生成了多少重做数据。

  • --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选项执行增量备份。

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

全扫描与乐观增量备份

默认情况下,当该--incremental 选项用于未指定任何值的备份时, mysqlbackup扫描服务器数据目录中的所有 InnoDB 数据文件以查找自上次备份以来已更改的页面,然后保存这些页面。这称为全扫描增量备份,当自上次备份以来修改的表不多时,这种备份可能效率不高。另一方面,乐观增量备份仅扫描自上次备份以来已修改的 InnoDB 数据文件中的更改页,从而节省了一些不必要的扫描时间。

可以通过指定执行乐观增量备份 --incremental=optimistic。虽然乐观增量备份可能会缩短备份时间,但它有以下限制:

  • 由于此功能利用了服务器数据目录中文件的修改时间,因此自上次备份以来有两件事必须保持不变:(1) 服务器上的系统时间,以及 (2) 数据目录的位置。否则,备份可能会失败,或者可能会生成不一致的增量备份。

  • 无法使用 执行乐观增量备份 --incremental-with-redo-log-only,为此 mysqlbackup读取重做日志文件而不是扫描数据目录中的文件。

  • 如果--start-lsn使用该选项,则即使 --incremental=optimistic 指定也会执行完整扫描,因为在这种情况下, mysqlbackup无法确定先前备份一致的时间点,因此没有时间范围来确定最近修改了哪些文件.

--incremental对于这些和其他不需要乐观备份的情况,使用不指定值的选项或使用--incremental=full-scan具有相同效果 的选项 执行全扫描增量备份 。

有关mysqlbackup执行乐观增量备份所需的权限, 请参阅第 4.1.2 节,“将 MySQL 权限授予备份管理员” 。另请参阅同时 使用乐观备份和乐观增量备份,了解如何在备份计划中同时使用这两个功能。

增量备份示例

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

使用该--incremental-base选项,您不必跟踪一个备份和下一个备份之间的 LSN 值。相反,您可以执行以下操作之一:

  • 使用or 告诉mysqlbackup从服务器上的表 中记录end_lsn的最后一次成功的 非 TTS 备份中查询 值(对于版本 4.1.5 及更高版本)。 backup_history--incremental-base=history:last_backuphistory:last_full_backup

  • Advanced:对于目录备份,用 指定上一次备份(完整或增量)的目录 , mysqlbackup将根据之前备份的元数据确定本次备份的起点。因为您需要一组已知的目录名称,所以您可能希望使用硬编码名称或在您自己的备份脚本中生成一系列名称,而不是使用该选项。如果您上次备份是单个文件,您仍然可以使用 来提供您 在上次备份期间随选项 --incremental-base=dir:directory_path--with-timestamp--incremental-base=dir:directory_path--backup-dir

在以下示例中, --incremental-base=history:last_backup 使用了选项,假设mysqlbackup从表 中获取最后一次成功(非 TTS)完整或部分备份的 LSN,并mysql.backup_history基于该选项执行增量备份。

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

在下面的示例中,将执行与上一个示例类似但 本质上是 乐观的增量备份。

mysqlbackup --defaults-file=/home/dbadmin/my.cnf \
  --incremental=optimistic --incremental-base=history:last_backup \
  --backup-dir=/home/dbadmin/temp_dir \
  --backup-image=incremental_image1.bi \
   backup-to-image

Advanced:使用以下命令使用选项创建增量目录备份 ;备份保存在指定的位置 : --incremental-base=dir:directory_path--incremental-backup-dir

mysqlbackup --defaults-file=/home/dbadmin/my.cnf --incremental \
  --incremental-base=dir:/incr-backup/wednesday \
  --incremental-backup-dir=/incr-backup/thursday \
  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 之后的所有更改。

要使用该选项创建增量备份映像 --start-lsn,请使用以下命令,指定--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.1.3 节,“恢复增量备份”