深入理解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.mzph.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、效果