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

MySQL 主备一致

MySQL 主备一致

  • 主备切换
  • binlog 格式
    • statement
    • row
    • mixed
    • 生产格式
  • 循环复制问题

主备切换

MySQL 主备切换流程 :

  • 状态 1 : 客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只将 A 的更新都同步过来 , 并本地执行。来保持节点 B 和 A 的数据是相同
  • 当切换成状态 2 : 客户端读写访问的都是节点 B,而节点 A 是 B的备库

在这里插入图片描述

建议将备库设为只读 (readonly) 模式

  • 一般查询语句会被放备库上查,设置为只读 , 能防止误操作
  • 防止切换逻辑有 bug,如 : 切换过程中出现双写,造成主备不一致
  • readonly 状态,能判断节点的角色
  • readonly 对超级 (super) 权限用户是无效,而同步更新的线程 (有超级权限)

主备流程图 :

  1. 备库 B 通过 change master 设置主库 A 的 IP、端口、用户名、密码,从哪个位置 (文件名 , 日志偏移量) 开始请求 binlog
  2. 备库 B 执行 start slave ,备库会启动两个线程 : io_thread (与主库建立连接 ) , sql_thread
  3. 主库 A 校验完用户名、密码后,开始按备库 B 传过来的位置,从本地读取 binlog,发给 B
  4. 备库 B 拿到 binlog 后,写到本地文件 (中转日志 (relay log) )
  5. sql_thread 读取中转日志,解析出日志里的命令,并执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27GKlVWK-1678357937872)(../png/%E4%B8%BB%E5%A4%87%E4%B8%80%E8%87%B4/image-20230224204616476.png)]

binlog 格式

binlog 有两种格式 :

  • statement
  • row
  • mixed : 前两种格式的混合

测试表/数据 :

