首页 > 数据库 >【MySQL(二十一)】binlog 事件

【MySQL(二十一)】binlog 事件

时间:2022-11-11 14:40:01浏览次数:49  
标签:binlog MySQL 二十一 事件 mysql 从库 EVENT row


binlog时机

事务提交时写入binlog,但是binlog持久化到磁盘与sync_binlog参数有关:

0:只fwrite写入操作系统cache,由操作系统决定什么时候持久化到磁盘,及fsync;

1:fsync直接写入磁盘;

n:提交n个事务后fsync;

1最安全,0性能最好;

 

binlog文件

有两种,一种是binlog的索引文件,也即xxx-bin.index,另一种是binlog文件。

索引文件:其实就是存储了当前所有binlog文件的文件名。

比如:

./mysql-bin.000001
./mysql-bin.000002
./mysql-bin.000003

binlog文件:xxx-bin.0000N,N代表第几个文件,是二进制文件,存储了binlog的内容。

什么时候会新建一个binlog文件?

超过max_binlog_size或者使用flush logs命令。

 

binlog日志类型

statement:记录执行的语句;对于更新而言不需要记录大量的行数据,但是有些信息无法记录比如随机数或者当前时间,所以还需要一些上下文信息。

row:只记录修改的行,不用上下文,但是数据量可能较大。

mixed:对于不需要上下文的语句,使用statement,否则使用row,所以会 同时存在两种格式;

 

如何查看binlog

如果在mysql客户端内,可以使用show binlog events;这条命令会显示第一个binlog文件内的事件;当然可以指定binlog文件,比如:show binlog events in 'xxx-bin.0000N'。另外也可以使用show binary logs命令查看当前所有binlog文件名。

如果不在mysql客户端,可以使用mysql提供的mysqlbinlog命令。比如:mysqlbinlog -v --base64-output=decode-rows --start-position="156" ~/mysql/master/data/mysql-bin.000004

简单记一下几个参数的含义:

-v:将row模式的反解为statement模式,方便查阅;

--base64-output:如果不加,默认输出是base64格式的,加上这个参数,输出是base64解密后的;

--start-position:指定开始位置,当然也可以指定结束位置;

另外还有一些其他参数也可以指定,比如库名以及表名等。

 

binlog事件类型

总共有3个版本:v1,v2和v4。mysql5以上使用过的v4。这里只记录这几个关键的事件类型:

QUERY_EVENT:在statement模式下,增删改的语句都会生成该事件;在row模式下,DDL的改动会生成该事件;

ROTATE_EVENT:新的binlog文件生成时,会记录该事件,内容就是下一个binlog文件的文件名;

FORMAT_DESCRIPTION_EVENT:每一个binlog文件的起始事件,描述文件属性;

TABLE_MAP_EVENT:在row模式下会有,每一个更新事件都会先有一个TABLE_MAP_EVENT事件,用于记录表的一些信息。

WRITE_ROWS_EVENT:在row模式下会有,insert;

UPDATE_ROWS_EVENT:在row模式下会有,update;

DELETE_ROWS_EVENT:在row模式下会有,delete;

 

binlog示例

statement格式

可以通过这个命令设置binlog格式:set global binlog_format='statement/row/mixed'; 登出同时输入如下命令查看binlog格式:show variables like '%binlog%';

执行如下两行sql语句:

insert into user (`name`) values ('ly1');

update user set `name` = 'ly2' where id = 3;

show binlog events:

【MySQL(二十一)】binlog 事件_mysql

两个更新语句分别对应了两个Query事件。其中的insert语句前有一个Intvar事件,这是一个Context事件,用于指定自增主键id。

mysqlbinlog  -v --base64-output=decode-rows  ~/mysql/master/data/mysql-bin.000006

【MySQL(二十一)】binlog 事件_mysql_02

row格式

flush logs;insert into user (`name`) values ('ly3');update user set `name` = 'ly4' where id = 4;

【MySQL(二十一)】binlog 事件_主键_03

可以看到这里分别有一个write_rows事件和update_rows事件,两个事件之前都有一个table_map事件描述表名和列信息;这里没有显示修改的具体内容,可以使用myslqbinlog命令看下。

【MySQL(二十一)】binlog 事件_mysql_04

binlog冲突

