首頁 > 資料庫 > mysql教程 > [MySQL Bug] 在RBR复制模式下使用Merge引擎导致备库Crash的bug

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-06-07 17:15:46
原創
1135 人瀏覽過

[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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
TP5.1首發教程和獨孤九劍的TP5教程區別
來自於 1970-01-01 08:00:00
0
0
0
有什麼經典的symfony1.2教程
來自於 1970-01-01 08:00:00
0
0
0
js進階教程
來自於 1970-01-01 08:00:00
0
0
0
怎麼沒有mui教程
來自於 1970-01-01 08:00:00
0
0
0
PHP靜態代理程式和動態代理程式教程
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板