CREATE TABLE `t` (`id` int(11) NOT NULL,`a` int(11) DEFAULT NULL,`t_modified` timestamp NOT NULL DEFAULT CURRENT_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');

查看 binlog 记录 delete 语句

delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1;

statement

statement : binlog 记录的 SQL 原语句

show binlog events in 'master.000001';

在这里插入图片描述

警告信息 :

  • statement 格式,delete 中带 limit,会认为该命令是 unsafe
show warnings;

在这里插入图片描述

statement : delete 带 limit,可能出现主备数据不一致 :

  • delete 用索引 a,就会删除 a=4 该行
  • 用索引 t_modified,那就删除 t_modified='2018-11-09’ ( a=5 该行 )
  • 当主库用索引 a;而备库用索引 t_modified 。就会出现主备不一致

row

row 格式 binlog :

  • row 的 binlog 没有 SQL 原语句,只能换成 :Table_map (操作表) , Delete_rows (删除的行为)

在这里插入图片描述

解析 binlog 内容 : 从 8900 位置开始

  • server id 1 : 该事务在 server_id=1 该库
  • Table_map : 显示打开的表,map 226 : 用于区分不同表
  • binlog_row_image 默认配置是 FULL,Delete_rows 会有删掉的行的所有字段的值 ; binlog_row_image = MINIMAL : 记录必要的信息,只记录 id=4 信息
  • 最后 Xid : 事务被正确提交
mysqlbinlog -vv data/master.000001 --start-position=8900;

在这里插入图片描述

binlog_format=row : binlog 记录真实删除行的主键 id,binlog 传到备库去,就肯定会删除 id=4 行,不会造成主备不一致问题

mixed

mixed : 即利用 statment 优点,又避免了数据不一致问题

  • MySQL 会判断该 SQL 是否可能引发主备不一致,可能就用 row 格式,否则就用 statement 格式

  • row 的缺点 : 很占存储。如 : delete 删掉 10 万行数据 , 0 万条记录都写到 binlog

  • statement : SQL 记录到 binlog ,仅占用几十个字节

mixed 格式的特别点 :

 insert into t values(10, 10, now());

该 SQL 用 statement 格式 : 炸一看会引发主备不一致

在这里插入图片描述

用 mysqlbinlog 查看 :

  • 其中 : SETTIMESTAMP=1546103491 : 约定 now() 的返回时间
  • 依然能保障主备数据的一致性

在这里插入图片描述

生产格式

生产环境依然用 row 格式 , 其原因 : 利于恢复数据

各CUD 的恢复角度 :

  • delete : 会把删掉的整行信息保存起来。所以当执行完一条 delete 后,发现删错数据了,就在 binlog 中记录的 delete 转成 insert,把错删的数据插入就可以恢复
  • insert : 会记录所有的字段信息,能精准确定刚插入的那行数据。只要将 insert 转成 delete ,删除掉被误插入数据就行
  • update : 会记录修改前整行的数据和修改后的整行数据。只要将 event 前后的信息对调下,再去进行更新恢复

循环复制问题

生产环境使用比较多的是双 M 结构 : 节点 A 和 B 之间总是互为主备关系

在这里插入图片描述

双 M 结构有个循环复制问题 :

  • 建议参数 : log_slave_updates = on : 备库执行 relay log 后生成 binlog
  • 节点 A 更新一条语句,再生成 binlog 发给节点 B,节点 B 执行完更新语句 , 也会生成 binlog
  • 而节点 A 同时又是节点 B 的备库 : 会把节点 B 新生成的 binlog 拿过来执行一次

解决循环复制问题 :

  • 两个节点的 server id 必须不同 (或者不能成为主备关系)
  • binlog 中记录该命令第一次执行时 , 所在实例的 server id
  • 备库接到 binlog 并重放时,生成原 binlog 的 server id 相同的新 binlog
  • 备库 binlog 后,会先判断 server id,当与自己相同,表示该 binlog 是自己生成,就直接丢弃该 binlog

具体流程 :

  1. 节点 A 更新数据,binlog 记录 A 的 server id
  2. 传到节点 B 执行后,节点 B 生成的 binlog 的 server id 就是 A 的 server id
  3. 再传给节点 A,A 判断该 server id 是否与自己的相同,当相同就不执行该日志
  4. 死循环在这里就断掉

相关文章:

MySQL 主备一致

MySQL 主备一致主备切换binlog 格式statementrowmixed生产格式循环复制问题主备切换 MySQL 主备切换流程 : 状态 1 : 客户端的读写都直接访问节点 A&#xff0c;而节点 B 是 A 的备库&#xff0c;只将 A 的更新都同步过来 , 并本地执行。来保持节点 B 和 A 的数据是相同当切换…...

玩转CodeQLpy之用友GRP-U8漏洞挖掘

0x01 前言CodeQLpy是作者使用python3实现的基于CodeQL的java代码审计工具&#xff0c;github地址https://github.com/webraybtl/CodeQLpy。通过CodeQLpy可以辅助代码审计人员快速定位代码中的问题&#xff0c;目前支持对SprintBoot的jar包&#xff0c;SpringMVC的war包&#xf…...

GMP调度模型总结

优秀文章 什么是GMP调度模型 Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务&#xff0c;将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。 什么是Goroutine Goroutine Golang Coro…...

蓝桥回文日期题

题目 题目描述 2020 年春节期间&#xff0c;有一个特殊的日期引起了大家的注意&#xff1a;2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202&#xff0c;恰好是一个回文数。我们称这样的日期是回文日期。 有人表示 20200202 是 “千年…...

【2023】某python语言程序设计跟学第三周内容

目录1.数字类型与操作&#xff1a;整数&#xff1a;浮点数&#xff1a;复数数值运算操作符数字之间关系数值运算函数2.案例&#xff1a;天天向上的力量第一问&#xff1a;1‰的力量第二问&#xff1a;5‰和1%的力量第三问&#xff1a;工作日的力量第四问&#xff1a;工作日的努…...

c++11右值引发的概念

右值引用右值&&左值c11增加了一个新的类型&#xff0c;右值引用&#xff0c;记作&#xff1a;&&左值是指在内存中有明确的地址&#xff0c;我们可以找到这块地址的数据&#xff08;可取地址&#xff09;右值是只提供数据&#xff0c;无法找到地址&#xff08;不…...

MySQL 02 :三层结构、备份删除数据库

MySQL 02 &#xff1a;数据库三层结构-破除MySQL神秘 请添加图片描述 通过golang操作MySQL 创建删除数据库 备份恢复数据库 第一次需要配置环境&#xff0c;否则会报错 报错&#xff1a;mysqldump: Got error: 1045: Access denied for user ‘root’‘localhost’ (using …...

质量员错题合集

项目部质量员根据规范要求认为&#xff0c;接地用的绝缘铜电线规定最小截面为( )mm。4 项目部质量员根据规范要求认为&#xff0c;接地用的绝缘铜电线规定最小截面为4mm&#xff0c;是从( )性能考虑的。机械、 案例中所使用的ZST型闭式喷头的工作压力是( )MPa。1.2 案例中所…...

请教大神们,pmp考试和复习有什么攻略诀窍吗?

PMP考试通过率挺高的&#xff0c;很多考生也是朝九晚五甚至天天加班的打工人&#xff0c;还是有很多人通过了的&#xff0c;我也是下班后和周末才有时间学习的&#xff0c;3A通过&#xff0c;但不是什么考试大神&#xff0c;每天抽出3-4个小时跟着培训机构制定的学习计划学习&a…...

Go语言基础之接口

Go语言基础之接口1.Go语言接口类型2.类型与接口的关系一个类型实现多个接口多种类型实现同一接口3.空接口4.类型断言1.Go语言接口类型 每个接口类型由任意个方法签名组成&#xff0c;接口的定义格式如下&#xff1a; type 接口类型名 interface{方法名1( 参数列表1 ) 返回值列…...

【Go自学第一节】GoLang 数据类型

和Java类型&#xff0c;go拥有多种数据类型&#xff0c;可以把它分为四个大类基础类型、聚合类型、引用类型和接口类型 一、基本数据类型 基本数据类型又可以细分为&#xff1a;数字类型&#xff08;整型、浮点型&#xff09;、布尔类型、字符串类型 整型 Go 的整型分为有符号…...

学习ForkJoin

学习ForkJoin一、普通解决多线程方式1、案例一2、效果图二、ForkJoin一、普通解决多线程方式 1、案例一 大数据量的List问题处理&#xff0c;多线程分批处理&#xff0c;需要解决的问题&#xff1a; 下标越界。线程安全。数据丢失。 private static ThreadPoolExecutor thre…...

System has not been booted with systemd as init system (PID 1). Can‘t operate.

今天想查看防火墙的状态&#xff0c;但是对防火墙的操作还不熟悉&#xff0c;网上搜到的命令是这样的systemctl status firewalld 结果输入之后出现了这样的错误&#xff1a; System has not been booted with systemd as init system (PID 1). Can’t operate. 然后接着去网上…...

使用Endnote自定义参考文献格式

使用Endnote自定义参考文献格式 使用Endnote插入参考文献&#xff0c;若要设置期刊指定格式或自己想要的参考格式&#xff0c;使用EndNote自定义方法&#xff0c;步骤如下。 注&#xff1a;有的期刊会给出EndNote的格式文件&#xff0c;那样直接导入就行。 文章目录使用Endnot…...

jsPlumb Components Crack

jsPlumb Components Crack 为支持Vue 2&#xff0c;所有组件都添加了包装器。 已为所有组件添加了包装器以支持Svelte。 改进了在流程图生成器中编辑多个选定节点。 jsPlumb组件是一组可嵌入的组件&#xff0c;可将可视连接快速集成到网页中。jsPlumb组件基于jsPlumb Toolkit库…...

Java接口

目录 为什么有接口&#xff1f; 接口的定义和使用 注意 接口的基本使用 接口成员的特点 接口和类之间的关系 为什么有接口&#xff1f; 接口就是一种规则 对行为的抽象 接口侧重于行为 接口的定义和使用 接口用于关键字interface来定义public interface 接口名{ }接口不…...

二叉树OJ题目详解

根据二叉树创建字符串 采用前序遍历的方式&#xff0c;将二叉树转换成一个由括号和数字组成的字符串。 再访问每一个节点时&#xff0c;需要分情况讨论。 如果这个节点的左子树不为空&#xff0c;那么字符串应加上括号和左子树的内容&#xff0c;然后判断右子树是否为空&#x…...

#Vue3篇:响应式工具ref()、toRef()、 toRefs()、reactive()的用法和区别

ref() 定义: ref()接收一个普通的Javascript值作为参数&#xff0c;将其转换为响应式对象&#xff08;ref对象&#xff09;。 ref对象有一个.value属性&#xff0c;用于获取和修改之。 参数1: 一个普通的Javascript值作为参数 import { ref } from vue const count ref(0) c…...

docker容器内安装gcc(trunk 最新版本)以及LLVM

1、docker内部只有wget以及git命令 项目需要&#xff0c;得更新docker容器中的gcc和LLVM版本但是由于没有预先安装apt、apt-get以及yum&#xff0c;导致很多安装过程就是鸡生蛋蛋生鸡反应。暂时没有找到合适的解决的方法&#xff0c;如果有大佬知道的话&#xff0c;欢迎留言哈…...

手把手教你如何做数据报表

数据报表是一种数据可视化形式&#xff0c;它将复杂的数据信息通过图形、表格等形式进行展示和解释&#xff0c;让人们更加直观地理解和分析数据。数据报表已成为现代企业决策的必备工具之一。对企业来说&#xff0c;数据报表有很多用处。首先&#xff0c;数据报表可以帮助企业…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...