1.3.1建立备份策略

为了有用,必须定期安排备份。完全备份(数据在某个时间点的快照)可以在MySQL中使用几个工具来完成。例如,MySQL Enterprise备份可以执行物理备份对整个实例进行优化,以最小化开销并避免在备份时中断InnoDB数据文件;mysqldump.提供在线逻辑备份.这个讨论用途mysqldump.

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

shell> mysqldump --all-databases --master-data --single-transaction> backup_sunday_1_pm.sql

所结果的. sql产生的文件mysqldump.包含一组SQL可用于在稍后重新加载转储表的语句。

此备份操作在转储开头的所有表上获取全局读锁(使用用读锁刷新表).一旦获得了这个锁,二进制日志坐标就被读取,锁就被释放。时运行长更新语句冲洗发表声明,备份操作可能会失速,直到这些陈述完成。之后,转储无锁,不会打扰表格上的读取和写入。

前面假定要备份的表是InnoDB表,所以——单独的事务使用一致的读取并保证数据被mysqldump.没有改变。(其他客户提出的更改InnoDB表不能被mysqldump.进程。)如果备份操作包括非讲台,则一致性要求它们在备份期间不会更改。例如,对于MyISAMmysql在备份过程中,MySQL帐户不能有任何管理更改。

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

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

-rw-rw ---- 1吉隆勒·吉伦1277324 11月10日23:59 Gbichot2-bin.000001 -rw-rw ---- 1桂狮桂狮4 11月10日23:59 gbichot2-bin.000002 -rw-rw---  1吉隆姆·吉尔姆79 11月11日11:06 Gbichot2-bin.000003 -RW-RW ---- 1吉隆勒·吉伦508 11月11日11:08 Gbichot2-Bin.000004 -RW-RW ---- 1 Guilhem Guilhem 22004744611月12日16:47 gbichot2-bin.000005 -rw-rw ---- 1 guilhem guilhem 998412 11月10:08 gbichot2-bin.000006 -rw-rw ---- 1 guilhem guilhem 361 11月14日10:07 gbichot2-bin.index.

每次重新启动时,MySQL服务器使用序列中的下一个数字创建新的二进制日志文件。在服务器运行时,您还可以通过发出a关闭当前二进制日志文件并通过发出手动开始新的二进制日志文件刷新日志SQL语句或与mysqladmin flush-logs命令。mysqldump.还有一个刷新日志的选项。的.indexdata目录下的file包含该目录下所有MySQL二进制日志的列表。

MySQL二进制日志对于恢复非常重要,因为它们构成了一组增量备份。如果确保在进行完全备份时刷新日志,那么之后创建的二进制日志文件将包含备份之后所做的所有数据更改。让我们修改一下前面的mysqldump.命令,以便在完全备份的时刻刷新MySQL二进制日志,并使转储文件包含新的当前二进制日志的名称:

shell> mysqldump --single-transaction  -  flush-logs --master-data = 2 \ --alt-databases> backup_sunday_1_pm.sql

执行此命令后,数据目录包含新的二进制日志文件,Gbichot2-bin.000007.,因为——flush-logs选项使服务器刷新其日志。的- 主要的数据选择的原因mysqldump.将二进制日志信息写入其输出,因此产生的. sql转储文件包括以下几行:

——启动复制或时间点恢复的位置——CHANGE MASTER to MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;

因为mysqldump.命令完成了完整的备份,那些线意味着两件事:

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

  • 备份后记录的所有数据更改不在转储文件中,而在Gbichot2-bin.000007.二进制或更高的日志文件。

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

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

shell> mysqldump --single-transaction --flush-logs --master-data = 2 \  - 数据库 -  delete-master-logs> backup_sunday_1_pm.sql
请注意

删除MySQL二进制日志mysqldump --delete-master-logs如果您的服务器是一个复制源服务器,可能会很危险,因为副本可能还没有完全处理二进制日志的内容。该产品的说明清洗二进制日志语句解释了在删除MySQL二进制日志之前应该验证什么。看到清除二进制日志语句