# 7.3.1 制定备份策略

为了有用,必须定期安排备份。可以使用多种工具在 MySQL 中完成完整备份(某个时间点的数据快照)。例如,MySQL 企业备份可以执行一个物理备份整个实例的优化,以最大限度地减少开销并避免备份时中断InnoDB数据文件;mysql转储在线提供逻辑备份.本次讨论使用mysql转储.

假设我们对我们所有的InnoDB周日下午 1 点,当负载较低时,使用以下命令在所有数据库中的表:

$> mysqldump --all-databases --master-data --single-transaction > backup_sunday_1_PM.sql

所结果的.sql文件由mysql转储包含一组 SQL插入可用于稍后重新加载转储表的语句。

此备份操作在转储开始时获取所有表的全局读锁(使用带读锁的刷新表)。一旦获得了这个锁,就会读取二进制日志坐标并释放锁。如果在运行长更新语句时冲洗发出语句,备份操作可能会停止,直到这些语句完成。之后,转储变为无锁并且不会干扰对表的读取和写入。

之前假设要备份的表是InnoDB表,所以--单笔交易使用一致的读取并保证所看到的数据mysql转储不改变。(其他客户对InnoDB表不被看到mysql转储过程。)如果备份操作包括非事务性表,一致性要求它们在备份期间不改变。例如,对于MyISAM中的表mysql数据库,备份期间不得对 MySQL 帐户进行管理更改。

完全备份是必要的,但创建它们并不总是很方便。它们会生成大型备份文件并需要时间来生成。它们不是最优的,因为每个连续的完整备份都包含所有数据,甚至包括自上次完整备份以来未更改的部分。进行初始完整备份,然后进行增量备份更有效。增量备份更小,生成时间更短。权衡是,在恢复时,您不能仅通过重新加载完整备份来恢复数据。您还必须处理增量备份以恢复增量更改。

要进行增量备份,我们需要保存增量更改。在 MySQL 中,这些更改在二进制日志中表示,因此 MySQL 服务器应始终以--log-bin启用该日志的选项。启用二进制日志记录后,服务器在更新数据时将每个数据更改写入文件。查看已经运行了几天的 MySQL 服务器的数据目录,我们发现了这些 MySQL 二进制日志文件:

-rw-rw---- 1 guilhem  guilhem   1277324 Nov 10 23:59 gbichot2-bin.000001
-rw-rw---- 1 guilhem  guilhem         4 Nov 10 23:59 gbichot2-bin.000002
-rw-rw---- 1 guilhem  guilhem        79 Nov 11 11:06 gbichot2-bin.000003
-rw-rw---- 1 guilhem  guilhem       508 Nov 11 11:08 gbichot2-bin.000004
-rw-rw---- 1 guilhem  guilhem 220047446 Nov 12 16:47 gbichot2-bin.000005
-rw-rw---- 1 guilhem  guilhem    998412 Nov 14 10:08 gbichot2-bin.000006
-rw-rw---- 1 guilhem  guilhem       361 Nov 14 10:07 gbichot2-bin.index

每次重新启动时,MySQL 服务器都会使用序列中的下一个数字创建一个新的二进制日志文件。在服务器运行时,您还可以通过发出刷新日志SQL 语句或带有mysqladmin 刷新日志命令。mysql转储还可以选择刷新日志。这。指数数据目录中的文件包含目录中所有 MySQL 二进制日志的列表。

MySQL 二进制日志对于恢复很重要,因为它们形成了一组增量备份。如果您确保在进行完整备份时刷新日志,则之后创建的二进制日志文件包含自备份以来所做的所有数据更改。让我们修改以前的mysql转储命令一点,以便它在完全备份时刷新 MySQL 二进制日志,并且转储文件包含新的当前二进制日志的名称:

$> mysqldump --single-transaction --flush-logs --master-data=2 \
         --all-databases > backup_sunday_1_PM.sql

执行此命令后,数据目录包含一个新的二进制日志文件,gbihot2-bin.000007,因为--刷新日志选项导致服务器刷新其日志。这- 主要的数据选项原因mysql转储将二进制日志信息写入其输出,因此结果.sql转储文件包括以下几行:

-- Position to start replication or point-in-time recovery from
-- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;

因为mysql转储命令进行了完整备份,这些行意味着两件事:

  • 转储文件包含在写入任何更改之前所做的所有更改gbihot2-bin.000007二进制日志文件或更高版本。

  • 备份后记录的所有数据更改都不存在于转储文件中,但存在于gbihot2-bin.000007二进制日志文件或更高版本。

    周一下午 1 点,我们可以通过刷新日志来创建增量备份,以开始一个新的二进制日志文件。例如,执行一个mysqladmin 刷新日志命令创建gbihot2-bin.000008.周日下午 1 点之间的所有变化。完整备份和星期一下午 1 点。写在gbihot2-bin.000007.这种增量备份很重要,因此最好将其复制到安全的地方。(例如,将其备份到磁带或 DVD 上,或将其复制到另一台机器上。)周二下午 1 点,执行另一个mysqladmin 刷新日志命令。周一下午 1 点之间的所有变化。和周二下午 1 点。写在gbihot2-bin.000008(也应该复制到安全的地方)。

    MySQL 二进制日志占用磁盘空间。要释放空间,请不时清除它们。一种方法是删除不再需要的二进制日志,例如当我们进行完整备份时:

$> mysqldump --single-transaction --flush-logs --master-data=2 \
         --all-databases --delete-master-logs > backup_sunday_1_PM.sql

笔记

删除 MySQL 二进制日志mysqldump --delete-master-logs如果您的服务器是复制源服务器,则可能很危险,因为副本可能尚未完全处理二进制日志的内容。的描述清除二进制日志声明解释了在删除 MySQL 二进制日志之前应该验证的内容。看第 13.4.1.1 节,“PURGE BINARY LOGS 语句”.