谈谈mysql——Binlog的复制方式和解析技巧

news2024/11/27 8:41:49

mysql

  • 我们先来看一下MySQL的基本架构,从大的方面来讲,一个server层,一个引擎层。server层就像一个接口,可以对接任何符合规定的引擎。具体的细节可以参考我之前写过的文章mysql的这些坑你踩过吗?快来看看怎么优化mysql

    在这里插入图片描述

MySQL的存储引擎的简单解读

在这里插入图片描述

  • 我们看到,有的引擎是支持事务的,有的引擎是不支持事务的。但是我们知道,MySQL的大部分引擎都支持主从复制的模式,比如myisam(基于语句),memory(基于语句),innodb(支持基于行和基于语句),MySQL通过复制主节点(master)的二进制日志(bin-log)来实现数据的同步。可以说bin-log是MySQL层面日志。

使用docker快速启动一个主备服务器

主库

  • 新建一个目录mysqla,进入目录执行以下命令,我们把配置文件和数据目录都挂载到我们宿主机上
docker run -d --name mysql-a -p 23307:3306 \
-v $(pwd)/conf:/etc/mysql/conf.d \
-v $(pwd)/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql
  • 在当前目录下的conf目录下,创建文件my.cnf 里面定义自己的日志名称目录和server-id,注意server-id不能重复
$ cat my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
  • 启动容器,创建一个slave用户用于复制
$ CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
$ GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
$ FLUSH PRIVILEGES;

备库

  • 新建一个目录mysqlb,进入目录执行以下命令,我们把配置文件和数据目录都挂载到我们宿主机上
docker run -d --name mysql-b -p 23307:3306 \
-v $(pwd)/conf:/etc/mysql/conf.d \
-v $(pwd)/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql
  • 在当前目录下的conf目录下,创建文件my.cnf 里面定义自己的日志名称目录和server-id,注意server-id不能重复
$ cat ../../mysqlb/conf/my.cnf
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
server_id=100
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
  • 查看主库和备库的容器ip
$ docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' a4--这个是容器id
/mysql-b - 172.17.0.3

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 52--这个是容器id
/mysql-a - 172.17.0.2

  • 我使用的mysql8 版本,要使用复制用户请求服务器公钥,在备库服务器上先执行mysql -uslave -p123456 -h172.17.0.2 --get-server-public-key,否则会报错error: Authentication requires secure connection. ,因为mysql8中caching_sha2_password 是默认的身份验证插件
  • 执行SQL设置主库的信息,注意:master_log_file 和master_log_pos是在主库执行 show master status;命令后可以获取到
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 157, master_connect_retry=30;
  • 查看slave的状态,如果有两个yes ,就代表成功了
    在这里插入图片描述
  • 如果中间配置错误使用stop slave;reset slave;重置主库信息
  • 我们在主库可以通过show processlist来查看备库的同步binlog的线程,比如我这个,线程端口45976 state说已经全部同步到备库了,等待更多的更新。
    在这里插入图片描述

binlog

  • 为什么会有binlog
    我们知道,MySQL服务器单机是有性能瓶颈的,特别是写比较多的时候,写锁一直被占用,导致读操作一直阻塞,最终导致请求超时,为了解决这种问题,MySQL就要提供一种更大规模、高性能的服务,那么MySQL提供了一种水平扩展的架构,让一台服务器与其他服务器保持同步的功能,一台主库的数据可以同步到其他备用库上,备用库也可以配置成其他服务的主库。binlog解决了数据库之间数据同步的问题。

记录binlog的方式

有两种复制方式,一种是基于语句的复制(逻辑复制),这种方式在MySQL版本3的时候就存在了。另一种就是基于行的复制方式,这是在MySQL版本5提出来的。而具体支持哪种方式和

基于语句的复制

在这种模式下,binlog中记录的是那些造成数据更改的SQL,并在备库上重放这些SQL。这种模式的优点就是二进制日志里的事件更加紧凑,而且binlog的日志量会更小,比如我们更新了几十万条记录,而日志里面只记录了一条update语句。

但是缺点也是明显的,比如主库和备库的执行时间有可能会不一致,导致数据的时间戳也不一样。第二点就是这种记录日志必须是串行的执行,那么我们可能就需要更多的锁来保证它是串行的。

基于行的复制

MySQL5.1以后开始支持行的复制,这种方式就是将实际数据存储到binlog里面,这种方式可以保证主备库的数据完全一致。而且不需要逻辑的binlog,复制数据的效率也更高。而且对于较为复杂的sql来说,这种方式也更高效,因为你中间不论执行了多少sql,我日志只记录物理日志,可能就是一行数据。但是对于一些update操作,那么每行被更改的数据都得记录到binlog里面。而且binlog的可读性比较差,我们不知道执行了哪些sql语句。
在这里插入图片描述

