当前位置: 首页 > news >正文

MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结

文章目录

  • MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结
    • 一、MySQL 主备基本原理
      • (一)主备切换流程
      • (二)主备数据同步流程
    • 二、binlog 格式及相关问题
      • (一)binlog 的三种格式
      • (二)格式对比与选择
    • 三、循环复制问题及解决
      • (一)循环复制现象
      • (二)解决逻辑
    • 四、总结与思考

MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结

在 MySQL 数据库的世界里,主备一致性是确保数据可靠性和高可用性的关键。就深入探讨 MySQL 是如何保证主备一致的,这涉及到 binlog 的多种格式、主备复制的详细流程以及双 M 结构下的循环复制问题等诸多重要知识点。


一、MySQL 主备基本原理

(一)主备切换流程

在这里插入图片描述

  1. 状态 1

    :如图 1 所示,客户端的读写直接访问节点 A,节点 B 作为 A 的备库,通过同步 A 的更新来保持数据一致。此时,建议将备库 B 设置为只读(readonly)模式,原因如下:

    • 防止运营类查询语句在备库上的误操作
    • 避免切换逻辑出现 bug,如双写导致主备不一致。
    • 可依据 readonly 状态判断节点角色
    • 设置为 readonly,那主库怎么和备库进行同步?同步更新的线程拥有超级(super)权限,仍可进行数据同步。
  2. 状态 2:当需要切换时,客户端读写访问切换到节点 B,节点 A 成为 B 的备库。

(二)主备数据同步流程

在这里插入图片描述

  1. 备库设置:在备库 B 上通过 change master 命令设置主库 A 的相关信息,包括 IP、端口、用户名、密码以及 binlog 的起始位置(包含文件名和日志偏移量),然后执行 start slave 命令启动图中 io_threadsql_thread 两个线程。其中 io_thread 负责与主库建立连接。
  2. 主库操作:主库 A 校验完用户名和密码后,按照备库 B 的请求位置读取 binlog,并将其发送给 B。
  3. 备库接收与执行:备库 B 收到 binlog 后,写入本地中转日志(relay log),sql_thread 读取 relay log,解析并执行其中的命令。

二、binlog 格式及相关问题

(一)binlog 的三种格式

如果要在表中删除一行数据的话,我们来看看这个delete语句的binlog是怎么记录的。

mysql> CREATE TABLE `t` (
`id` int(11) NOTNULL,
`a` int(11) DEFAULTNULL,
`t_modified` timestamp NOTNULL DEFAULTCURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `a` (`a`),
KEY `t_modified`(`t_modified`)
) ENGINE=InnoDB;
insert into t values(1,1,'2018-11-13');
insert into t values(2,2,'2018-11-12');
insert into t values(3,3,'2018-11-11');
insert into t values(4,4,'2018-11-10');
insert into t values(5,5,'2018-11-09');
  1. statement 格式:记录 SQL 语句原文,例如执行delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1语句时,binlog 中会如实记录该 SQL 语句,包括自动添加的use 'test'命令(确保在备库能正确更新到指定库的表),同时还会记录注释等信息。然而,这种格式可能导致主备数据不一致,如上述 delete 语句,若主库和备库使用不同索引执行,可能删除不同行。

    在这里插入图片描述

  2. row 格式:不记录 SQL 语句原文,而是通过 Table_mapDelete_rows 等事件来定义操作。例如上述 delete 语句,会记录操作的表信息(Table_map event)以及删除行为(Delete_rows event),且会记录真实删除行的主键 id,保证备库执行时删除正确的行。此外,对于 insert 和 update 语句,row 格式的 binlog 也会记录足够信息以便数据恢复,如 insert 语句会记录所有字段信息,update 语句会记录修改前和修改后的整行数据。

    在这里插入图片描述

    该事务从8900开始,通过mysqlbinlog -vvdata/master.000001 --start-position=8900;指令,查看

    在这里插入图片描述

    binlog里面记录了真实删除行的主键id,这样 binlog传到备库去的时候,就肯定会删除id=4的行,不会有主备删除不同行的问题。

    为什么会有mixed格式的binlog?

    有些statement格式的binlog虽然简单但可能会导致主备不一致,所以要使用row格式。但row格式又比较占用空间,所以算是一种折中的办法。mixed格式可以利用statment格式的优点,同时又避免了数据不一致的风险。

  3. mixed 格式:MySQL 会判断 SQL 语句是否可能引起主备不一致,若有可能则使用 row 格式,否则使用 statement 格式,是一种折中的方案。但在某些情况下,如执行insert into t values(10,10, now())时,虽可能存在主备不一致风险,但仍会记录为 statement 格式,不过会通过 SET TIMESTAMP 命令约定 now () 函数的返回时间,确保主备数据一致性。

    在这里插入图片描述

