返回顶部
首页 > 资讯 > 数据库 >binlog的三种模式
  • 844
分享到

binlog的三种模式

2024-04-02 19:04:59 844人浏览 安东尼
摘要

binlog的三种模式statement模式特点:(1)此模式不支持RU,RC隔离级别;(2)binglog日志文件中上一个事物的结束点是下一个事物的开始点;(3)DML,DDL语句都会明文显示;(4)对一

binlog的三种模式

statement模式

特点:

(1)此模式不支持RU,RC隔离级别;

(2)binglog日志文件中上一个事物的结束点是下一个事物的开始点;

(3)DML,DDL语句都会明文显示;

(4)对一些系统函数不能准确复制或者不能复制,如load_file()、uuid()、user()、found_rows()、sysdate(),注意(now()可以复制; )

(5)主库执行delete from t1 where c1=xxx limit 1,statement模式下,从库也会这么执行,可能导致删除的不是同一行数据

(6)主库有id=1和id=10两行数据,从库有id=1,2,3,10这四行数据,主库执行delete from t1 where id<10命令,从库删除过多数据;


什么场景会用到statement模式:

(1)一次更新大量数据,如二十万数据,否则在复制的时候,从库可能会追的太慢,导致延时;

(2)使用pt-table-checksum工具时会使用到statement模式;

例1:
set  tx_isolation='repeatable-read';
set  binlog_fORMat='statement';
flush logs;
create table t10(c1 int,c2 varchar(50));
insert into t10 values(1,now());
insert into t10 values(2,now());
insert into t10 values(3,sysdate());
insert into t10 values(4,uuid());
update t10 set c2='bbb' where c1=1;
[root@Darren2 logs]# Mysqlbinlog mysql-bin.000022
......
create table t10(c1 int,c2 varchar(50))
BEGIN
;
# at 532
#170408 14:40:49 server id 330622  end_log_pos 649 CRC32 0xe5cfc853     Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1491633649;  --先设置timestamp,从库复制的时候也会执行这条sql,这就是now()函数为什么可以复制的原因
insert into t10 values(1,now())     
insert into t10 values(2,now())
insert into t10 values(3,sysdate())
insert into t10 values(4,uuid())
;
# at 1550
#170408 14:40:49 server id 330622  end_log_pos 1581 CRC32 0x5aaa5377    Xid = 1755
COMMIT;
# at 1581
#170408 14:40:49 server id 330622  end_log_pos 1646 CRC32 0xc2da517f    GTID    last_committed=5        sequence_number=6
SET @@SESSION.GTID_NEXT= '83373570-fe03-11e6-bb0a-000c29c1b8a9:11328';
# at 1646
#170408 14:40:49 server id 330622  end_log_pos 1729 CRC32 0x943Df058    Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1491633649;
BEGIN
;
# at 1729
#170408 14:40:49 server id 330622  end_log_pos 1841 CRC32 0xb443cf1e    Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1491633649;
update t10 set c2='bbb' where c1=1
;
# at 1841
#170408 14:40:49 server id 330622  end_log_pos 1872 CRC32 0xd06c40f5    Xid = 1756
COMMIT;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC'  ;
DELIMITER ;
# End of log file
;
;
主库:
root@localhost [testdb]>select * from t10;
+------+--------------------------------------+
| c1   | c2                                   |
+------+--------------------------------------+
|    1 | bbb                                  |
|    2 | 2017-04-08 14:40:49                  |
|    3 | 2017-04-08 14:40:49                  |
|    4 | 4d76efa5-1c26-11e7-bc58-000c29c1b8a9 |
+------+--------------------------------------+
从库:
root@localhost [testdb]>select * from t10;
+------+--------------------------------------+
| c1   | c2                                   |
+------+--------------------------------------+
|    1 | bbb                                  |
|    2 | 2017-04-08 14:40:49                  |
|    3 | 2017-04-14 13:12:19                  |
|    4 | ef119323-20d0-11e7-aef6-000c29565380 |
+------+--------------------------------------+
可以发现,statument日志格式下,由于使用了一些函数导致主从数据不一致;


