相关的文档10bet官方网站 本手册下载 本手册摘录

7.3.1建立备份策略

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

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

——all-databases——master-data——single-transaction > backup_sunday_1_PM.sql

由此产生的. sql产生的文件, mysqldump包含一组SQL插入语句,可用于在以后重新加载转储的表。

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

前面假定要备份的表是InnoDB表,因此——单独的事务使用一致的读取并保证数据被, mysqldump不会改变。(其他客户端对InnoDB表不能被, mysqldump过程。)如果备份操作包含非事务性表,则一致性要求在备份期间不更改这些表。例如,对于MyISAMmysql在备份过程中,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 11月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 11月14日10:07 gbichot2-bin.index

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

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

shell> mysqldump——single-transaction——flush-logs——master-data=2 \——all-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点之间的所有更改都被写入gbichot2-bin.000007。这种增量备份很重要,所以最好将其复制到安全的地方。(例如,把它备份到磁带或DVD上,或者复制到另一台机器上。)周二下午1点,再执行一次mysqladmin flush-logs命令。周一下午1点到周二下午1点之间的所有变动都要写进去gbichot2-bin.000008(也应该复制到安全的地方)。

MySQL二进制日志占用磁盘空间。为了腾出空间,要经常清理它们。一种方法是删除不再需要的二进制日志,比如在进行完全备份时:

shell> 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节,“清除二进制日志语句”