理想情况下,从库的复制是重放主库的sql,不会有问题,但是实际操作时,会因为一些原因导致从库binlog执行冲突,这种情况下从库复制将会终止,通过show slave status\G;命令可以查看具体的出错原因。比如主键重复、对应的表或者库不存在等等。出现冲突从库停止复制是正确的设计,符合fail-fast原则,否则,将会导致主从数据不一致。我们可以手动处理冲突,然后再继续复制,当然确认对业务无影响,也可以选择跳过冲突。比如通过set global sql_slave_skip_counter=N;命令跳过特定数目的event。或者配置mysql配置文件,跳过特定的error类型。

这里演示一个例子:

在一个有自增id的表里,从库先插入一条数据,主库再插入一条数据,此时从库会因为主键冲突而停止复制。

现在user表的next主键是9,表里均没有数据,先在从库insert:

【MySQL(二十一)】binlog 事件_主键_05

再在主库insert:

【MySQL(二十一)】binlog 事件_数据_06

查看从库同步状态:

【MySQL(二十一)】binlog 事件_主键_07

可以看到有1062错误。

此时尝试跳过该错误:

【MySQL(二十一)】binlog 事件_binlog_08

再查看从库同步状态:

【MySQL(二十一)】binlog 事件_binlog_09

状态正常,但从库有两条数据了,且从主库同步来的是id=10的那条。发生了主从不一致,主库中的id是9,从库中的id10。

【MySQL(二十一)】binlog 事件_主键_10

当然这个例子可能不太好,从库插入和主库插入了相同的数据。

 

标签:binlog,MySQL,二十一,事件,mysql,从库,EVENT,row
From: https://blog.51cto.com/u_15873544/5844827

相关文章

  • MySQL慢查询(下):问题解决,应用总结
    上篇回顾继上两篇:​​MySQL慢查询(上):你知道为啥会慢么?​​​​MySQL慢查询(中):正确的处理姿势,你get到了吗?​​在以上两篇内容中,我们一起探索了这些内容:SQL执行过程查询SQL为什......
  • MySQL慢查询(上):你知道为啥会慢么?
    正文共: 2487字 6图  预计阅读时间: 7分钟发现的一些问题问题1在过去的半年时间里,研发团队内部尝试抓了一波儿慢查询SQL跟进处理率。发现有些同学对于慢查询处理的思路......
  • 踩坑 MySQL 索引,看看你真的会用吗?
    关于MySQL索引,对于研发同学,尤其是后端研发同学,一定不会陌生。我们工作中经常会用到MySQL数据库,就肯定会经常用到性能优化方面的设计和考量,常常用涉及到MySQL索引。但......
  • 用实例带你了解 MySQL 全局锁
    MySQL全局锁会申请一个全局的读锁,对整个库加锁。全局锁的一般使用场景是:全局逻辑备份。全局锁的实现方式有两种://第一种方法Flushtableswithreadlock(FTWRL)//第二种方法......
  • 【MySQL(八)】一致性非锁定读 锁定读 解析
    一致性非锁定读与锁定读的区别主要针对的是读操作在加锁方式上的差别。这里先看下锁的分类吧。mysql的行锁分为读锁与写锁。读锁即S锁,也叫共享锁,当事务读取一行数据时,会尝试......
  • 【MySQL(三)】buffer pool相关
    bufferpool是一种减少磁盘io读的机制,原理是将访问过的磁盘数据暂留在内存中,这样下次访问相同的数据就不需要读磁盘了。这个思想在平时的开发中,也经常用到,比如我们通常会在......
  • 【MySQL(十九)】复制 过程
    主库将数据写入本地binlog文件中;从库连接,指定起始位置;主库的binlogdump线程开始将binlog内容发送给从库;从库的io线程将收到的binlog内容写入到本地的relaylog中;从库的sql......
  • MySQL启动报错[ERROR] InnoDB: Trying to access page number 4294967295 in space 0,
    这篇文章是原来的《记一次mysql故障处理》,但是随着mysql问题越来越多,我感觉还是集合到一篇里面比较好,也方便之后问题复现的查找一、记一次mysql故障处理最近遇到的问......
  • MySQL备库复制延迟的原因及解决办法【转】
    背景今天有同事问我主从复制延迟会影响高可用切换的RTO怎么办,这个不需要做实验,我可以直接回答,所以有了以下赶鸭子的文章,都是一线运维经验之谈,建议四连:点赞、收藏、转发......
  • 【mysql】索引
    mysql的索引是由引擎决定的。1.哈希索引,这个和哈希表是一样的原理,从关键字的哈希函数值映射到物理位置。特点是只能针对等于的查询,效率很高。2.B树索引,为关键字维护一棵b树,......