[MySQL Bug] <=5.1.49 alter table rename 操作导致复制中断

简介:
在我们传统的认识里,MySQL对于alter操作是隐式提交的,也就是说,执行一条Alter会直接写入binlog,而不等待commit。
这种看法在大多数情况下是正确的,但有一个例外,也就是alter table rename操作,在MySQL5.1.50之前,如果你设置了autocommit = 0 , 该DDL不会隐式提交,直到你显式的commit。
有意思的是,官方的修复初衷并不因为这个bug,而是其他的一个debug版本的断言失败(详见 http://bugs.mysql.com/bug.php?id=54453
废话不多说,看test case:
session 1:
root@test 10:42:03>reset master;
Query OK, 0 rows affected (0.00 sec)
root@test 10:42:07>create table t1 (a int, b int);
Query OK, 0 rows affected (0.01 sec)
root@test 10:42:22>set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)
root@test 10:42:27>alter table t1 rename to __tmp_t1;
Query OK, 0 rows affected (0.01 sec)
session 2:
root@test 10:42:54>insert into __tmp_t1 values (1,2);
Query OK, 1 row affected (0.00 sec)
session 1:
root@test 10:42:44>commit;
Query OK, 0 rows affected (0.00 sec)
root@test 10:43:20>show binlog events;
+——————+—–+————-+———–+————-+———————————————–+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                          |
+——————+—–+————-+———–+————-+———————————————–+
| mysql-bin.000001 |   4 | Format_desc |       112 |         106 | Server ver: 5.1.48-log, Binlog ver: 4         |
| mysql-bin.000001 | 106 | Query       |       112 |         199 | use `test`; create table t1 (a int, b int)    |
| mysql-bin.000001 | 199 | Query       |       112 |         267 | BEGIN                                         |
| mysql-bin.000001 | 267 | Query       |       112 |         363 | use `test`; insert into __tmp_t1 values (1,2) |
| mysql-bin.000001 | 363 | Xid         |       112 |         390 | COMMIT /* xid=15 */                           |
| mysql-bin.000001 | 390 | Query       |       112 |         458 | BEGIN                                         |
| mysql-bin.000001 | 458 | Query       |       112 |         554 | use `test`; alter table t1 rename to __tmp_t1 |
| mysql-bin.000001 | 554 | Xid         |       112 |         581 | COMMIT /* xid=10 */                           |
+——————+—–+————-+———–+————-+———————————————–+
8 rows in set (0.00 sec)
看看binlog里的顺序:
use `test`; create table t1 (a int, b int)
BEGIN
use `test`; insert into __tmp_t1 values (1,2)
COMMIT /* xid=15 */
BEGIN
use `test`; alter table t1 rename to __tmp_t1
COMMIT /* xid=10 */
很显然,binlog里产生了乱序,insert语句在rename之前就插入到了__tmp_t1表里,在备库上自然会产生找不到表的错误,导致复制中断。
patch很简单,就是在mysql_alter_table里增加一行,来做一次commit。
Index: /PS5518/branches/my5148-r1207-bugfix/sql/sql_table.cc
===================================================================
— /PS5518/branches/my5148-r1207-bugfix/sql/sql_table.cc (revision 1264)
+++ /PS5518/branches/my5148-r1207-bugfix/sql/sql_table.cc (revision 1265)
@@ -6848,6 +6848,8 @@
     if (!error && (new_name != table_name || new_db != db))
     {
       thd_proc_info(thd, “rename”);
+
+      ha_autocommit_or_rollback(thd,0);
       /*
         Then do a ‘simple’ rename of the table. First we need to close all
         instances of ‘source’ table.
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 关系型数据库 MySQL
在阿里云的AnalyticDB MySQL版中使用CREATE TABLE语句来创建内表
在阿里云的AnalyticDB MySQL版中使用CREATE TABLE语句来创建内表【1月更文挑战第16天】【1月更文挑战第78篇】
585 3
|
存储 关系型数据库 MySQL
【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令及序列使用
【MySQL进阶之路丨第十三篇】一文带你精通MySQL之ALTER命令及序列使用
336 0
|
Oracle 关系型数据库 MySQL
MySQL复制表结构create table as与like的区别
MySQL复制表结构create table as与like的区别
653 0
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
458 0
|
SQL 关系型数据库 MySQL
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
2373 56
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
|
关系型数据库 MySQL 索引
开心档之MySQL ALTER命令
开心档之MySQL ALTER命令
189 0
|
SQL 关系型数据库 MySQL
(十八)MySQL排查篇:该如何定位并解决线上突发的Bug与疑难杂症?
前面《MySQL优化篇》、《SQL优化篇》两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”,而对于线上遇到的“疑难杂症”,需要通过理性的思维去分析问题、排查问题、定位问题,最后再着手解决问题,同时,如果解决掉所遇到的问题或瓶颈后,也可以在能力范围之内尝试最优解以及适当考虑拓展性。
1743 3
|
关系型数据库 MySQL 数据库
在 MySQL 中使用 Alter Table
【8月更文挑战第11天】
2926 0
在 MySQL 中使用 Alter Table
|
SQL 关系型数据库 MySQL
MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
这篇文章介绍了如何解决MySQL中“不能在FROM子句中指定更新的目标表”(You can't specify target table for update in FROM clause)的错误,提供了错误描述、需求说明、错误做法和正确的SQL写法。
3161 0
|
关系型数据库 MySQL 数据库
【MySQL】MySQL数据库的delete from table和truncate table之间的区别
【MySQL】MySQL数据库的delete from table和truncate table之间的区别
2129 1

推荐镜像

更多