>  기사  >  데이터 베이스  >  [MySQL Bug] 在RBR复制模式下使用Merge引擎导致备库Crash的bug

[MySQL Bug] 在RBR复制模式下使用Merge引擎导致备库Crash的bug

WBOY
WBOY원래의
2016-06-07 17:15:461060검색

[MySQL Bug] 在RBR复制模式下使用Merge引擎导致备库Crash的bug,而在table_def::compatible_with中:can_convert_field_to(field,

最近碰到一个很蛋疼的BUG,使用merge引擎,row模式下复制,极大的概率crash备库。

我的测试环境是5.1的主库,5.5的备库

test case:

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里的定义和实际打开表的定义是否相容。

而在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见

linux

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.