深入理解MySQL主從原理

導讀

高鵬(網名八怪),《深入理解MySQL主從原理》系列文的作者。 本系列通過GTID、Event、主庫、從庫、案例分析,五大塊來詳細講解主從原理。

這篇文章重在學習筆記整理!

在學習《深入理解MySQL主從原理》一書時,有條件的可以跟著MySQL源碼一起學習,這樣有助于加深理解,單純閱讀該書,可能會感覺晦澀難懂、知識點繁多、看完就忘等等。

筆者有幸在自學該書時,接到一個關于MySQL主從復制相關的項目,所以調研了MySQL主從復制部分源碼,加深了筆者對該書的理解!

說明

筆記整理說明:

  • 每一個二級標題對應一篇博客,即每個二級標題對應一個跳轉鏈接。
  • 黑色標題不可跳轉。
  • 重要部分附帶MySQL源碼。
  • 博文鏈接尚未整理完,努力整理中。
  • 有需要的可訂閱MySQL主從復制專欄。
  • 需要對應章節PDF的可在對應文章下面留言。

數據庫就像一座礦山,挖掘得越深,收獲越多!


目錄

第 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_ROWS_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 模擬測試


封皮

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72975.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端數據模擬利器 Mock.js 深度解析

前端數據模擬利器 Mock.js 深度解析 一、Mock.js 核心價值 1.1 為何需要數據模擬 前后端并行開發加速接口文檔驅動開發異常場景模擬測試演示環境數據構造 1.2 Mock.js 核心能力 // 典型數據生成示例 Mock.mock(/api/user, {"users|5-10": [{"id|1": 1…

Phi-4-multimodal:圖、文、音頻統一的多模態大模型架構、訓練方法、數據細節

Phi-4-Multimodal 是一種參數高效的多模態模型,通過 LoRA 適配器和模式特定路由器實現文本、視覺和語音/音頻的無縫集成。訓練過程包括多階段優化,確保在不同模式和任務上的性能,數據來源多樣,覆蓋高質量網絡和合成數據。它的設計…

前后端數據加密傳輸【最佳方案】

AES和RSA區別 算法類型安全性密鑰長度/輸出長度速度應用場景AES對稱加密高128位、192位、256位快適用于大規模數據加密,入HTTPS協議的數據傳輸RSA非對稱加密高1024位、2048位、4096位較慢適用于數據安全傳輸、數字簽名和身份驗證 綜上:兼顧安全性和性能…

Unity--Cubism Live2D模型使用

了解LIVE2D在unity的使用--前提記錄 了解各個組件的作用 Live2D Manuals & Tutorials 這些文件都是重要的控制動畫參數的 Cubism Editor是編輯Live2D的工具,而導出的數據的類型,需要滿足以上的條件 SDK中包含的Cubism的Importer會自動生成一個Pref…

Linux | Vim 鼠標不能右鍵粘貼、跨系統復制粘貼

