MySQL复制没有在binlog中运行更新

时间:2012-08-07 13:25:29

标签: mysql sql-update replication

我有一些运行版本为5.1.63的mysql服务器,虽然本周早些时候对奴隶运行了一些查询,但我注意到奴隶上的一些数据本应在主服务器上使用更新语句删除。

我最初的想法是:

  • 团队中有人正在更新奴隶,我已经反驳了
  • 正在更新的列已更改

所以,我通过运行mysql show status“table”查询来调查。这是针对每个服务器上的测试数据库运行的,以查看数据长度是多少,在很多情况下,它显示了服务器之间的数据长度不同,但是在眼球上看看数据我可以看到数据是相同,所以我无法使用此方法来查看是否存在任何差异,因为它似乎容易出错。

接下来,我为每个表运行了一个简单的(跨所有dbs)行数,以确认行数是相同的 - 它是。

然后我开始查看bin日志以进行复制。我可以看到应该在日志中清晰可见的更新语句,但更新从未运行过。

我需要知道的是:

  1. 复制破了吗?我假设它是
  2. 如果我创建新的从属服务器,我会遇到同样的问题吗?
  3. 如何在服务器上找出问题的严重程度?
  4. 感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

状态详细信息来自information_schema,它汇总了来自Mysql实例的数据库统计信息的数据,并且在每次执行时都不会保持不变。它可以被视为仅以字节为单位粗略估计数据大小,但对于索引和数据长度而言从不是精确值。它可用于估算但不用于交叉检查。对于复制,您可以检查主服务器上的slave io和sql是否正在运行。和relay-info你可能会看到master和slave的相应日志详细信息。

当然(1)做法是表EOD的计数(*)确保主表和从表上的表中的数据是否一致。但要准确(2)采取随机值字段并与主和从交叉检查。此外,如果你对它不满意,(3)你可以将它们带入outfile并采取差异或校验和。我更喜欢(1)和(2)。如果(1)不可能(2)仍然说服我。 ;)

答案 1 :(得分:0)

有一个工具可以验证名为pt-table-checksum

的复制

答案 2 :(得分:0)

如果您正在使用基于语句的复制,那么由于构造错误的INSERT语句,很容易在主服务器和从服务器上产生不同的结果。

INSERT SELECT没有ORDER BY,或ORDER BY可能留下非确定性结果的地方将导致奴隶与主分歧。

来自MySQL网站http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

  

SELECT语句返回行的顺序,不带   ORDER BY子句未确定。这意味着,在使用时   复制,不能保证这样的SELECT返回行   主人和奴隶的顺序相同;这可以导致   他们之间的不一致。为了防止这种情况发生,你   应始终编写INSERT ... SELECT语句   复制为INSERT ... SELECT ... ORDER BY列。的选择   列只要返回相同的顺序无关紧要   在主服务器和从服务器上强制执行行。另见章节   16.4.1.15,“复制和限制”。

如果发生这种情况,那么您的副本就会出现分歧,将它们重新排列的唯一安全方法是从最近的主数据库备份中重建它们。最糟糕的部分是错误可能永远不会导致复制失败,但结果是不一致的。通常,当UPDATE或DELETE语句影响不同于主数据库的行数时复制失败,这是令人困惑的,因为它不是实际导致错误的UPDATE,而我知道解决问题的唯一方法是检查每个INSERT查询代码库!