【问题标题】:MYSQL replication does not work for all tablesMYSQL 复制不适用于所有表
【发布时间】:2017-09-21 13:15:12
【问题描述】:

我的 MySQL 复制有问题 - 主服务器上有一个表,它没有出现在从服务器上。 master和slave都有相同的master_log_file和master_log_position,slave_io和slave_sql线程都在运行,我什至尝试向master数据库添加一个空表,但它确实出现在slave数据库上。这不是我第一次遇到这样的错误,但在此之前我的症状是新数据没有出现在从数据库中。除了停止从属服务器上的复制、删除数据库、将其转储到主服务器上、同步到从属服务器并从新文件/位置重新启动复制之外,还有其他解决方案吗?

我注意到使用

SHOW SLAVE STATUS;

Relay_Log_Pos 小于 Read_Master_Log_Pos 和 Relay_Log_File 不同于 Master_Log_File 但 Slave_SQL_Running_State 说

Slave has read all relay log; waiting for more updates

Seconds_Behind_Master 说 0。

【问题讨论】:

  • 首先,Relay_Log_Pos 和 Read_Master_Log_Pos 是不同的值,可以不同,没关系。对于您的复制:您是否使用相同的 mysql 版本和配置?如果您运行依赖于其他服务器不支持/被禁用的功能的语句,您可能会遇到这样的问题。您是否尝试过为未复制的表创建一个相同的表(具有不同的名称)以检查该表是否使用了在从站上不起作用的东西?
  • 是否为replicate_do_db/replicate_do_table 设置了任何值?这些在 my.cnf 中,将处于从属状态。重新同步很痛苦 - 同意。你是什​​么binlog_format?行,混合,陈述?用 mysqlbinlog 检查 binlog 的内容——确保它在里面,否则它肯定不会复制...
  • @KevinBott 我没有为 replicate_do_db 设置值,我在 master 端使用 binlog_do_db 过滤它们,我的 binlog_format 是混合的。
  • @Solarflare - 我使用不同的版本(主服务器上的 5.5.55,从服务器上的 5.7.13)因为复制服务器不只复制一个服务器,我有不同的复制通道,但其他的工作正好。我会尝试用同一张桌子和另一个名字来做这个
  • 可能就是这样,5.5->5.7 a) 不(官方)支持 b) 5.7。在很多事情上可能表现不同,因此不再支持某些语句(可能取决于您的配置设置)。您是否使用--slave-skip-errors-option 运行您的从属服务器(或者您是否可能在发生导致从属服务器停止的错误后手动重新启动它)?

标签: mysql replication


【解决方案1】:

MySQL 官方只支持复制到下一个更高版本(虽然它适用于 5.7.13+),见Replication Compatibility Between MySQL Versions

MySQL 支持从一个版本系列复制到下一个更高版本系列。例如,您可以从运行 MySQL 5.5 的主服务器复制到运行 MySQL 5.6 的从服务器,从运行 MySQL 5.6 的主服务器复制到运行 MySQL 5.7 的从服务器,等等。

但是,如果主服务器使用语句或依赖从服务器上使用的 MySQL 版本不再支持的行为,则从较旧的主服务器复制到较新的从服务器时,您可能会遇到困难。。 p>

默认情况下,如果发生错误,复制将停止,您必须重新启动它(修复错误后)。但是,如果您使用--slave-skip-errors=all-选项,它将跳过这些错误:

通常,当从属设备上发生错误时,复制会停止,这使您有机会手动解决数据中的不一致问题。当语句返回选项值中列出的任何错误时,此选项会导致从 SQL 线程继续复制。

除非您完全理解为什么会出错,否则不要使用此选项。如果您的复制设置和客户端程序中没有错误,并且 MySQL 本身没有错误,那么停止复制的错误永远不会发生。不加选择地使用此选项会导致从站与主站完全不同步,而您不知道为什么会发生这种情况。

MySQL 5.5。和 5.7。对于许多语句,实际上会表现出不同的行为,因此在这种情况下启用此选项将需要更加小心。

在没有看到您实际的table create-statement 的情况下,尚不清楚究竟是什么导致了该问题以及如何解决它(或者如果可能的话),但您应该特别检查您的配置设置。 MySQL 5.7。 enables strict mode by default,因此通常怀疑不兼容是例如日期/时间戳列的默认值为零,例如 default '0000-00-00'(显式或隐式),不再允许,请参阅 no_zero_date

即使您似乎不太热衷于 100% 复制(这可能会很快滚雪球,但这取决于您对您的场景进行评估),至少一次重置您的从属设备(在修复例如配置设置之后)可能是最简单的解决方案,因为您可能遗漏了其他一些事情,并且如果执行没有错误,还将再次检查您的表和数据是否与您的 5.7-slave 兼容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多