如果声明是mixed,MySQL则动态切换的,基于语句的复制执行不了的时候,就会采取行复制。我们也可以根据SHOW VARIABLES LIKE 'binlog_format'来查看当前的复制方式。

同步的过程

在这里插入图片描述

binlog的语句分析以及开始和结束的标记

  • 相关参考添加链接描述
    我们可以通过mysqlbinlog分析binlog,其中最常用到两个参数–base64-output和–verbose

  • base64-output
    AUTO: 默认为AUTO方式,原始的记录binlog events的方式。如果要通过binlog恢复数据(mysqlbinlog log_file | mysql -h server_name),必须使用AUTO方式
    NEVER: 不显示binlog statements,遇到ROW格式的binlog直接报错
    DECODE-ROWS: 压缩显示row格式events

  • verbose
    将行模式下的binlog以注释的SQL语句的形式显示,在适用的情况下,还包括表的分区信息。即通过伪代码的方式重构出行数据改变的等价的SQL语句

接下来我们通过执行SQL来生成一些binlog日志

row模式下的日志
  • 查看binlog是否开启show variables like 'log_bin';
    在这里插入图片描述

  • 查看binlog的记录方式show variables like 'binlog_format%';
    在这里插入图片描述

  • 通过flush binary logs命令关闭当前使用的binary log,然后打开一个新的binary log文件,文件的序号加1

  • 执行一个insert操作

  • 在不加任何参数的情况下,我们看到的日志是压缩过的
    在这里插入图片描述

  • 我们通过mysqlbinlog mysql-bin.000005 --base64-output=DECODE-ROWS -vv 查看日志(v就是verbose参数简写)
    在这里插入图片描述

  • 我们执行一个update语句看一下日志是什么样子

mysql> update user set name='www.acurd.com' where id>2;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

我们发现被解析成了两个update语句
在这里插入图片描述

基于statement的binlog
  • 我们改一下主库的my.cnf配置,声明binlog的格式是statement
$ cat my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
default_authentication_plugin=mysql_native_password
binlog_format=statement
  • 查看binlog的记录方式show variables like 'binlog_format%';
    在这里插入图片描述
  • 刷新日志文件flush binary logs
  • 更新数据 update user set name='acurd' where id>1;
  • 通过mysqlbinlog查看日志mysqlbinlog mysql-bin.000008 ,日志中记录的就是我们执行的SQL
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3+pinia用户信息持久缓存(token)的问题

vue3pinia用户信息持久缓存(token)的问题 对博主来说,这是个相当复杂的问题。 当初在使用vue2vuex进行用户信息持久登录时,写了不下3篇博客,确实是解决了问题,博客链接如下 vue存储和使用后端传递过来的tokenvue中对…

动态规划之 509斐波那契数(第1道)

