使用从服务器转储的MySQL增量备份(InnoDB和MyISAM)

时间:2011-04-26 02:59:01

标签: mysql backup replication innodb myisam

假设我已经启动并运行了主服务器和从服务器数据库。

我想将增量备份/时间点恢复引入混合中。因为我已经有了复制的二进制日志,所以它应该像完整备份和存储日志位置一样简单。

但是,我的服务器上有MyISAM和InnoDB表,并且在每种情况下如何进行完全备份似乎存在冲突的建议。如果它是严格的InnoDB,我可以用--single-transaction做mysqldump,但是这个选项警告我MyISAM可能仍然会被更改。

我的问题如下:

(1)MySQL手册建议备份:

是否是一个有效的问题

mysqldump --single-transaction --flush-logs --master-data = 2 --all-databases> whatever.sql

...将不合适,因为MyISAM表可能会更改(表未使用--single-transaction锁定),因此新的日志文件已启动,但它可能包含对实际已在服务器上运行的MyISAM表的查询在这些表进入转储之前(增量恢复会尝试在不需要时重新执行这些查询)?

(2)是否只能使用MyISAM和InnoDB表来获得“正确”的完整备份--lock-all tables? (或者在那时只关闭服务器/复制文件,因为一切都被锁定了)

我假设这些问题的答案是肯定的,但如果我错了,请纠正我,因为我已经基于它的下一个想法。

我想在主服务器上保持最小的中断,所以我正在考虑根据这里的指示完成从服务器的完全转储:

http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html#option_mysqldump_master-data

这些指示实际上是用来设置一个奴隶的奴隶,但我想知道,以下是合理的吗?

每天一次:

  1. 停止奴隶
  2. 显示从属状态并获取主日志文件和位置
  3. 在没有对其进行任何更改(MyISAM或InnoDB)的情况下对从属进行完全转储
  4. 再次启动奴隶
  5. 将我的完整转储移至某个备份目录中的主服务器
  6. 如果恢复:

    1. 从上面的(5)恢复到完整转储
    2. 使用此处http://dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery-positions.html的位置运行时间点恢复,从上面的(2)中的位置移动到我想要恢复到的任何位置
    3. 那是合法的吗?我不明白为什么来自奴隶的完全转储与主人的完全转储有什么不同,所以看起来它会没事。

      感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

出于一个简单的原因,你每天一次的计划是非常合理的:你先停止了奴隶。没有新的交易可以进入。我想提出一些额外的建议。

在奴隶上请在/etc/my.cnf

中设置以下内容
[mysqld]
innodb_max_dirty_pages_pct=0

原因如下:

当slave正在处理mysqldump时,如果任何表在innodb缓冲池中注册了脏页,则必须将页刷新到磁盘。我注意到你的mysqldump已经发出了这个选项。默认情况下,innodb_max_dirty_pages_pct为90.无论存在什么脏页,都必须写入磁盘。如果innodb_max_dirty_pages_pct一直为零,则刷新innodb缓冲池会更快。

您可以动态设置它而无需重新启动mysql。跑吧:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

这将使innodb缓冲池保持精简和平均值。

我也看到--master-data = 2在你的mysqldump命令中。这仅在从站上启用二进制日志时才有效。如果没有,您需要从主服务器检索主日志和位置,因为mysqldump不能这样做。以下是如何从奴隶获取主人的日志文件和位置:

步骤1)运行“SHOW SLAVE STATUS \ G”并重新启动到ShowSlaveStatus.txt

步骤2)从ShowSlaveStatus.txt获取以下信息 Relay_Master_Log_File
Exec_Master_Log_Pos

步骤3)将这两个值写在转储文件的后面。

还有一件事:

请将--routines --triggers添加到mysqldump命令中。您永远不知道何时可以决定编写存储过程和触发器。此外,不需要--lock-tables是奴隶被停止。