【MySQL】重放binlog故障一则 ERROR 1050 (42S01) : Table '' already exists
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,〇 现象: 在通过binlog增量恢复数据时,报错1050。〇 版本: MySQL 5.5.x 及以下 ,低版本的MySQL 5.6.x (在5.6的高版本中测试,无法复现,疑似被修复)〇 原因: b
千家信息网最后更新 2025年11月07日【MySQL】重放binlog故障一则 ERROR 1050 (42S01) : Table '' already exists
〇 现象:
在通过binlog增量恢复数据时,报错1050。
〇 版本:
MySQL 5.5.x 及以下 ,低版本的MySQL 5.6.x (在5.6的高版本中测试,无法复现,疑似被修复)
〇 原因:
binlog记录了执行出错的DDL语句,此处,具体DDL是CREATE VIEW $view_name AS ...
有点奇怪,难道执行错误了的DDL也会被记录到binlog中么?
〇 复现:
此时,再次检查binlog:
可以发现,第二次执行CREATE VIEW,即便在mysql client执行时报错,也被记录到binlog中。
自然,在通过mysqlbinlog重放binlog时,也会报错。
但在复制结构中,从实例不会重放该events,故从库不会报错。
重新通过mysqlbinlog解析日志得到:
至于为何从库不报错,大概是因为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增量恢复数据时,可能需要特殊处理。
〇 现象:
在通过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)
- [17:53:13] root@localhost [a]> CREATE TABLE t(id int);
- Query OK, 0 rows affected (0.01 sec)
- [17:53:18] root@localhost [a]> CREATE VIEW v_t AS SELECT * from t;
- Query OK, 0 rows affected (0.00 sec)
- [17:53:21] root@localhost [a]> CREATE VIEW v_t AS SELECT * from t;
- ERROR 1050 (42S01): Table 'v_t' already exists
此时,再次检查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时,也会报错。
但在复制结构中,从实例不会重放该events,故从库不会报错。
重新通过mysqlbinlog解析日志得到:
- # at 107
- #180206 17:53:18 server id 55 end_log_pos 189 Query thread_id=13 exec_time=0 error_code=0
- use `a`/*!*/;
- SET TIMESTAMP=1517910798/*!*/;
- SET @@session.pseudo_thread_id=13/*!*/;
- SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
- SET @@session.sql_mode=0/*!*/;
- SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
- /*!\C utf8 *//*!*/;
- SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
- SET @@session.lc_time_names=0/*!*/;
- SET @@session.collation_database=DEFAULT/*!*/;
- CREATE TABLE t(id int)
- /*!*/;
- # at 189
- #180206 17:53:21 server id 55 end_log_pos 369 Query thread_id=13 exec_time=0 error_code=0
- SET TIMESTAMP=1517910801/*!*/;
- CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_t` AS SELECT * from t
- /*!*/;
- # at 369
- #180206 17:53:22 server id 55 end_log_pos 549 Query thread_id=13 exec_time=0 error_code=1050
- SET TIMESTAMP=1517910802/*!*/;
- CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_t` AS SELECT * from t
- /*!*/;
至于为何从库不报错,大概是因为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增量恢复数据时,可能需要特殊处理。
版本
特殊
处理
增量
数据
语句
问题
会报
再次
原因
实例
工具
方式
日志
时报
标识
现象
结构
自然
错误
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
2021年日本海产品数据库
网络安全与管理的选题意义
湖北服务器虚拟化建设云空间
商业信息网络技术
工商管理软件开发技术方向
魔兽世界tbc火锤服务器
服务器配置防火墙
科普网络安全问题与对策
orical数据库 备份
建筑服务器怎么样
服务器驱动管理在哪里
竖锯网络技术
数据库漏扫PPT
华为交换机安装浪潮服务器
华诗图软件开发
嵌入式如何向数据库发数据
堡垒机和数据库审计
网络安全防护的四个基本原则
网络安全责任制督查
分保对服务器上架的要求
方舟创世怎么传送其他服务器
如果要禁止修改数据库中的表
erp服务器和主机的区别
学大数据好还是软件开发
三级数据库技术租赁表月租金
注册页面怎么连接数据库
西瓜视频测试网络安全
数据库列级约束唯一值
诚宇软件开发
网络安全法网评