注:本文為 “ Vim 中鼠標右鍵粘貼、跨系統復制粘貼問題解決方案” 相關文章合輯。 未整理去重。 Linux 入門:vim 鼠標不能右鍵粘貼、跨系統復制粘貼 foryouslgme 發布時間 2016 - 09 - 28 10:24:16 Vim基礎 命令模式(command-mode)插入模式(insert-m…

Flink-DataStreamAPI-執行模式

一、概覽 DataStream API支持不同的運行時執行模式,我們可以根據用例的要求和作業的特征進行選擇。 STREAMING執行模式:被稱為“經典”執行模式為,主要用于需要持續增量處理并且預計無限期保持在線的無界作業BATCH執行模式:類似…

解決VScode 連接不上問題

問題 :VScode 連接不上 解決方案: 1、手動殺死VS Code服務器進程,然后重新嘗試登錄 打開xshell ,遠程連接服務器 ,查看vscode的進程 ,然后全部殺掉 [cxqiZwz9fjj2ssnshikw14avaZ ~]$ ps ajx | grep vsc…

C#類型轉換基本概念

一、基本定義? C# 類型轉換是將數據從一種類型轉換為另一種類型的過程,分為 ?隱式轉換? 和 ?顯式轉換? 兩類?。 強類型語言特性?:C# 要求變量類型在編譯時確定,類型轉換需滿足兼容性或顯式規則?。目的?:處理不同數據類…

使用阿里云操作系統控制臺排查內存溢出

引言 操作系統控制臺是阿里云最新推出的一款智能運維工具,專為提升運維效率、優化服務器管理而設計。它集成了多種運維管理功能,包括操作系統助手、插件管理器以及其他實用工具,為用戶提供一站式的運維解決方案。無論是個人開發者還是企業運…

(C/S)架構、(B/S)架構

客戶機/服務器(C/S)架構 理論描述: 客戶機/服務器架構是一種網絡架構風格,其中任務被分配給網絡中的不同計算機,以提高效率和靈活性。這種架構由兩部分組成:客戶端(Client)和服務器&…

混合存儲HDD+SSD機型磁盤陣列,配上SSD緩存功能,性能提升300%

企業日常運行各種文件無處不在,文檔、報告、視頻、應用數據......面對成千上萬的文件,團隊之間需要做到無障礙協作,員工能夠即時快速訪問、共享處理文件。隨著業務增長,數字化辦公不僅需要大容量,快速高效的文件訪問越…

C 語言異常處理方式全面解析

引言? 在 C 語言編程領域,穩健的錯誤處理機制對于保障程序的可靠性、穩定性以及安全性至關重要。異常處理作為錯誤處理的進階形式,雖然并非 C 語言標準庫原生支持的特性,但通過巧妙運用語言特性和編程技巧,開發者能夠實現有效的…

【每日學點HarmonyOS Next知識】狀態欄控制、片段按鈕點擊回調、繪制組件、取消按鈕與輸入框對齊、父調子組件方法

1、HarmonyOS 狀態欄怎么控制顯示于隱藏,設置狀態欄顏色,子顏色等控制? 顯示與隱藏 可以設置沉浸式,隱藏的話可以退出沉靜式,在子窗口打開的頁面 aboutToAppear 方法中設置沉浸式 aboutToAppear(): void {// 設置沉浸…

二級Python通關秘籍:字符串操作符/函數/方法全解析與實戰演練

第一章 字符串基礎概念與運算符速通 1.1 字符串的不可變性特性 在Python中,字符串被設計為immutable類型,任何修改操作都會生成新對象。這一特性直接影響字符串拼接的性能表現,建議使用join()方法代替多次操作。 1.2 基礎操作符全掌握 pyt…

GStreamer —— 2.6、Windows下Qt加載GStreamer庫后運行 - “教程6:媒體格式和Pad功能“(附:完整源碼)

運行效果 簡介 上一個教程演示了GUI 工具包集成(gtk)。本教程介紹媒體格式和Pad功能。Pad Capabilities 是 GStreamer 的一個基本元素,盡管大多數它們不可見,因為框架會處理它們 自然而然。這個有點理論性的教程展示了: ? 什么是 Pad 功能。…

【前綴和與差分 C/C++】洛谷 P8218 求區間和

2025 - 03 - 09 - 第 72 篇 Author: 鄭龍浩 / 仟濹 【前綴和與差分 C/C】 文章目錄 洛谷 P8218 求區間和題目描述輸入格式輸出格式輸入輸出樣例 #1輸入 #1輸出 #1 說明/提示思路代碼 洛谷 P8218 求區間和 題目描述 給定 n n n 個正整數組成的數列 a 1 , a 2 , ? , a n a_…

初識Bert

在學習Bert之前我們先了解“遞歸神經網絡(RNN Recurrent neural network)” 和 “長短期記憶(LSTM Long short-term memory)” 我們如果僅僅識別每個字的含義,那么在一句話中沒有相同的字還是可以的但是如果一句話中有相同的字,那…

clickhouse源碼分析

《ClickHouse源碼分析》 當我們談論數據庫時,ClickHouse是一個不容忽視的名字。它是一個用于聯機分析處理(OLAP)的列式數據庫管理系統(DBMS),以其快速的數據查詢能力而聞名。對于想要深入了解這個高效工具…

[網絡爬蟲] 動態網頁抓取 — Selenium 元素定位

🌟想系統化學習爬蟲技術?看看這個:[數據抓取] Python 網絡爬蟲 - 學習手冊-CSDN博客 在使用 Selenium 時,往往需要先定位到指定元素,然后再執行相應的操作。例如,再向文本輸入框中輸入文字之前,…

ArcGIS操作:15 計算點的經緯度,并添加到屬性表

注意:需要轉化為地理坐標系 1、打開屬性表,添加字段 2、計算字段(以計算緯度為例 !Shape!.centroid.Y ) 3、效果