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

top*_*eap 8 mysql replication sql-update

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

我最初的想法是:

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

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

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

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

我需要知道的是:

  1. 是复制坏了吗?我假设是
  2. 如果我创建新的从服务器,我会遇到同样的问题吗?
  3. 如何在服务器上找出问题的严重程度?

任何帮助表示赞赏.

Mar*_*tin 1

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

\n\n

没有 ORDER BY 的 INSERT SELECT,或者 ORDER BY 可能留下不确定结果的情况将导致从站与主站的分歧。

\n\n

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

\n\n
\n

没有确定不带 ORDER BY 子句的 SELECT 语句返回行的顺序。这意味着,当使用复制时,不能保证这样的 SELECT 在主服务器和从服务器上以相同的顺序返回行;这可能会导致它们之间出现不一致。为了防止这种情况发生,您应该始终编写要复制为 INSERT ... SELECT ... ORDER BY 列的 INSERT ... SELECT 语句。只要在主服务器和从服务器上强制执行相同的返回行顺序,列的选择并不重要。另请参见第\n 16.4.1.15 节、\xe2\x80\x9cReplication 和 LIMIT\xe2\x80\x9d。

\n
\n\n

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

\n