mysql三大日志之我对Binlog的理解

news2024/11/27 16:48:22

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/720102.html

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

相关文章

Blazor 自定义可重用基础组件之 带标头排序的Table

实现点击标头按所在列值进行排序,是一个非常有用的功能,其他的UI一般搞得非常复杂,添加标志图标什么的,使得本就不宽裕的表格更加拥挤。我的思路是,点击所在列的标头部位,传递标头值,然后根据标…

裸机搭建k8s报错记录

安装教程参考 修复一、 cd /etc/kubernetes/manifests vim kube-scheduler.yaml注释掉 重启 systemctl restart kubelet.service问题二、 https://github.com/kubernetes/kubernetes/issues/70202 一直处于创建中状态 网络原因 cat << EOF > /run/flannel/subnet.…

golang 结构体struct转map实践

1、反射 type sign struct { Name string json:"name,omitempty" Age int json:"age,omitempty" } var s sign s.Name "csdn" s.Age 18 //方式1 反射 var data make(map[string]interface{}) t : reflect.TypeOf(s) v : …

第五步:STM32F4端口复用

什么是端口复用&#xff1f; STM32有很多的内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c;就叫做复用。 例如串口 1 的发送接收引脚…

【C++11】移动语义,完美转发

1.移动语义 1.为什么要有移动语义&#xff1f; C中有拷贝构造函数和拷贝复制运算符&#xff0c;但是这需要占用一定的空间 class MyClass { public:MyClass(const std::string& s): str{ s }{};MyClass(const MyClass& m){strm.str;}private:std::string str; };int …

NSS [NSSRound#7 Team]ec_RCE

NSS [NSSRound#7 Team]ec_RCE 源码如下&#xff1a; <?PHPif(!isset($_POST["action"]) && !isset($_POST["data"]))show_source(__FILE__);putenv(LANGzh_TW.utf8); $action $_POST["action"];$data "".$_POST["…

代理IP,如何助力大数据时代

代理IP&#xff0c;如何为大数据助力 华科云商助力大数据 近年来&#xff0c;我国互联网商业保持持续发展的状态。大环境的优化&#xff0c;各项相关政策的出台&#xff0c;也为互联网经济的发展&#xff0c;提供了强有力的支持。大大小小的企业都想乘风起势&#xff0c;大展宏…

Django核心

安装django pip install django # pip install django3.1.6创建django项目 在一个项目中可以包含多个应用程序。 django-admin startapp app_name #创建一个应用程序 django-admin startproject project_name #创建一个项目运行django项目 python manage.py runserver 80…

REST风格讲解

1.REST风格简介 优点&#xff1a;隐藏资源访问的行为&#xff0c;无法通过地址得知对资源的操作&#xff0c;并且简化了书写 rest风格大概将请求方式分成了Get Post Put Delete四种操作方法。上述行为是约定的方式并不是规范。 RequestMapping注解里面value值存储访问的路…

Docker 中的 .NET 异常了怎么抓 Dump (转载)

一、背景 1. 讲故事 有很多朋友跟我说&#xff0c;在 Windows 上看过你文章知道了怎么抓 Crash, CPU爆高&#xff0c;内存暴涨 等各种Dump&#xff0c;为什么你没有写在 Docker 中如何抓的相关文章呢&#xff1f;瞧不上吗&#xff1f; 哈哈&#xff0c;在DUMP的分析旅程中&a…

【前端学JAVA】基础语法

作为一个前端程序员&#xff0c;其发展前途是远不及后端程序员的。因此&#xff0c;只有了解后端&#xff0c;才能让自己更加具备核心竞争力。本系列教程将以一个前端程序员的角度快速学习JAVA。 新建项目 开发JAVA程序&#xff0c;我们第一步是使用IDEA新建一个项目&#xf…

紫光展锐携手中国联通共建数字世界

6月28日&#xff0c;2023上海世界移动大会&#xff08;MWC上海&#xff09;首日&#xff0c;联通华盛总经理李立新、联通华盛副总经理陈丰伟一行莅临紫光展锐展台参观&#xff0c;紫光集团高级副总裁、紫光展锐CEO任奇伟博士&#xff0c;紫光展锐执行副总裁、工业电子事业部总经…

如何提高OAK相机在树莓派和JETSON上的运行帧率?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手君。 最…

Lim接口测试平台-接口测试功能详解

一、接口测试 项目地址&#xff1a;Gitee/Github 接口测试模块是整个Lim平台的核心&#xff0c;左侧是接口的模块树&#xff0c;右侧顶部是用例操作功能区&#xff0c;列表展示接口用例信息&#xff1a; 文章目录 一、接口测试 二、维护接口用例 各步骤类型详解 1&#x…

picard的安装

最近在通过GATK所介绍的best practice流程来call SNP流程 1.流程 1.1 BWA比对&#xff0c;获得sam文件 1.2 准备用picard来压缩排序sam文件为bam文件&#xff0c;并对bam文件进行去重复&#xff08;duplicates marking&#xff09; 这是就需要用到picard软件 按照教程网页上…

Mac使用Puppeteer,并启动chromium

Mac使用Puppeteer&#xff0c;并启动chromium Puppeteer官网 chromium下载地址 通过chrome://version 可查询 Chromium 浏览器信息 const puppeteer require(puppeteer);(async () > {const browser await puppeteer.launch({executablePath: 上图可执行文件路径,headl…

爬取12306上所有城市的站台信息

0. 需求 爬取所有城市下的站台信息保存到Excel中: 效果: 1. 定位数据源 在12306随便一个车票查询页面上,通过F12控制台获取网站请求车站数据的URL 博主当前获取的URL为: https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version1.9270*注意…

服务器数据恢复-raid10重建为raid6的数据恢复案例

服务器故障&#xff1a; 一台IBM V7000存储中的vdisk丢失&#xff0c;Solaris操作系统中的部署的Oracle数据库不可用。经过和工作人员的沟通得知故障原因&#xff1a;工作人员进行重建MDisk的操作&#xff0c;将原先的raid10重建为raid6&#xff0c;然后又再次重建为raid10&…

RLHF文本生成图模型

背景 语言大模型有RLHF技术点&#xff0c;是否图生成也需要RLHF。要回答这个问题其实首先需要回答的问题有三个&#xff1a; 1.RLHF到底是个什么技术 2.为什么需要用RLHF技术&#xff0c;在语言大模型用RLHF模型解决什么问题点 3.图在什么情况下需要用到RLHF技术点 RLHF技…

如何实现监听某些数值,异步页面请求后再渲染到页面上

问题&#xff1a; 当我们遇到小程序在某个页面&#xff0c;需要刷新另一个页面的数据时&#xff0c;通常都是返回到刷新页面&#xff0c;然后执行onshow的函数。 但是是否可以拿数值之后&#xff0c;直接就更新相应的数值就行了&#xff1f;不用整体刷新。或者有时候页面已经…