【MySQL】重放binlog故障一则 ERROR 1050 (42S01) : Table '' already exists
发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,〇 现象: 在通过binlog增量恢复数据时,报错1050。〇 版本: MySQL 5.5.x 及以下 ,低版本的MySQL 5.6.x (在5.6的高版本中测试,无法复现,疑似被修复)〇 原因: b
千家信息网最后更新 2024年11月30日【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安全错误
数据库的锁怎样保障安全
怀旧服服务器开放日期
vc 高并发 数据库6
前端数据如何添加到数据库
中国电信软件开发测评题
寿县网络安全咨询
数据库11g怎么卸载
志霸三国手游服务器
软件开发的时间
畅享20无法连接服务器
千业互联网科技短视频变现
数据库应用技术形考任务4答案
网络安全手抄报的简介怎么写
监控室网络安全
河南省全民素质网络安全竞赛答案
网络技术研究所所长什么级别
软件开发制定质量标准
nas文件存在数据库
数据库get(1)
小红书点赞贴未连接到服务器
谷歌商店怎样更换服务器
安徽综合软件开发价格走势
房山dell服务器回收多少钱
福建机架式服务器什么价位
数据库创建不能为空的语句
网络技术霸权图片
佛山软件开发有哪些
现代软件开发实验报告
联想服务器x3650无法启动
杭州既学即用网络技术有限公司
闵行区环保网络技术