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

回放binlog故障一则 ERROR 105042S01 Table already exists

发布时间:2022-03-25 15:39:58 所属栏目:编程 来源:互联网
导读:〇 现象: 在通过binlog增量恢复数据时,报错1050。 〇 版本: MySQL 5.5.x 及以下 ,低版本的MySQL 5.6.x (在5.6的高版本中测试,无法复现,疑似被修复) 〇 原因: binlog记录了执行出错的DDL语句,此处,具体DDL是CREATE VIEW $view_name AS ... 有点奇
     〇 现象:
    在通过binlog增量恢复数据时,报错1050。
    〇 版本:
    MySQL 5.5.x 及以下 ,低版本的MySQL 5.6.x (在5.6的高版本中测试,无法复现,疑似被修复)
    〇 原因:
    binlog记录了执行出错的DDL语句,此处,具体DDL是CREATE VIEW $view_name AS ...
 
     有点奇怪,难道执行错误了的DDL也会被记录到binlog中么?
 
〇 复现:
 
[17:52:45] root@localhost [a]> FLUSH LOGS;
Query OK, 0 rows affected (0.01 sec)
 
[17:52:47] root@localhost [a]> SHOW BINLOG EVENTS IN 'mysql55-bin.000006';
+--------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+--------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql55-bin.000006 | 4 | Format_desc | 55 | 107 | Server ver: 5.5.57-log, Binlog ver: 4 |
+--------------------+-----+-------------+-----------+-------------+---------------------------------------+
1 row in set (0.00 sec)
 
此时,再次检查binlog:
[17:53:24] root@localhost [a]> SHOW BINLOG EVENTS IN 'mysql55-bin.000006'G
*************************** 1. row ***************************
   Log_name: mysql55-bin.000006
        Pos: 4
 Event_type: Format_desc
  Server_id: 55
End_log_pos: 107
       Info: Server ver: 5.5.57-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql55-bin.000006
        Pos: 107
 Event_type: Query
  Server_id: 55
End_log_pos: 189
       Info: use `a`; CREATE TABLE t(id int)
*************************** 3. row ***************************
   Log_name: mysql55-bin.000006
        Pos: 189
 Event_type: Query
  Server_id: 55
End_log_pos: 369
       Info: use `a`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_t` AS SELECT * from t
*************************** 4. row ***************************
   Log_name: mysql55-bin.000006
        Pos: 369
 Event_type: Query
  Server_id: 55
End_log_pos: 549
       Info: use `a`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_t` AS SELECT * from t
4 rows in set (0.00 sec)
 
可以发现,第二次执行CREATE VIEW,即便在mysql client执行时报错,也被记录到binlog中。
自然,在通过mysqlbinlog重放binlog时,也会报错。
 
至于为何从库不报错,大概是因为sql thread会特殊处理这种error_code,不会执行。
而mysqlbinlog mysql-binlog.00000x | mysql -u -p -S 重放binlog的方式会报错。——大概是因为mysql这个client工具没有做对mysqlbinlog解析出来的error_code的特殊处理吧。
 
暂时不知道是否为bug,但高版本的MySQL5.6.x已经修正了该问题,5.7也如此。
 
因此,在可能出现问题的版本,通过binlog增量恢复数据时,可能需要特殊处理。

(编辑:核心网)

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

    热点阅读