(二)格式对比与选择

  1. 数据恢复优势:row 格式在数据恢复方面具有明显优势,可通过反转操作恢复误执行的 delete、insert 或 update 语句,而 statement 格式相对较难实现精确恢复。
  2. 空间占用与性能:row 格式占用空间较大,写 binlog 时耗费 IO 资源,影响执行速度;statement 格式占用空间小,但可能存在数据不一致风险。因此,越来越多的场景推荐使用 row 格式的 binlog,不过也可根据实际情况选择 mixed 格式,而一般不建议使用单纯的 statement 格式。

三、循环复制问题及解决

(一)循环复制现象

在双 M 结构中,业务逻辑在节点 A 更新语句后生成 binlog 发给节点 B,B 执行后也生成 binlog,若节点 A 同时是节点 B 的备库,可能会导致循环执行更新语句,即循环复制。

在这里插入图片描述

(二)解决逻辑

  1. server id 设置:规定两个库的 server id 必须不同,否则不能设定为主备关系。
  2. binlog 生成规则:备库在重放 binlog 过程中生成与原 binlog 的 server id 相同的新 binlog
  3. 日志接收判断:每个库收到主库发来的日志后,先判断 server id,若与自己相同则直接丢弃,从而避免循环复制。例如,节点 A 更新事务的 binlog 记有 A 的 server id,传给节点 B 执行后,B 生成的 binlog 的 server id 也是 A 的 server id,再传回 A 时,A 会因 server id 相同而不处理该日志。

四、总结与思考

MySQL 通过 binlog 实现主备同步,binlog 的三种格式各有优劣,在保证主备一致性方面发挥着关键作用。主备复制流程涉及多个步骤和线程协作,双 M 结构虽有循环复制问题,但可通过 server id 机制解决。

相关文章:

MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结

文章目录 MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的&#xff1f;——阅读总结一、MySQL 主备基本原理&#xff08;一&#xff09;主备切换流程&#xff08;二&#xff09;主备数据同步流程 二、binlog 格式及相关问题&#xff08;一&#xff09;binlog 的三种格式&#…...

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果...

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介 登录模块很简单&#xff0c;前端发送账号密码的表单&#xff0c;后端接收验证后即可~ 淦&#xff01;可是我想多了&#xff0c;于是有了以下几个问题&#xff08;里面还包含网络安全问题&#xff09;&#xff1a; 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端…...

golang调用模组程序实现交互输入自动化,获取imei及iccid

应用场景&#xff1a;在openwrt下调用移远的测试程序&#xff0c;并实现输入自动话&#xff0c;获取imei rootOpenWrt:~# ql-api-test Test groups:0: ql_dsi1: ql_nw2: ql_sim3: ql_dev4: ql_voice5: ql_sms6: ql_adc7: ql_i2c8: …...

ACE之单例

单例簇 使用双重锁检查优化 #mermaid-svg-RMOXQ0KMo0VnJe7V {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-RMOXQ0KMo0VnJe7V .error-icon{fill:#552222;}#mermaid-svg-RMOXQ0KMo0VnJe7V .error-text{fill:#552222…...

泷羽sec学习打卡-云技术基础1-docker

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于云技术基础的那些事儿-Base1 一、云技术基础什么是云架构&#xff1f;什么是云服务&#xff1f;什么…...

7天掌握SQL - 第一天:数据库基础与SQL入门

目标 在本章节中&#xff0c;我们将学习数据库的基本概念和SQL语言的基础操作&#xff0c;为后续的深入学习打下坚实的基础。 一级目录 数据库基本概念SQL语言基础SQL操作实践推荐资源总结 1. 数据库基本概念 1.1 表&#xff08;Table&#xff09; 表是数据库中存储数据的…...

A037-基于Spring Boot的二手物品交易的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…...

【异常记录】Junitmock之InvalidUseOfMatchersException异常

mock之InvalidUseOfMatchersException异常 新手小白对mock一知半解&#xff0c;就开始自测了&#xff0c;被这个InvalidUseOfMatchersException困扰了一晚上。排查了好久&#xff0c;大多数文章都把英文翻译了一遍&#xff0c;但自检无问题。最后发现是&#xff0c;注入的时候…...

