深入理解MySQL主從原理
內容描述
在超大規模流量的分佈式系統環境下,無論是從系統性能的角度,還是從數據安全性的角度,掌握MySQL主從原理,都是當下技術人員的必備基本功。MySQL主從原理是高可用架構的基石,即便是MGR這種集群架構也可以看到主從的影子。要解決一個問題或者故障,最快的方式就是瞭解它的原理,快速定位問題。本書從源碼層面抽絲剝繭般地描述MySQL主從原理,全面地介紹了GTID相關的知識點,並解析了主要Event的生成、作用和格式,以及線程的初步知識、MDL LOCK、排序等熱門話題和主從相關的案例。無論是MySQL DBA和MySQL源碼愛好者,還是剛進入數據庫行業的小白讀者,通過閱讀本書,都能通過源碼級分析,更好地理解和使用MySQL主從復制技術。
目錄大綱
第1章GTID 1
1.1 GTID的基本概念1
1.1.1 GTID的作用1
1.1.2 GTID的基本表示1
1.1.3 server_uuid的生成2
1.1.4 GTID的生成2
1.1.5 GTID_EVENT和PREVIOUS_GTIDS_LOG_EVENT簡介3
1.1.6 gtid_executed表的作用4
1.2 mysql.gtid_executed表、gtid_executed變量、gtid_purged變量的修改時機5
1.2.1定義5
1.2.2主庫修改時機7
1.2.3從庫修改時機8
1.2.4通用修改時機10
1. 2.5通用修改時機源碼函數簡析10
1.3 GTID模塊初始化簡介和參數binlog_gtid_simple_recovery 11
1.3.1 GTID模塊初始化流程圖12
1.3.2步驟解析13
1.4 GTID中的運維16
1.4.1跳過一個事務17
1.4.2 mysqldump導出行為的改變17
1.4.3搭建GTID AUTO_POSITION MODE的主從18
1.4.4主從切換20
1.4.5參數gitd_mode的含義21
1.4.6在線開啟GTID 21
1.4.7離線開啟GTID 22
1.4.8開啟GTID的注意事項23
1.4.9統計值ONGOING_ANONYMOUS_TRANSACTION_COUNT的變更時機23
1.4.10設置MASTER_AUTO_POSITION = 1的影響25
1.4.11離線開啟GTID丟失數據的測試25
第2章Event 28
2.1 binary log Event的總體格式28
2.1.1引言28
2.1.2 binary log綜述28
2.1 .3 Event的總體格式29
2.1.4 Event header和Event footer 29
2.1.5具體解析30
2.1.6本書涉及的Event類型31
2.2重點Event之FORMAT_DESCRIPTION_EVENT和PREVIOUS_GTIDS_LOG_EVENT 32
2. 2.1 FORMAT_DESCRIPTION_EVENT 32
2.2.2 PREVIOUS_GTIDS_LOG_EVENT 35
2.3重點Event之GTID_EVENT 39
2.3.1 GTID_EVENT的作用39
2.3.2源碼重要接口40
2.3.3主體格式40
2.3.4簡單解析41
2.3.5生成時機41
2.3.6 ANONYMOUS_GTID_EVENT 41
2.3.7 GTID的三種模式42
2.4重點Event之QUERY_EVENT和MAP_EVENT 43
2.4.1 QUERY_EVENT 43
2.4.2 MAP_EVENT 46
2.5重點Event之WRITE_EVENT和DELETE_EVENT 51
2.5.1 WRITE_EVENT 51
2.5.2 DELETE_EVENT 57
2.6重點Event之UPDATE_EVENT和XID_EVENT 61
2.6.1 UPDATE_ROWS_EVENT 61
2 .6.2 XID_EVENT 66
2.7參數binlog_row_image的影響68
2.7.1參數影響68
2.7.2過濾方式70
2.7.3 DML Event中的標識70
2.8巧用Event發現問題73
2.8.1工具簡介73
2.8.2分析長期未提交的事務74
2.8.3分析大事務75
2.8.4分析binary log中Event的生成速度75
2.8.5分析每個表生成了多少個DML Event 75
2.8.6工具展示75
第3章主庫79
3.1 binlog cache簡介79
3.1.1 binlog cache綜述79
3.1.2使用binlog cache的流程80
3.1.3參數binlog_cache_size的作用及其初始化80
3.1. 4臨時文件的分配和使用81
3.1.5參數max_binlog_cache_size的作用82
3.1.6如何觀察到臨時文件82
3.2事務Event的生成和寫入流程83
3.2.1流程綜述83
3 .2.2刪除階段流程85
3.2.3提交階段流程85
3.2.4兩個注意點86
3.3 MySQL層事務提交流程簡析86
3.3.1參數設置86
3.3. 2總體流程圖87
3.3.3步驟解析第一階段90
3.3.4步驟解析第二階段(FLUSH階段) 90
3.3.5步驟解析第三階段(SYNC階段) 92
3.3. 6步驟解析第四階段(COMMIT階段) 93
3.3.7步驟解析第五階段94
3.3.8提交階段的注意點95
3.4基於WRITESET的並行複制方式95
3.4.1奇怪的last commit 96
3.4.2 WRITESET是什麼96
3.4.3 WRITESET的生成97
3.4.4 add_pke函數的流程98
3.4.5 WRITESET設置對last commit的處理方式99
3.4.6 WRITESET的歷史MAP 100
3.4.7 WRITESET的並行複制對last commit的處理流程100
3.4.8 WRITESET_SESSION的方式104
3.4.9關於參數binlog_transaction_dependency_history_size的說明104
3.4.10沒有主鍵的情況104
3.4.11為什麼同一個session執行的事務能生成同樣的last commit 105
3.4.12 WRITESET並行複制方式的優缺點105
3.5主庫的DUMP線程106
3.5.1 POSITION MODE和GTID AUTO_POSITION MODE的不同點106
3.5.2流程圖108
3.5.3步驟解析109
3.5.4重點說明112
3.6 DUMP線程查找和過濾GTID的基本算法113
3.6.1環境假設113
3.6.2檢查從庫的GTID是否大於主庫的GTID 114
3.6.3檢查需要的binary log是否已經清理114
3.6.4實際掃描binary log 115
3.6.5 GTID過濾115
第4章從庫117
4.1從庫MTS多線程並行回放(一) 117
4.1.1 MTS綜述117
4.1.2協調線程的分發機制118
4.1 .3步驟解析120
4.1.4並行回放判定一例124
4.2從庫MTS多線程並行回放(二) 126
4.2.1工作線程執行Event 126
4.2.2 MTS檢查點中的重要概念127
4.2.3 MTS中執行檢查點的流程132
4.2.4 MTS的關鍵點136
4.3 MTS中的“gap”測試和參數lave_preservecommit order 136
4.3.1 MTS中的“gap ”測試136
4.3.2參數slave_preserve_commit_order的影響138
4.4從庫的I/O線程139
4.4.1引入139
4.4.2 I/O線程的啟動流程圖140
4.4.3流程解析142
4.5從庫的SQL線程(MTS協調線程)和參數sql_slave_skip_counter 146
4.5.1 SQL線程的功能146
4.5.2流程圖146
4.5.3重要步驟說明148
4.5 .4各個Event做了什麼151
4.6從庫數據的查找和參數slave_rows_search_algorithms 153
4.6.1從一個例子出發153
4.6.2確認查找數據的方式156
4.6.3 ROW_LOOKUP_HASH_SCAN方式的數據查找159
4.6.4從庫數據查找的要點161
4.7從庫的關閉和異常恢復流程162
4.7.1正常的stop slave流程162
4.7.2 stop slave為什麼會慢163
4.7.3從庫啟動需要讀取的信息164
4.7.4關於repository表的事務性165
4.7.5相關參數166
4.7.6恢復流程167
4.8安全高效的從庫設置170
4.8.1從庫參數設置建議170
4.8.2單SQL線程模式171
4.8.3 MTS 174
4.8.4一個非安全設置的例子176
4.8.5參數sync_relay_log的影響177
4.9從庫Seconds_Behind_Master的計算方式177
4.9.1 Seconds_Behind_Master的計算方式178
4.9.2影響Seconds_Behind_Master的因素178
4.9.3不同操作計算延遲的方式181
4.9.4 MTS中Seconds_Behind_Master計算誤差測試181
4.9.5手動修改系統時間導致Seconds_Behind_Master為0 183
4.10 Seconds_Behind_Master延遲場景歸納185
4.10.1延遲場景185
4.10.2相關測試186
4.10.3延遲診斷的方法論189
第5章案例解析190
5.1線程簡介和MySQL調試環境搭建190
5.1.1線程簡介190
5.1.2 PID、LWP ID、Thread TID 192
5. 1.3 MySQL線程和系統LWP ID的關係193
5.1.4調試環境的搭建194
5.1.5調試環境的使用197
5.2 MySQL排序詳細解析198
5.2.1為什麼要討論排序198
5.2.2從一個問題出發199
5.2.3測試案例200
5.2.4階段1:確認排序字段及順序202
5.2.5階段2:計算sort字段長度202
5.2.6階段3:計算額外字段的空間203
5.2.7階段4:確認每行的長度205
5.2.8階段5:確認最大內存分配206
5.2.9階段6:讀取數據進行內存排序207
5.2.10階段7:排序方式總結輸出210
5.2.11階段8:進行最終排序211
5.2.12排序的其他問題212
5.2.13使用OPTIMIZER_TRACE查看排序信息214
5.2. 14回到問題本身215
5.2.15答疑217
5.3 MySQL中的MDL Lock簡介219
5.3.1 MDL Lock綜述219
5.3.2重要數據結構和概念220
5.3.3為MDL Lock增加打印函數225
5.3.4在合適的位置增加打印函數227
5.3.5常見MDL Lock類型的加鎖測試229
5.4奇怪的FTWRL堵塞案例237
5.4.1兩個不同的現象237
5.4.2 sleep函數生效點239
5.4.3 FTWRL做了什麼工作240
5.4.4例5-3步驟解析242
5.4.5例5-4步驟解析243
5.4 .6 FTWRL堵塞和被堵塞的簡單總結244
5.5產生大量小relay log故障案例245
5.5.1案例現象245
5.5.2參數slave_net_timeout分析245
5.5.3原因剖析246
5.5 .4案例模擬246
5.5.5實現方式248
5.6從庫system lock原因簡析250
5.6.1 binary log的寫入時間和Event中的時間250
5.6.2問題由來251
5.6.3從庫system lock延遲的原因251
5.6.4 system lock問題分析252
5.6.5模擬測試253
作者介紹
高鵬(網名八怪),現任中亦安圖科技有限公司數據庫專家,2008年開始從事Oracle/MySQL相關工作,Oracle OCM、MySQL源碼愛好者,知數堂8期學員。
有豐富的數據庫性能調優、故障診斷經驗。