【问题标题】:Mysql Master-Slave reaplication with AUTO_INCREMENT primary key带有AUTO_INCREMENT主键的Mysql主从复制
【发布时间】:2018-10-12 07:24:10
【问题描述】:

问题在于标准 Mysql Master-Slave 设置(从属只读,二进制日志记录设置为 ROW),当在主表中插入一行时,主表具有自动递增主键,并且这一行,例如,得到ID 4288996,当在从站复制相同的插入时,同一行得到不同的ID 例如4289032(因为insert没有主键值,是自动生成的)。

现在在Master的这一行发出UPDATE语句时问题就出现了:

#180430 18:00:12 server id 1  end_log_pos 429933 CRC32 0xd0d85778
Update_rows: table id 260 flags: STMT_END_F
### UPDATE `cmon`.`simple_alarm`
### WHERE
###   @1=4288996
### SET
###   @13=1525104012
###   @15=1
# at 429933
#180430 18:00:12 server id 1  end_log_pos 429964 CRC32 0xdc9f3fa4       Xid = 452035

因为Slave上不存在同一行(ID不同):

'无法在表 cmon.simple_alarm 上执行 Update_rows 事件;在“simple_alarm”中找不到记录,错误代码:1032;处理程序错误 HA_ERR_KEY_NOT_FOUND;事件的主日志 xxxxx_bin_log.000003, end_log_pos 429933'

我知道为什么会出现这个问题,但我不知道如何解决?

【问题讨论】:

  • 主从具有不同的 auto_incremented P.K 本身是另一个问题。我认为您应该在调试此问题之前完全同步两个表,包括 P.K 字段及其 auto_increment 值。但是下面的答案可能会解决我强烈建议您创建与相同复制设置完全相同的新从属设备并尝试您的更新语句,看看它是否是泄漏的异步问题。
  • 我刚刚发现每个从站单独决定是否调用更改。如果从属设备中已经存在新的 id,则无法调用更改

标签: mysql master-slave


【解决方案1】:

已知问题

MySQL 8.0 Reference Manual / ... / Replication and AUTO_INCREMENT 17.4.1.1

调用触发器或函数的语句会导致更新 AUTO_INCREMENT 列未使用正确复制 基于语句的复制。这些语句被标记为不安全。 (错误 #45677)

尝试基于行的日志记录或混合类型。也许会解决的。

【讨论】:

  • 不幸的是,我已经在使用基于 ROW 的日志记录,并且出现了同样的问题:binlog_format = ROW
  • @Goran 你试过 cmets 里的东西了吗?
  • 是的,我多次同步从站到主站。并且一旦将新条目添加到 cmon.simple_alarm 表就会发生异步。我正在使用以下步骤:percona.com/doc/percona-xtrabackup/2.4/howtos/…
  • 你能插入新行并在两个表上运行它,看看结果是否相同?选择 LAST_INSERT_ID();
  • 不要再次指定 auto_incremented id(我认为这是 KEY)
猜你喜欢
  • 2012-12-05
  • 2018-05-02
  • 1970-01-01
  • 2011-06-15
  • 2020-03-09
  • 2015-03-08
  • 2013-03-16
  • 2011-03-06
  • 2013-01-03
相关资源
最近更新 更多