舉報

會員
深入理解MySQL主從原理
高鵬 著
更新時間:2021-04-16 16:30:21
開會員,本書免費讀 >
最新章節:
封底
在超大規模流量的分布式系統環境下,無論是從系統性能的角度,還是從數據安全性的角度,掌握MySQL主從原理,都是當下技術人員的必備基本功。MySQL主從原理是高可用架構的基石,即便是MGR這種集群架構也可以看到主從的影子。要解決一個問題或者故障,最快的方式就是了解它的原理,快速定位問題。本書從源碼層面抽絲剝繭般地描述MySQL主從原理,全面地介紹了GTID相關的知識點,并解析了主要Event的生成、作用和格式,以及線程的初步知識、MDLLOCK、排序等熱門話題和主從相關的案例。
最新章節
- 封底
- 5.6.5 模擬測試
- 5.6.4 system lock問題分析
- 5.6.3 從庫system lock延遲的原因
- 5.6.2 問題由來
- 5.6.1 binary log的寫入時間和Event中的時間
上架時間:2021-04-16 15:13:12
出版社:電子工業出版社
上海閱文信息技術有限公司已經獲得合法授權,并進行制作發行
- 封底 更新時間:2021-04-16 16:30:21
- 5.6.5 模擬測試
- 5.6.4 system lock問題分析
- 5.6.3 從庫system lock延遲的原因
- 5.6.2 問題由來
- 5.6.1 binary log的寫入時間和Event中的時間
- 5.6 從庫system lock狀態原因簡析
- 5.5.5 實現方式
- 5.5.4 案例模擬
- 5.5.3 原因剖析
- 5.5.2 參數slave_net_timeout分析
- 5.5.1 案例現象
- 5.5 產生大量小relay log故障案例
- 5.4.6 FTWRL堵塞和被堵塞的簡單總結
- 5.4.5 例5-4步驟解析
- 5.4.4 例5-3步驟解析
- 5.4.3 FTWRL做了什么工作
- 5.4.2 sleep 函數生效點
- 5.4.1 兩個不同的現象
- 5.4 奇怪的FTWRL堵塞案例
- 5.3.5 常見MDL Lock類型的加鎖測試
- 5.3.4 在合適的位置增加打印函數
- 5.3.3 為MDL Lock增加打印函數
- 5.3.2 重要數據結構和概念
- 5.3.1 MDL Lock綜述
- 5.3 MySQL中的MDL Lock簡介
- 5.2.15 答疑
- 5.2.14 回到問題本身
- 5.2.13 使用OPTIMIZER_TRACE查看排序信息
- 5.2.12 排序的其他問題
- 5.2.11 階段8:進行最終排序
- 5.2.10 階段7:排序方式總結輸出
- 5.2.9 階段6:讀取數據進行內存排序
- 5.2.8 階段5:確認最大內存分配
- 5.2.7 階段4:確認每行的長度
- 5.2.6 階段3:計算額外字段的空間
- 5.2.5 階段2:計算sort字段長度
- 5.2.4 階段1:確認排序字段及順序
- 5.2.3 測試案例
- 5.2.2 從一個問題出發
- 5.2.1 為什么要討論排序
- 5.2 MySQL排序詳細解析
- 5.1.5 調試環境的使用
- 5.1.4 調試環境的搭建
- 5.1.3 MySQL線程和系統LWP ID的關系
- 5.1.2 PID、LWP ID、Thread TID
- 5.1.1 線程簡介
- 5.1 線程簡介和MySQL調試環境搭建
- 第5章 案例解析
- 4.10.3 延遲診斷的方法論
- 4.10.2 相關測試
- 4.10.1 延遲場景
- 4.10 Seconds_Behind_Master延遲場景歸納
- 4.9.5 手動修改系統時間導致Seconds_Behind_Master為0
- 4.9.4 MTS中Seconds_Behind_Master計算誤差測試
- 4.9.3 不同操作計算延遲的方式
- 4.9.2 影響Seconds_Behind_Master的因素
- 4.9.1 Seconds_Behind_Master的計算方式
- 4.9 從庫Seconds_Behind_Master的計算方式
- 4.8.5 參數sync_relay_log的影響
- 4.8.4 一個非安全設置的例子
- 4.8.3 MTS
- 4.8.2 單SQL線程模式
- 4.8.1 從庫參數設置建議
- 4.8 安全高效的從庫設置
- 4.7.6 恢復流程
- 4.7.5 相關參數
- 4.7.4 關于repository表的事務性
- 4.7.3 從庫啟動需要讀取的信息
- 4.7.2 stop slave為什么會慢
- 4.7.1 正常的stop slave流程
- 4.7 從庫的關閉和異常恢復流程
- 4.6.4 從庫數據查找的要點
- 4.6.3 ROW_LOOKUP_HASH_SCAN方式的數據查找
- 4.6.2 確認查找數據的方式
- 4.6.1 從一個例子出發
- 4.6 從庫數據的查找和參數slave_rows_search_algorithms
- 4.5.4 各個Event做了什么
- 4.5.3 重要步驟說明
- 4.5.2 流程圖
- 4.5.1 SQL線程的功能
- 4.5 從庫的SQL線程(MTS協調線程)和參數sql_slave_skip_counter
- 4.4.3 流程解析
- 4.4.2 I/O線程的啟動流程圖
- 4.4.1 引入
- 4.4 從庫的I/O線程
- 4.3.2 參數slave_preserve_commit_order的影響
- 4.3.1 MTS中的“gap”測試
- 4.3 MTS中的“gap”測試和參數lave_preserve_commit_order
- 4.2.4 MTS的關鍵點
- 4.2.3 MTS中執行檢查點的流程
- 4.2.2 MTS檢查點中的重要概念
- 4.2.1 工作線程執行Event
- 4.2 從庫MTS多線程并行回放(二)
- 4.1.4 并行回放判定一例
- 4.1.3 步驟解析
- 4.1.2 協調線程的分發機制
- 4.1.1 MTS綜述
- 4.1 從庫MTS多線程并行回放(一)
- 第4章 從庫
- 3.6.5 GTID過濾
- 3.6.4 實際掃描binary log
- 3.6.3 檢查需要的binary log是否已經清理
- 3.6.2 檢查從庫的GTID是否大于主庫的GTID
- 3.6.1 環境假設
- 3.6 DUMP線程查找和過濾GTID的基本算法
- 3.5.4 重點說明
- 3.5.3 步驟解析
- 3.5.2 流程圖
- 3.5.1 POSITION MODE和GTID AUTO_POSITION MODE的不同點
- 3.5 主庫的DUMP線程
- 3.4.12 WRITESET并行復制方式的優缺點
- 3.4.11 為什么同一個session執行的事務能生成同樣的last commit
- 3.4.10 沒有主鍵的情況
- 3.4.9 關于參數binlog_transaction_dependency_history_size的說明
- 3.4.8 WRITESET_SESSION的方式
- 3.4.7 WRITESET的并行復制對last commit的處理流程
- 3.4.6 WRITESET的歷史MAP
- 3.4.5 WRITESET設置對last commit的處理方式
- 3.4.4 add_pke函數的流程
- 3.4.3 WRITESET的生成
- 3.4.2 WRITESET是什么
- 3.4.1 奇怪的last commit
- 3.4 基于WRITESET的并行復制方式
- 3.3.8 提交階段的注意點
- 3.3.7 步驟解析第五階段
- 3.3.6 步驟解析第四階段(COMMIT階段)
- 3.3.5 步驟解析第三階段(SYNC階段)
- 3.3.4 步驟解析第二階段(FLUSH階段)
- 3.3.3 步驟解析第一階段
- 3.3.2 總體流程圖
- 3.3.1 參數設置
- 3.3 MySQL層事務提交流程簡析
- 3.2.4 兩個注意點
- 3.2.3 提交階段流程
- 3.2.2 刪除階段流程
- 3.2.1 流程綜述
- 3.2 事務Event的生成和寫入流程
- 3.1.6 如何觀察到臨時文件
- 3.1.5 參數max_binlog_cache_size的作用
- 3.1.4 臨時文件的分配和使用
- 3.1.3 參數binlog_cache_size的作用及其初始化
- 3.1.2 使用binlog cache的流程
- 3.1.1 binlog cache綜述
- 3.1 binlog cache簡介
- 第3章 主庫
- 2.8.6 工具展示
- 2.8.5 分析每個表生成了多少個DML Event
- 2.8.4 分析binary log中Event的生成速度
- 2.8.3 分析大事務
- 2.8.2 分析長期未提交的事務
- 2.8.1 工具簡介
- 2.8 巧用Event發現問題
- 2.7.3 DML Event中的標識
- 2.7.2 過濾方式
- 2.7.1 參數影響
- 2.7 參數binlog_row_image的影響
- 2.6.2 XID_EVENT
- 2.6.1 UPDATE_EVENT
- 2.6 重點Event之UPDATE_EVENT和XID_EVENT
- 2.5.2 DELETE_EVENT
- 2.5.1 WRITE_EVENT
- 2.5 重點Event之WRITE_EVENT和DELETE_EVENT
- 2.4.2 MAP_EVENT
- 2.4.1 QUERY_EVENT
- 2.4 重點Event之QUERY_EVENT和MAP_EVENT
- 2.3.7 GTID的三種模式
- 2.3.6 ANONYMOUS_GTID_EVENT
- 2.3.5 生成時機
- 2.3.4 簡單解析
- 2.3.3 主體格式
- 2.3.2 源碼重要接口
- 2.3.1 GTID_EVENT的作用
- 2.3 重點Event之GTID_EVENT
- 2.2.2 PREVIOUS_GTIDS_LOG_EVENT
- 2.2.1 FORMAT_DESCRIPTION_EVENT
- 2.2 重點Event之 FORMAT_DESCRIPTION_EVENT和PREVIOUS_GTIDS_LOG_EVENT
- 2.1.6 本書涉及的Event類型
- 2.1.5 具體解析
- 2.1.4 Event header和Event footer
- 2.1.3 Event的總體格式
- 2.1.2 binary log綜述
- 2.1.1 引言
- 2.1 binary log Event 的總體格式
- 第2章 Event
- 1.4.11 離線開啟GTID丟失數據的測試
- 1.4.10 設置MASTER_AUTO_POSITION = 1的影響
- 1.4.9 統計值ONGOING_ANONYMOUS_TRANSACTION_COUNT的變更時機
- 1.4.8 開啟GTID的注意事項
- 1.4.7 離線開啟GTID
- 1.4.6 在線開啟GTID
- 1.4.5 參數gitd_mode的含義
- 1.4.4 主從切換
- 1.4.3 搭建GTID AUTO_POSITION MODE的主從
- 1.4.2 mysqldump導出行為的改變
- 1.4.1 跳過一個事務
- 1.4 GTID中的運維
- 1.3.2 步驟解析
- 1.3.1 GTID模塊初始化流程圖
- 1.3 GTID模塊初始化簡介和參數binlog_gtid_simple_recovery
- 1.2.5 通用修改時機源碼函數簡析
- 1.2.4 通用修改時機
- 1.2.3 從庫修改時機
- 1.2.2 主庫修改時機
- 1.2.1 定義
- 1.2 mysql.gtid_executed表、gtid_executed變量、gtid_purged變量的修改時機
- 1.1.6 gtid_executed表的作用
- 1.1.5 GTID_EVENT和PREVIOUS_GTIDS_LOG_EVENT簡介
- 1.1.4 GTID的生成
- 1.1.3 server_uuid的生成
- 1.1.2 GTID的基本表示
- 1.1.1 GTID的作用
- 1.1 GTID的基本概念
- 第1章 GTID
- 讀者服務
- 前言
- 專家贊譽
- 內容簡介
- 作者簡介
- 版權信息
- 封面
- 封面
- 版權信息
- 作者簡介
- 內容簡介
- 專家贊譽
- 前言
- 讀者服務
- 第1章 GTID
- 1.1 GTID的基本概念
- 1.1.1 GTID的作用
- 1.1.2 GTID的基本表示
- 1.1.3 server_uuid的生成
- 1.1.4 GTID的生成
- 1.1.5 GTID_EVENT和PREVIOUS_GTIDS_LOG_EVENT簡介
- 1.1.6 gtid_executed表的作用
- 1.2 mysql.gtid_executed表、gtid_executed變量、gtid_purged變量的修改時機
- 1.2.1 定義
- 1.2.2 主庫修改時機
- 1.2.3 從庫修改時機
- 1.2.4 通用修改時機
- 1.2.5 通用修改時機源碼函數簡析
- 1.3 GTID模塊初始化簡介和參數binlog_gtid_simple_recovery
- 1.3.1 GTID模塊初始化流程圖
- 1.3.2 步驟解析
- 1.4 GTID中的運維
- 1.4.1 跳過一個事務
- 1.4.2 mysqldump導出行為的改變
- 1.4.3 搭建GTID AUTO_POSITION MODE的主從
- 1.4.4 主從切換
- 1.4.5 參數gitd_mode的含義
- 1.4.6 在線開啟GTID
- 1.4.7 離線開啟GTID
- 1.4.8 開啟GTID的注意事項
- 1.4.9 統計值ONGOING_ANONYMOUS_TRANSACTION_COUNT的變更時機
- 1.4.10 設置MASTER_AUTO_POSITION = 1的影響
- 1.4.11 離線開啟GTID丟失數據的測試
- 第2章 Event
- 2.1 binary log Event 的總體格式
- 2.1.1 引言
- 2.1.2 binary log綜述
- 2.1.3 Event的總體格式
- 2.1.4 Event header和Event footer
- 2.1.5 具體解析
- 2.1.6 本書涉及的Event類型
- 2.2 重點Event之 FORMAT_DESCRIPTION_EVENT和PREVIOUS_GTIDS_LOG_EVENT
- 2.2.1 FORMAT_DESCRIPTION_EVENT
- 2.2.2 PREVIOUS_GTIDS_LOG_EVENT
- 2.3 重點Event之GTID_EVENT
- 2.3.1 GTID_EVENT的作用
- 2.3.2 源碼重要接口
- 2.3.3 主體格式
- 2.3.4 簡單解析
- 2.3.5 生成時機
- 2.3.6 ANONYMOUS_GTID_EVENT
- 2.3.7 GTID的三種模式
- 2.4 重點Event之QUERY_EVENT和MAP_EVENT
- 2.4.1 QUERY_EVENT
- 2.4.2 MAP_EVENT
- 2.5 重點Event之WRITE_EVENT和DELETE_EVENT
- 2.5.1 WRITE_EVENT
- 2.5.2 DELETE_EVENT
- 2.6 重點Event之UPDATE_EVENT和XID_EVENT
- 2.6.1 UPDATE_EVENT
- 2.6.2 XID_EVENT
- 2.7 參數binlog_row_image的影響
- 2.7.1 參數影響
- 2.7.2 過濾方式
- 2.7.3 DML Event中的標識
- 2.8 巧用Event發現問題
- 2.8.1 工具簡介
- 2.8.2 分析長期未提交的事務
- 2.8.3 分析大事務
- 2.8.4 分析binary log中Event的生成速度
- 2.8.5 分析每個表生成了多少個DML Event
- 2.8.6 工具展示
- 第3章 主庫
- 3.1 binlog cache簡介
- 3.1.1 binlog cache綜述
- 3.1.2 使用binlog cache的流程
- 3.1.3 參數binlog_cache_size的作用及其初始化
- 3.1.4 臨時文件的分配和使用
- 3.1.5 參數max_binlog_cache_size的作用
- 3.1.6 如何觀察到臨時文件
- 3.2 事務Event的生成和寫入流程
- 3.2.1 流程綜述
- 3.2.2 刪除階段流程
- 3.2.3 提交階段流程
- 3.2.4 兩個注意點
- 3.3 MySQL層事務提交流程簡析
- 3.3.1 參數設置
- 3.3.2 總體流程圖
- 3.3.3 步驟解析第一階段
- 3.3.4 步驟解析第二階段(FLUSH階段)
- 3.3.5 步驟解析第三階段(SYNC階段)
- 3.3.6 步驟解析第四階段(COMMIT階段)
- 3.3.7 步驟解析第五階段
- 3.3.8 提交階段的注意點
- 3.4 基于WRITESET的并行復制方式
- 3.4.1 奇怪的last commit
- 3.4.2 WRITESET是什么
- 3.4.3 WRITESET的生成
- 3.4.4 add_pke函數的流程
- 3.4.5 WRITESET設置對last commit的處理方式
- 3.4.6 WRITESET的歷史MAP
- 3.4.7 WRITESET的并行復制對last commit的處理流程
- 3.4.8 WRITESET_SESSION的方式
- 3.4.9 關于參數binlog_transaction_dependency_history_size的說明
- 3.4.10 沒有主鍵的情況
- 3.4.11 為什么同一個session執行的事務能生成同樣的last commit
- 3.4.12 WRITESET并行復制方式的優缺點
- 3.5 主庫的DUMP線程
- 3.5.1 POSITION MODE和GTID AUTO_POSITION MODE的不同點
- 3.5.2 流程圖
- 3.5.3 步驟解析
- 3.5.4 重點說明
- 3.6 DUMP線程查找和過濾GTID的基本算法
- 3.6.1 環境假設
- 3.6.2 檢查從庫的GTID是否大于主庫的GTID
- 3.6.3 檢查需要的binary log是否已經清理
- 3.6.4 實際掃描binary log
- 3.6.5 GTID過濾
- 第4章 從庫
- 4.1 從庫MTS多線程并行回放(一)
- 4.1.1 MTS綜述
- 4.1.2 協調線程的分發機制
- 4.1.3 步驟解析
- 4.1.4 并行回放判定一例
- 4.2 從庫MTS多線程并行回放(二)
- 4.2.1 工作線程執行Event
- 4.2.2 MTS檢查點中的重要概念
- 4.2.3 MTS中執行檢查點的流程
- 4.2.4 MTS的關鍵點
- 4.3 MTS中的“gap”測試和參數lave_preserve_commit_order
- 4.3.1 MTS中的“gap”測試
- 4.3.2 參數slave_preserve_commit_order的影響
- 4.4 從庫的I/O線程
- 4.4.1 引入
- 4.4.2 I/O線程的啟動流程圖
- 4.4.3 流程解析
- 4.5 從庫的SQL線程(MTS協調線程)和參數sql_slave_skip_counter
- 4.5.1 SQL線程的功能
- 4.5.2 流程圖
- 4.5.3 重要步驟說明
- 4.5.4 各個Event做了什么
- 4.6 從庫數據的查找和參數slave_rows_search_algorithms
- 4.6.1 從一個例子出發
- 4.6.2 確認查找數據的方式
- 4.6.3 ROW_LOOKUP_HASH_SCAN方式的數據查找
- 4.6.4 從庫數據查找的要點
- 4.7 從庫的關閉和異常恢復流程
- 4.7.1 正常的stop slave流程
- 4.7.2 stop slave為什么會慢
- 4.7.3 從庫啟動需要讀取的信息
- 4.7.4 關于repository表的事務性
- 4.7.5 相關參數
- 4.7.6 恢復流程
- 4.8 安全高效的從庫設置
- 4.8.1 從庫參數設置建議
- 4.8.2 單SQL線程模式
- 4.8.3 MTS
- 4.8.4 一個非安全設置的例子
- 4.8.5 參數sync_relay_log的影響
- 4.9 從庫Seconds_Behind_Master的計算方式
- 4.9.1 Seconds_Behind_Master的計算方式
- 4.9.2 影響Seconds_Behind_Master的因素
- 4.9.3 不同操作計算延遲的方式
- 4.9.4 MTS中Seconds_Behind_Master計算誤差測試
- 4.9.5 手動修改系統時間導致Seconds_Behind_Master為0
- 4.10 Seconds_Behind_Master延遲場景歸納
- 4.10.1 延遲場景
- 4.10.2 相關測試
- 4.10.3 延遲診斷的方法論
- 第5章 案例解析
- 5.1 線程簡介和MySQL調試環境搭建
- 5.1.1 線程簡介
- 5.1.2 PID、LWP ID、Thread TID
- 5.1.3 MySQL線程和系統LWP ID的關系
- 5.1.4 調試環境的搭建
- 5.1.5 調試環境的使用
- 5.2 MySQL排序詳細解析
- 5.2.1 為什么要討論排序
- 5.2.2 從一個問題出發
- 5.2.3 測試案例
- 5.2.4 階段1:確認排序字段及順序
- 5.2.5 階段2:計算sort字段長度
- 5.2.6 階段3:計算額外字段的空間
- 5.2.7 階段4:確認每行的長度
- 5.2.8 階段5:確認最大內存分配
- 5.2.9 階段6:讀取數據進行內存排序
- 5.2.10 階段7:排序方式總結輸出
- 5.2.11 階段8:進行最終排序
- 5.2.12 排序的其他問題
- 5.2.13 使用OPTIMIZER_TRACE查看排序信息
- 5.2.14 回到問題本身
- 5.2.15 答疑
- 5.3 MySQL中的MDL Lock簡介
- 5.3.1 MDL Lock綜述
- 5.3.2 重要數據結構和概念
- 5.3.3 為MDL Lock增加打印函數
- 5.3.4 在合適的位置增加打印函數
- 5.3.5 常見MDL Lock類型的加鎖測試
- 5.4 奇怪的FTWRL堵塞案例
- 5.4.1 兩個不同的現象
- 5.4.2 sleep 函數生效點
- 5.4.3 FTWRL做了什么工作
- 5.4.4 例5-3步驟解析
- 5.4.5 例5-4步驟解析
- 5.4.6 FTWRL堵塞和被堵塞的簡單總結
- 5.5 產生大量小relay log故障案例
- 5.5.1 案例現象
- 5.5.2 參數slave_net_timeout分析
- 5.5.3 原因剖析
- 5.5.4 案例模擬
- 5.5.5 實現方式
- 5.6 從庫system lock狀態原因簡析
- 5.6.1 binary log的寫入時間和Event中的時間
- 5.6.2 問題由來
- 5.6.3 從庫system lock延遲的原因
- 5.6.4 system lock問題分析
- 5.6.5 模擬測試
- 封底 更新時間:2021-04-16 16:30:21