您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“有哪些MySQL源碼系列問(wèn)題”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
一、trigger的event到底怎么回放的,為什么沒(méi)有主鍵沖突?
上次分享時(shí),介紹了trigger trx在binlog中events的順序
gtid event
query event
table_map_event(table1)
table_map_event(table2)
rows_event(table1)
rows_event(table2)
xid_event
實(shí)際在slave 進(jìn)行回放的時(shí)候,他走的就不是server層的創(chuàng)建連接,執(zhí)行語(yǔ)句了。而是直接調(diào)用每個(gè)event中的do_apply_event。比如table map event,它會(huì)將表的元信息保存起來(lái)。
到write_rows_event呢,slave 調(diào)用函數(shù)如下
|--do_exec_row
|--write_row
|-- handler::ha_write_row
|-- write_row
可以看到是調(diào)用了引擎層的innodb::write_row 將數(shù)據(jù)插進(jìn)去。
綜上我們可以看到,trigger trx 在slave 回放時(shí),實(shí)際是繞過(guò)了trigger,直接交予存儲(chǔ)引擎操作數(shù)據(jù)。因此也不會(huì)出現(xiàn)我們一開始說(shuō)的,主鍵沖突的問(wèn)題。
二、trx 實(shí)際的生成順序
我們說(shuō) trx是由event 構(gòu)成的。比如insert 語(yǔ)句,它包含的events 是gtid_log_event, query_log_event,
table_map_log_event, write_rows_log_event, xid_log_event
我們說(shuō)這些events是在最后trx 提交的時(shí)候生成的,實(shí)際不是哈,他們的實(shí)際生成順序如下:
Gtid event, Xid event 是在ordered_commit 函數(shù)里生成的。這個(gè)涉及到binlog 和redo log的一致性寫入問(wèn)題。
table map event 在 binlog_write_table_map 函數(shù)中生成,它接收了參數(shù) has trans 標(biāo)志是否是事務(wù),need_binlog_rows_query 是否要生成rows_query_log_event
在函數(shù)binlog_write_table_nap 函數(shù)中,會(huì)調(diào)用 binlog_start_trans_and_stmt, 在該函數(shù)中生成query_log_event
最后調(diào)用 write event 將所生成的event 緩存在thd 的binlog_chache 中。
生成順序: table_map_log_event, query_log_event, [rows_query_log_event]
緩存順序: query_log_event, [rows_query_log_event], table_map_log_event
接著生成xid event,最后在ordered_commit函數(shù)中生成gtid event,
statement 格式:
沒(méi)有table_map_event 和row_event 生成順序
生成順序:query_log_event(儲(chǔ)存語(yǔ)句), query_log_event(begin), xid event, gtid event
binlog_write_table_map 中生成table_map_event, 使用table_map_log_event的另一個(gè)構(gòu)造函數(shù),從table對(duì)象中獲取表信息,構(gòu)造table_map_log_event
接著調(diào)用 binlog_start_trans_and_stmt 生成query_log_event(query_log 中設(shè)計(jì)的regular trx 和 xa cases) 接著調(diào)用cache_data的write_event 將event 寫入。
“有哪些MySQL源碼系列問(wèn)題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。