例2:
update这个事物的开始是insert这个事物结束的点at1581;
update结束的点是commit之后的点at1842;
[root@Darren2 logs]# mysqlbinlog --start-position=1581 --stop-position=1842 mysql-bin.000022;
......
BEGIN
;
# at 1729
#170408 14:40:49 server id 330622  end_log_pos 1841 CRC32 0xb443cf1e    Query   thread_id=55    exec_time=0     error_code=0
use `testdb`;
SET TIMESTAMP=1491633649;
update t10 set c2='bbb' where c1=1
;
# at 1841
#170408 14:40:49 server id 330622  end_log_pos 1872 CRC32 0xd06c40f5    Xid = 1756
COMMIT;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC'  ;
DELIMITER ;
# End of log file
;
;


例3:
当查看commit之前的position点时,会看到rollback状态,说明这个截取的事物不完整:
[root@Darren2 logs]# mysqlbinlog --start-position=1581 --stop-position=1841 mysql-bin.000022;
BEGIN
;
# at 1729
#170408 14:40:49 server id 330622  end_log_pos 1841 CRC32 0xb443cf1e    Query   thread_id=55    exec_time=0     error_code=0
use `testdb`;
SET TIMESTAMP=1491633649;
update t10 set c2='bbb' where c1=1
;
ROLLBACK  ;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC'  ;
DELIMITER ;
# End of log file
;
;

row模式

(1)相对statement更加安全

(2)在表有主键的情况下复制更加快;

(3)系统的特殊函数也能复制;

(4)更少的,只有行锁;

(5)binlog文件比较大,如单语句更新20万行数据,可能要半小时,也有可能把主库跑挂;

(6)无法从binog看见用户执行的SQL语句(mysql 5.6后通过设置binlog_rows_query_log_events=on,日志格式为row中的binlog日志中看到执行过得SQL语句。)

(7)5.7默认的日志模式为row;

(8)DDL语句明文显示,DML语句加密显示;

(9)DML经过base64加密,需要使用参数--base64-output=decode-rows --verbose;

(10)update修改的语句可以看到历史旧数据;

例1:
set  tx_isolation='repeatable-read';
set  binlog_format='row';
flush logs;
create table t10(c1 int,c2 varchar(50));
insert into t10 values(1,now());
insert into t10 values(2,now());
insert into t10 values(3,sysdate());
insert into t10 values(4,uuid());
update t10 set c2='bbb' where c1=1;

不加参数只能看到create,alter,drop等DDL语句:
mysqlbinlog mysql-bin.000023

带参数查看:
[root@Darren2 logs]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000023
......
create table t10(c1 int,c2 varchar(50))
### INSERT INTO `testdb`.`t10`
### SET
###   @1=1
###   @2='2017-04-08 15:11:41'
### INSERT INTO `testdb`.`t10`
### SET
###   @1=2
###   @2='2017-04-08 15:11:41'
### INSERT INTO `testdb`.`t10`
### SET
###   @1=3
###   @2='2017-04-08 15:11:41'
### INSERT INTO `testdb`.`t10`
### SET
###   @1=4
###   @2='9d96b424-1c2a-11e7-bc58-000c29c1b8a9'
### UPDATE `testdb`.`t10`
### WHERE
###   @1=1
###   @2='2017-04-08 15:11:41'
### SET
###   @1=1
###   @2='bbb'


例2:开启binlog_rows_query_log_events参数,会显示执行的SQL语句,这个参数默认关闭,不显示执行的SQL
root@localhost [testdb]>set binlog_rows_query_log_events=on;

[root@Darren2 logs]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000024
......
create table t10(c1 int,c2 varchar(50))

# insert into t10 values(1,now())
### INSERT INTO `testdb`.`t10`
### SET
###   @1=1 
###   @2='2017-04-08 15:26:09' 
# insert into t10 values(2,now())

### INSERT INTO `testdb`.`t10`
### SET
###   @1=2 
###   @2='2017-04-08 15:26:09' 
# at 1033

# insert into t10 values(3,sysdate())

