2011-04-26 97 views
2

假设我已经有一个已启动并正在运行的主数据库服务器和一个从属数据库服务器。使用从设备转储(InnoDB和MyISAM)的MySQL增量备份

我想介绍增量备份/时间点恢复到混合中。由于我已经有了用于复制的二进制日志,它应该像进行完整备份和存储日志位置一样简单。

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

我的问题如下:

(1)它是一个有效的关注,MySQL手册建议的备份:

的mysqldump --single事务--flush-日志--master -data = 2 --all-databases> whatever.sql

...将不适合,因为MyISAM表可能会更改(表未使用--single-transaction锁定),因此新的日志文件已启动,但它会启动可能包含MyISAM表的查询,这些表在实际上已经在服务器上运行之前已经在这些表中创建他转储(并且增量恢复会在不需要时尝试重新执行这些查询)? (2)是否只有通过MyISAM和InnoDB表才能获得“正确”完整备份才能使用--lock-all表的唯一方法是? (或在那一刻关闭服务器/复制文件,因为无论如何一切都锁定了)

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

我想保持中断在主服务器上最小的,所以我正在考虑做完全转储关闭基于此方向的奴隶:

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

这些方向实际上是为奴隶建立一个奴隶,但我想知道,下面是否合理?

每天一次:

  1. 停止从
  2. 显示从站状态并获得主日志文件和位置
  3. 执行从完全转储虽然没有变化正在向它提出的(的MyISAM或InnoDB的)
  4. 启动从机再一次
  5. 将我完全转储到主服务器在某些备份目录

在恢复的情况下:

  1. 使用从这里http://dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery-positions.html位置从上述(2)到任何位置的位置去还原从(5)上述
  2. 运行点完全转储及时恢复我想恢复到

这是合法吗?我不明白为什么从奴隶的全部转储与主人的转储有什么不同,所以看起来好像没问题。

感谢您的帮助!

回答

0

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

在从属服务器,请在设置的/etc/my.cnf

[mysqld] 
innodb_max_dirty_pages_pct=0 

这是为什么如下:

虽然从正在处理的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”和rediredct到ShowSlaveStatus.txt

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

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

一件事:

请加--routines --triggers到mysqldump命令。你永远不知道什么时候你可能决定编写存储过程和触发器。另外,不需要-lock-tables就会停止从站。