加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

你所不明白的行复制 binlog_format=row

发布时间:2022-03-28 19:28:24 所属栏目:编程 来源:互联网
导读:你所不明白的行复制 binlog_format=row: ⒈ 本文目的:很多MySQL DBA 自认为对 mysql 的行复制有了很深刻的理解(这行复制不是初级 DBA 就该掌握的内容嘛,你怎么提这么低级的问题),那么接下来可能会出乎你的意料。 ⒉ 问题引出: 假设有A,B 两个数据库实
      你所不明白的行复制 binlog_format=row:

⒈ 本文目的:很多MySQL DBA 自认为对 mysql 的行复制有了很深刻的理解(这行复制不是初级 DBA 就该掌握的内容嘛,你怎么提这么低级的问题),那么接下来可能会出乎你的意料。
  
⒉ 问题引出:
 
     假设有A,B 两个数据库实例, A (主) ->B (从)
 
⑴ 第一问:
 
① 在主库上建立表结构如下(特别注意这里有唯一键,没主键):
 
    CREATE TABLE `test` (   `a` int(11) DEFAULT NULL,   `b` int(11) NOT NULL,   `c` varchar(20) DEFAULT NULL,   UNIQUE KEY `b_uique` (`b`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
 
②  接下,我们在主库A 上做一个操作:
 
    update test set c='333ab' where b=2;
 
⑵ 第二问:
 
① 在主库上建立表结构如下(特别注意这里有主键与唯一键):
 
     CREATE TABLE `test1` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `a` int(11) NOT NULL,   `b` int(11) NOT NULL,   `c` varchar(20) DEFAULT NULL,   PRIMARY KEY (`id`),   UNIQUE KEY `b` (`b`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
 
②  接下,我们在主库A 上做一个操作:
 
    update test set c='333ab' where b=2;
 
请回答: B 库主从是出现 1032 的错误呢,还是主从复制正常,如果正常,那么 B 库 test 表的数据是什么?
 
⒊ 问题分析与结论:
 
 
先别急着看答案,我们来看( 主库 ) 解析 update 行复制 binlog 打印的是什么?
 
BEGIN /*!*/; # at 4255 #190228 20:59:13 server id 212493307  end_log_pos 4307 CRC32 0x902463fc         Table_map: `bcd`.`test1` mapped to number 340 # at 4307 #190228 20:59:13 server id 212493307  end_log_pos 4382 CRC32 0x06b71e7b         Update_rows: table id 340 flags: STMT_END_F ### UPDATE `bcd`.`test1` ### WHERE ###   @1=3 /* INT meta=0 nullable=0 is_null=0 */ ###   @2=3 /* INT meta=0 nullable=0 is_null=0 */ ###   @3=3 /* INT meta=0 nullable=0 is_null=0 */ ###   @4='33333' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */ ### SET ###   @1=3 /* INT meta=0 nullable=0 is_null=0 */ ###   @2=3 /* INT meta=0 nullable=0 is_null=0 */ ###   @3=3 /* INT meta=0 nullable=0 is_null=0 */ ###   @4='3aaa33' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */ # at 4382 #190228 20:59:13 server id 212493307  end_log_pos 4413 CRC32 0x9b13368e         Xid = 14175 COMMIT/*!*/; 没错,他记录了 原来行的内容,这里原来行是 (3,3,3,'33333') 然后被改成了 (3,3,3,'3aaa33');
 
系统自动生成的主键,不参与复制,不能定位一行
 
那么上面的问题,各位看官可以答出来了吗?
 
问题一:B 库不会出现 1032 的错误,最终从库 B 的数据是 (3,2,'333ab')
 
问题二:B 库会出现 1032 的错误,最终 B 库的数据是 (2,2,2,'222')

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读