### INSERT INTO `testdb`.`t10`
### SET
###   @1=3 
###   @2='2017-04-08 15:26:09' 
# insert into t10 values(4,uuid())
### INSERT INTO `testdb`.`t10`
### SET
###   @1=4 
###   @2='a2b570b8-1c2c-11e7-bc58-000c29c1b8a9' 
# update t10 set c2='bbb' where c1=1
### UPDATE `testdb`.`t10`
### WHERE
###   @1=1 
###   @2='2017-04-08 15:26:09' 
### SET
###   @1=1 
###   @2='bbb' 


mixed模式

特点:

(1)innodb引擎,如果隔离级别是RU、RC,则mixed模式会转成Row模式存储;

(2)mixed模式下,在以下几种情况会自动将binlog的模式有SBR转化成RBR模式:

当更新一个NDB表时;

当函数包含uuid()函数时;

2个及以上包含auto_increment字段的表被更新时;

视图中必须要求使用RBR时,如创建视图时使用了uuid()函数;

例1:当隔离级别是read-committed时,mixed模式会转化成row模式存储:
set  tx_isolation='read-committed';
set  binlog_format='mixed';
flush logs;
create table t10(c1 int,c2 varchar(50));
insert into t10 values(1,now());
insert into t10 values(2,now());
insert into t10 values(3,sysdate());
insert into t10 values(4,uuid());
update t10 set c2='bbb' where c1=1;
[root@Darren2 logs]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000028
......
### UPDATE `testdb`.`t10`
### WHERE
###   @1=1 
###   @2='2017-04-08 18:34:08' 
### SET
###   @1=1 
###   @2='bbb' 
......
例2:当隔离级别是repeatable-read时,mixed模式会转化成statement模式存储
set  tx_isolation='repeatable-read';
set  binlog_format='mixed';
flush logs;
create table t10(c1 int,c2 varchar(50));
insert into t10 values(1,now());
insert into t10 values(2,now());
insert into t10 values(3,sysdate());
insert into t10 values(4,uuid());
update t10 set c2='bbb' where c1=1;
[root@Darren2 logs]# mysqlbinlog mysql-bin.000029
......
update t10 set c2='bbb' where c1=1
......


您可能感兴趣的文档:

--结束END--

本文标题: binlog的三种模式

