假设我已经启动并运行了主服务器和从服务器数据库。
我想将增量备份/时间点恢复引入混合中。因为我已经有了复制的二进制日志,所以它应该像完整备份和存储日志位置一样简单。
但是,我的服务器上有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
这些指示实际上是用来设置一个奴隶的奴隶,但我想知道,以下是合理的吗?
每天一次:
如果恢复:
那是合法的吗?我不明白为什么来自奴隶的完全转储与主人的完全转储有什么不同,所以看起来它会没事。
感谢您的帮助!
答案 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是奴隶被停止。