Spring Boot3自定义starter

1、加入必要依赖 plugins {id javaid org.springframework.boot version 3.2.6id io.spring.dependency-management version 1.1.5 } group org.example.test.starter version 1.1.0jar{enabledtrue// resolveMainClassName }java {toolchain {languageVersion JavaLanguage…...

掌控 Solidity:事件日志、继承和接口的深度解析

Solidity 是以太坊智能合约的主要编程语言&#xff0c;它的强大之处在于能够帮助开发者构建安全、高效的去中心化应用。在我参与的多个项目中&#xff0c;事件日志、继承和接口这三个概念始终贯穿其中&#xff0c;成为构建复杂智能合约的关键技术。今天就来聊聊Solidity中的错误…...

新手教学系列——善用 VSCode 工作区,让开发更高效

引言 作为一名开发者,你是否曾经在项目中频繁地切换不同文件夹,打开无数个 VSCode 窗口?特别是当你同时参与多个项目或者处理多个模块时,这种情况更是家常便饭。很快,你的任务栏上挤满了 VSCode 的小图标,切换起来手忙脚乱,工作效率直线下降。这时候,你可能会问:“有…...

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库&#xff0c;欢迎各位来进行使用与给予一些更好的建议&#x1f60a; 概述&#xff1a;该组件组件库用于提供虚拟化列表能力的组件&#xff0c;用于解决展示大量数据渲染时首屏渲…...

WebRTC实现双端音视频聊天(Vue3 + SpringBoot)

目录 概述 相关概念 双端连接整体实现步骤概述 文章代码实现注意点 STUN和TURN服务器的搭建 开发过程描述 后端开发流程 前端开发流程 效果演示 Gitee源码地址 概述 文章描述使用WebRTC技术实现一对一音视频通话。 由于设备摄像头限制&#xff08;一台电脑作测试无法…...

第6章详细设计-6.9 PCB审查

6.9 PCB审查 6.9.1 布局阶段注意事项1.结构设计要求在PCB布局之前弄清楚产品的结构2.布局要求 6.9.2 布线注意事项6.9.3 接地处理&#xff08;1&#xff09;射频链路接地。&#xff08;2&#xff09;腔壳接地孔。&#xff08;3&#xff09;螺钉放置&#xff08;需要了解结构知识…...

docker与大模型(口语化原理和实操讲解)

文章目录 一、镜像images1&#xff09;下载安装2&#xff09;docker images相关命令(保存、删除、上传、别名、搜索镜像) 二、容器container1&#xff09;展现所有在跑的容器服务ps2&#xff09;start /restart / kill / stop /rm3&#xff09;exec /cp4&#xff09;run/create…...

Linux之vim模式下全选命令

在Linux系统中&#xff0c;使用Vim编辑器进行全选操作可以通过以下几种方式实现&#xff1a; 1.使用键盘快捷键 按下 ”ggVG”&#xff08;先按下”g”&#xff0c;再按下”g”&#xff0c;再按下”V”&#xff0c;最后按下”G”&#xff09;可以全选当前文件内容。其中 ”g…...

云原生周刊:Kubernetes v1.32 要来了

开源项目推荐 Woodpecker Woodpecker 是一款轻量级且功能强大的 CI/CD 引擎&#xff0c;以其高度可扩展性和易用性著称。它支持多种版本控制系统与编程语言&#xff0c;能够灵活适配不同开发流程&#xff0c;帮助团队实现高效的持续集成与交付。无论是个人项目还是大型团队&a…...

# JVM学习

JVM JVM是什么&#xff1f; Java虚拟机&#xff08;JVM&#xff09; 是一个抽象的计算机&#xff0c;它是一个运行时环境&#xff0c;用于执行Java字节码或编译后的Java程序。JVM屏蔽了底层操作系统的差异&#xff0c;使得Java程序可以在任何支持JVM的操作系统上运行。 JVM能…...

【代码随想录day33】【C++复健】62.不同路径;63. 不同路径 II;343. 整数拆分;96.不同的二叉搜索树

感觉dp的题真的很适合背&#xff0c;当然不是死记硬背&#xff0c;而是当做一种模板题&#xff0c;出来一道新的题就往模板题上面去靠&#xff0c;如果套对模板的话剩下的事情其实就简单了。所以只要看一遍解法知道大致思路其实就够了&#xff0c;毕竟大部分dp的代码也不算难写…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...