本文链接: https://lsjlt.com/news/38297.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • binlog的三种模式
    binlog的三种模式statement模式特点:(1)此模式不支持RU,RC隔离级别;(2)binglog日志文件中上一个事物的结束点是下一个事物的开始点;(3)DML,DDL语句都会明文显示;(4)对一...
    99+
    2024-04-02
  • binlog日志的三种模式
    statement level模式       每一条会修改数据的sql都会记录到master的bin-log中。Slave在复制的时候sql进程...
    99+
    2024-04-02
  • MySQL binlog format三种形式介绍
    本文主要给大家简单讲讲MySQL binlog format三种形式,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL binlog format三种...
    99+
    2024-04-02
  • 云服务器的三种模式是哪三种模式
    云服务器的三种模式包括:按需使用(Distributed Access)、按量付费(Decentralized Pricing)和自助托管(Autonomous Server)。 按需使用(Distributed Access)是指用户可...
    99+
    2023-10-26
    三种 模式 服务器
  • 云服务器的三种模式是哪三种模式呢
    云服务器(Cloud Server)有以下三种模式: 公共云(Public Cloud):这种云服务器是由企业或组织自己管理并托管其计算和存储资源,客户可以根据需求选择适合自己的服务器类型和配置,并与其他客户共享这些资源。 私有云(Pr...
    99+
    2023-10-27
    三种 模式 服务器
  • MySQL Binlog三种格式介绍及分析
    一.Mysql Binlog格式介绍 MySQL binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记...
    99+
    2024-04-02
  • 云服务器的三种模式是哪三种
    云服务器的三种模式包括:按需使用(Distributed Access)、按需分配(Distributed Priority)、按需存储(Distributed Storage)。下面分别介绍这三种模式: 按需使用模式:这种模式是指云服务...
    99+
    2023-10-26
    三种 模式 服务器
  • MySQL中binlog三种格式的优缺点是什么
    这篇文章将为大家详细讲解有关MySQL中binlog三种格式的优缺点是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 MySQL bin...
    99+
    2024-04-02
  • 云服务器的三种类型是哪三种模式
    云服务器可以分为以下三种类型: 公共云:公共云服务器是指一组供应商提供的服务器,它们将数据存储在互联网上。 本地部署云:本地部署云服务器指的是将数据存储在本地设备上,这些设备通常位于您自己的地理位置。本地部署云服务器通常具有可用性、快速...
    99+
    2023-10-26
    三种 类型 模式
  • 云服务器的三种模式是哪三种类型
    云服务器(Cloud Direct Server,简称CDN)是一种通过互联网为用户提供加速访问服务的云服务。云服务器主要有以下三种类型: 公有云模式(Public Cloud):这种云服务是由许多公司或组织使用的公共云平台,它提供了一...
    99+
    2023-10-26
    三种 类型 模式
  • Redis的三种模式是什么
    Redis的三种模式是什么?可能很多人对此没有深入了解过,故而小编总结了这篇文章,通过这文章的讲解,希望你能够收获更多知识。standaloan(单机模式)standaloan 是redis单机模式,及所有...
    99+
    2024-04-02
  • 云服务器的三种模式
    云服务器是一种虚拟化软件,允许企业或组织将其应用程序和数据存储在云中。以下是三种云服务器的模式: 本地部署的云服务器:这种云服务器提供了一个本地的托管基础设施。这种模式通常适用于那些将数据存储在本地计算机上的企业和组织。 云端部署的云服...
    99+
    2023-10-26
    三种 模式 服务器
  • 云服务器的三种模式是哪三种类型的
    云服务器(Cloud Direct)是一种常见的云计算服务,它提供了一种虚拟化资源供用户使用,使用户能够访问和管理这些资源,无论用户使用何种设备和操作系统。 以下是三种常见的云服务器模式: 公共云:这是一个由众多计算机提供商管理的云计算...
    99+
    2023-10-27
    三种 类型 模式
  • 云服务器的三种模式是什么模式
    云服务器的三种模式包括:按需使用(Distributed Access)、按需分配(Distributed Priority)、按需存储(Distributed Storage)。这三种模式是云计算中非常重要的服务模式,它们分别代表了云服务...
    99+
    2023-10-26
    模式 三种 服务器
  • 云服务器的三种类型是哪三种模式呢
    云服务器可以分为以下三种类型: 公共云:公共云提供了一个可用且稳定的资源池,包括主机、存储和网络等。用户不需要关心云的具体形式,只需要使用资源,例如网络带宽、存储空间、计算能力等。 私有云:私有云是指位于个人或企业用户自己的物理空间或网...
    99+
    2023-10-26
    三种 类型 模式
  • 初识Hadoop的三种安装模式
    特点:高可靠性(不怕丢)、高效性(处理速度快)、高容错性 ps:使用Hadoop版本: 接下来所用到的Hadoop2.8.5,虽然目前Hadoop已经更新到3.x了;但是我们始终秉持一个观点“用旧不用新”,因为毕竟旧版本较为稳定(目...
    99+
    2021-06-16
    初识Hadoop的三种安装模式
  • 三种工厂模式的C++实现
    引出工厂模式的设计问题◆ 1.为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现...
    99+
    2024-04-02
  • Java的三种代理模式简述
    目录一、代理模式是什么二、Java的三种代理模式1.静态代理2.动态代理(也叫JDK代理) 3.Cglib代理一、代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况...
    99+
    2024-04-02
  • Vue的三种路由模式总结
    目录路由模式解析1.hash模式2.history模式3.abstract模式路由三个基本概念vue中实现路由还是相对简单的vue-cli创建一个项目体验一下, 安装vue-rout...
    99+
    2024-04-02
  • C#异步编程的三种模式
    使用异步编程,方法调用是在后台运行(通常在线程和任务的帮助下),并且不会阻塞调用线程。异步编程有三种模式:异步模式,基于事件的异步模式和基于任务的异步模式(TAP)。 一.异步模式 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作