目录 题目:斐波那契数 (通常用 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。 解法: 动态规划法: 题目:斐波那契数 (通常用…

大象机器人人工智能套装2023版深度学习协作机器人、先进机器视觉与应用场景

引言: 介绍当前的版本 今天我们要介绍的是aikit2023,aikit2023是aikit的全新升级版。 AIkit 2023 是一套集视觉,定位抓取、自动分拣模块为一体的入门级人工智能套装。 该套装基于python平台,可通过开发软件实现机械臂的控制&am…

gitee提交项目失败记录:remote:error:hook declined to update refs/heads/master

问题描述; 今天修改了项目里面一些文件内容,结果提交的时候报错了,可以提交到本地仓库,但提交到中央仓库报如下异常,因此记录下,防止后面再遇到…… 解决办法: 登录gitee账号,在设置…

自定义MVC的进阶使用

文章目录 前言一、环境配置1.1 将框架打包成jar包1.2 将Jar包导入新项目1.3 将分页标签相关文件、及相关助手类导入1.4 配置文件 二、前后台编写2.1 实体类2.2 dao2.3 Servlet2.4 配置mvc.xml2.5 JSP2.6 运行结果 前言 通用增删改查、通用分页、XML解析反射建模,包…

【网络安全带你练爬虫-100练】第6练:内嵌发包提取数据

目录 一、分析目标: 二、代码实现 目标1:对于捕获的URL内嵌发包 目标2:找到电话和邮箱的位置 目标3:提取电话和邮箱 三、完整代码 四、网络安全小圈子 (注:需要带上登录成功后的cookie发包&#xff…

Nginx部署前后端分离项目

dev.env.js解释 //此文件时开发环境配置文件 use strice//使用严格模式 const merge require(webpacl-merge)//合并对象 const prodEnv require(./prod.env)//导出 module.exports merge(prodEnv,{//合并两个配置文件对象并生成一个新的配置文件,如果合并的过程…

使用Postman做接口测试并生成接口测试报告

学习目标 1、录制脚本或使用手写url进行抓包 2、微信api接口(可录制可手写) 3、添加多 个标签,获取多个标签,编辑多个标签,删除多个标签!!!(csv格式) 4、通过…

Java JDK 安装及环境配置教程

一、安装 1、安装包 jdk1.8安装包下载路径 2、创建一个英文的文件夹 注意:整个路径不要有中文、建议文件夹直接命名为JDK。 3、在该文件夹下创建两个空文件夹,分别为:jdk1.8 和 jre 其中jdk1.8 是我的JDK版本,这个可以自行改变。…

宝塔 安装/使用Jenkins-图文小白教程

一、Jenkins包下载 大家可以从Jenkins官网(https://www.jenkins.io/)根据自己的需要下载最新的版本。 但Jenkins官网下载较慢,容易造成下载失败。可以去国内的开源镜像网站下载Jenkins最新版本。目前博主使用的是清华大学的开源镜像网站&…

【spring创建对象方式】 and 【Java创建对象方式】

Spring创建对象方式 通过构造函数创建对象,通过静态工厂方式创建对象,通过实例工厂方式创建对象 1、通过构造函数创建对象 无参构造函数: 最基本的对象创建方式,只需要有一个无参构造函数(类中没有写任何的构造函数…

excel 复制出来的数据内容自动带上空格

在excel中批量处理完了公式,想复制到navicat 或者文本编辑框里,发现都会自动带上双引号,但是excel 里是没有,查找了半天。 在excel里的文本如下所示 拷贝出来的结果如下所示: 经过检查发现原文中只要带有回车或者换行…

A40i Linux3.10开发板移植高精度定时器hrtimer驱动

目录 整编内核 修改Makefile文件 编译内核 生成.ko文件 应用层调用 这里使用整个编译内核的方式编译.ko文件。 整编内核 编写一个hrtimer_demo.c的驱动程序源码如下&#xff1a; #include <linux/module.h> #include <linux/kernel.h> #include <linux/i…

相机图片给 Livox 激光雷达点云赋色(python代码 单文件)

需要配置PCD文件路径, 图片路径,相机内参,相机和雷达的外参; 单文件, Windows , liunx 都可以运行。 雷达和相机外参如何标定请看我的另外一篇标定的代码文章。 效果如下图: 附上代码: # coding:utf-8import cv2 import numpy as np import open3d as o3ddef get_U…

记录一次在泛微OA中添加js代码块,限制开始日期时间不能大于等于结束日期时间

目标&#xff1a; 在选择流程后提交时&#xff0c;选择的开始日期、时间不能大于结束日期、时间选择的开始日期、时间不能等于结束日期、时间满足以上条件才可以提交 效果图&#xff1a; 在OA后台添加js代码的步骤&#xff0c;如下&#xff1a; 图一&#xff08;第1-5步参考图…

[NPUCTF2020]你好sao啊

前言 base64的解密算法&#xff0c;开始还以为是什么变种加密手段 分析 可以发现加密区域主要位于RxEncode中&#xff0c;最终结果为s中保存数据 解密算法写的有点怪怪的&#xff0c;知道是4转3但给人1的感觉不像是在解密&#xff0c;更像是在换表之类的操作 strchr的作用为…

小程序前端上传图片直传七牛云不存储服务器

fastadmin文件API接口文件下的common修改默认的upload方法&#xff0c;直接替换即可 /*** 上传文件* ApiMethod (POST)* param File $file 文件流*/public function upload(){$file $this->request->file(file);if (empty($file)) {$this->error(__(No file upload…

IDEA中使用Git拉取项目时设置重新输入用户名和密码

1、选择&#xff1a;file ----> setting ---->passwords 2、选中这个Do not save 3、点击OK 4、重新使用Git拉取代码会提示重新输入用户名和密码

培训报名小程序报名列表页开发

目录 1 创建页面2 组件搭建3 设置URL参数4 设置筛选条件5 首页跳转6 最终的效果总结 这节我们来开发报名列表功能&#xff0c;先看原型 1 创建页面 功能要在页面上呈现&#xff0c;需要先创建页面。打开我们的培训报名小程序&#xff0c;在页面区&#xff0c;点击创建页面的…

Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列

目录 332. 重新安排行程 Reconstruct Itinerary &#x1f31f;&#x1f31f;&#x1f31f; 334. 递增的三元子序列 Increasing Triplet Subsequence &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 P…