[MySQL Bug] 在RBR复制模式下使用Merge引擎导致备库Crash的bug
来源:互联网 发布:阿拉伯帝国版图 知乎 编辑:程序博客网 时间:2024/06/05 04:34
转载请署名:印风
---------------------------------------------
最近碰到一个很蛋疼的BUG,使用merge引擎,row模式下复制,极大的概率crash备库。
我的测试环境是5.1的主库,5.5的备库
test case:
create table m1 (a int primary key, b int) engine=myisam;create table m2 (a int primary key, b int) engine=myisam;create table mm (a int primary key , b int) engine=mrg_myisam INSERT_METHOD=LAST UNION=(m1,m2);insert into mm values (1,2);
crash的原因非常简单,实际上在很早之前这个bug就fix了(MySQL Bug#47103), 可能是官方疏忽,又或者是Merge存储引擎用的人少,没有将这个patch backport到5.5中。
以下是个简单的介绍。
我们知道每个Binlog的行事件都有一个table_map_event。
在函数Table_map_log_event::do_apply_event中,会根据table map event的内容初始化table_list结构体,并构建table_list->m_tabledef。
这里的table_list->m_tabledef.m_field_metadata是被分配内存的。然后将该table_list挂到rli->tables_to_lock上
而在函数Rows_log_event::do_apply_event中,当调用open_and_lock_tables实际打开表时,还会打开相依赖的子表,并将这些table_list挂到rli->tables_to_lock之后(链接指针为next_global),但要注意,这里打开的依赖字表时,其table_list->m_tabledef.m_field_metadata实0x0,并没有分配空间
随后,在打开表后,要检查table map里的定义和实际打开表的定义是否相容。
7663 RPL_TABLE_LIST *ptr= rli->tables_to_lock; 7664 for ( ; ptr ; ptr= static_cast<RPL_TABLE_LIST*>(ptr->next_global)) 7665 { 7666 TABLE *conv_table; 7667 if (!ptr->m_tabledef.compatible_with(thd, const_cast<Relay_log_info*>(rli), 7668 ptr->table, &conv_table))
而在table_def::compatible_with中:
can_convert_field_to(field, type(col), field_metadata(col), rli, m_flags, &order)
其中type和field_metadata都会涉及到对m_field_metadata的引用,因此直接产生段错误,导致crash。
官方的fix见http://lists.mysql.com/commits/86326
- [MySQL Bug] 在RBR复制模式下使用Merge引擎导致备库Crash的bug
- mysql limit 使用不当导致的bug
- MySQL5.1.48后可能会导致crash的bug
- Python write模式导致的bug
- mysql innodb引擎 关于分区表的bug
- Solaris 64bit (Sparc) 平台下,oracle 软件的bug ,实例启动248天会导致 db 或者asm crash
- QtCreator下复制文件夹的一个BUG
- QQ牧场在高速模式下的一些小bug
- css文字重复ie bug导致文字的奇怪复制
- 20140829-复制粘贴网上代码导致的bug
- if导致的bug
- snprintf 导致的bug
- 粗心导致的bug
- munmap导致的BUG
- 触发了MySQL一个bug导致进程不断crash重启
- 在windows2012 R2下安装oracle 11.2.0.4的GI时遇到的问题--bug导致
- cuda 4.0 在vs2010下使用的Bug解除
- 每天在制造bug,了解下bug的状态
- 应该被记住的8位Java人物
- 数据结构 - 把二元查找树转变成排序的双向链表(C++)
- Oracle alter table详解
- debug--Flex图片加载不成功,缺少远程团队与本地团队的协调
- C语言面试题收集
- [MySQL Bug] 在RBR复制模式下使用Merge引擎导致备库Crash的bug
- 九度1018 统计同成绩学生人数
- 图书分享
- Overload与Override的区别
- c#中实现存储图片到SQLServer2005
- ClearCase 常用命令
- XML(9) Anatomy of DTD
- 二维数组和指向指针的指针
- Java基础之集合框架(二)--TreeSet、泛型