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

这篇具有很好参考价值的文章主要介绍了谈谈mysql——Binlog的复制方式和解析技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mysql

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

    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

MySQL的存储引擎的简单解读

谈谈mysql——Binlog的复制方式和解析技巧,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 ,就代表成功了
    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库
  • 如果中间配置错误使用stop slave;reset slave;重置主库信息
  • 我们在主库可以通过show processlist来查看备库的同步binlog的线程,比如我这个,线程端口45976 state说已经全部同步到备库了,等待更多的更新。
    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

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语句。
谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

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

同步的过程

谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

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';
    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

  • 查看binlog的记录方式show variables like 'binlog_format%';
    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

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

  • 执行一个insert操作

  • 在不加任何参数的情况下,我们看到的日志是压缩过的
    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

  • 我们通过mysqlbinlog mysql-bin.000005 --base64-output=DECODE-ROWS -vv 查看日志(v就是verbose参数简写)
    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

  • 我们执行一个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语句
谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库文章来源地址https://www.toymoban.com/news/detail-540066.html

基于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%';
    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库
  • 刷新日志文件flush binary logs
  • 更新数据 update user set name='acurd' where id>1;
  • 通过mysqlbinlog查看日志mysqlbinlog mysql-bin.000008 ,日志中记录的就是我们执行的SQL
    谈谈mysql——Binlog的复制方式和解析技巧,mysql,数据库

到了这里,关于谈谈mysql——Binlog的复制方式和解析技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql 数据库主从复制搭建

    MySQL 主从复制主要用于实现高可用性和备份。在主从复制中,一个 MySQL 实例(称为主节点)将其数据更改复制到至少一个其他 MySQL 实例(称为从节点)上。主要借助于数据库二进制日志binlog进行数据的复制。 主从数据库对应的操作系统、数据库版本要一致。 1、主库配置 设

    2024年02月20日
    浏览(44)
  • MySQL数据库迁移(直接复制文件)

    MySQL数据库迁移(直接复制文件) - 简书 (jianshu.com) 看了几种方法: 1、修改注册表的 windows下迁移mysql数据 - 程序员丁先生 - 博客园 (cnblogs.com) 2、mysqldump指令将数据库表/数据保存成xx.sql文件存到本地的 (157条消息) 如何简单实现mysql数据库迁移_岁月呀的博客-CSDN博客 看着都复

    2024年02月15日
    浏览(41)
  • 【MySQL数据库】主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库

    2024年02月11日
    浏览(45)
  • 【数据库】mysql主从复制与读写分离

      读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE ),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。   因为数据库的\\\"写”(写10000条数据可能要3分钟)操作是比较耗时的。   

    2024年02月11日
    浏览(58)
  • MySQL数据库 主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库

    2024年02月10日
    浏览(35)
  • 实现↝Mysql数据库主从复制搭建与同步

    一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。 如生产环境中,使用redis数据库作为缓存数据库,用户访问业务数据时,先

    2024年02月10日
    浏览(31)
  • Mysql数据库--实现主从复制搭建与同步

    一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。 如生产环境中,使用redis数据库作为缓存数据库,用户访问业务数据时,先

    2024年02月08日
    浏览(40)
  • 【数据库七】MySQL主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作 (insert、update、delete),而 从数据库处理select查询操作 。 数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库 。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据

    2024年02月11日
    浏览(48)
  • 第78讲:截取MySQL Binlog二进制日志中特定部分内容的技巧

    我们通过Binlog二进制日志恢复数据时,一般都会先用备份恢复全库的数据,然后再使用Binlog恢复备份中不存在的数据,因此再使用Binlog进行数据恢复时,并不是直接恢复整个Binlog日志中的数据,只是恢复Binlog中的部分数据。 根据特定的情况以及需求去恢复Binlog日志中的数据时

    2024年02月03日
    浏览(38)
  • MySQL高级第十七篇:数据库主从复制原理及保证数据一致性

    在实际工作中,我们常常将Redis作为缓存与MySQL来配合使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出,如果不存在再访问数据库。 这样就提升了读取的效率,也减少了对后端数据库的访问压力。 此外,对于一般数据库应用而言,都是 读多写少 的,

    2023年04月25日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包