我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MYSQL如何识别一个binlog中的一个事物

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MYSQL如何识别一个binlog中的一个事物

原创水平有限

测试版本5.7.14
设置GTID_MODE=ON
ON(3): Both new and replicated transactions must be GTID transactions(生成的是GTID事物,slave也只能应用GTID事物)
设置binlog格式为row模式
做如下操作
mysql> insert into test values(1,2);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values(2,3);
Query OK, 1 row affected (0.01 sec)
mysql> delete from test;
Query OK, 2 rows affected (0.01 sec)
mysql> select * from test;
Empty set (0.00 sec)

首先我通过自己的工具infobin找到了这段操作的binlog,如果想获得这个工具学习可以参考文章最后
简单解释一下这里  Pos:是当前位置对应mysqlbinlog的 # at 504这里的N_pos是结束位置对应
mysqlbinlog的 end_log_pos
>Gtid Event:Pos:504(0X1f8) N_pos:569(0X239) Time:1496993578 Event_size:65(bytes) 
Gtid:89dfa8a4-cb13-11e6-b54-0c29a879a3:2
-->Query Event:Pos:569(0X239) N_Pos:641(0X281) Time:1496993578 Event_size:72(bytes) 
Exe_time:0  Use_db:test Statment(35b-trun):BEGIN Gno:2
---->Map Event:Pos641(0X281) N_pos:689(0X2b1) Time:1496993578 Event_size:48(bytes) 
TABLE_ID:142 DB_NAME:test TABLE_NAME:test Gno:2
------>Insert Event:Pos:689(0X2b1) N_pos:733(0X2dd) Time:1496993578 Event_size:44(bytes) 
Dml on table: test.test  table_id:142 Gno:2 
>Xid Event:Pos:733(0X2dd) N_Pos:764(0X2fc) Time:1496993578 Event_size:31(bytes) 
COMMIT; Gno:2 --注意这里以N_Pos为结尾及下一个event的开始位置
>Gtid Event:Pos:764(0X2fc) N_pos:829(0X33d) Time:1496993581 Event_size:65(bytes) 
Gtid:89dfa8a4-cb13-11e6-b54-0c29a879a3:3
-->Query Event:Pos:829(0X33d) N_Pos:901(0X385) Time:1496993581 Event_size:72(bytes) 
Exe_time:0  Use_db:test Statment(35b-trun):BEGIN Gno:3
---->Map Event:Pos901(0X385) N_pos:949(0X3b5) Time:1496993581 Event_size:48(bytes) 
TABLE_ID:142 DB_NAME:test TABLE_NAME:test Gno:3
------>Insert Event:Pos:949(0X3b5) N_pos:993(0X3e1) Time:1496993581 Event_size:44(bytes) 
Dml on table: test.test  table_id:142 Gno:3 
>Xid Event:Pos:993(0X3e1) N_Pos:1024(0X400) Time:1496993581 Event_size:31(bytes) 
COMMIT; Gno:3  --注意这里以N_Pos为结尾及下一个event的开始位置
>Gtid Event:Pos:1024(0X400) N_pos:1089(0X441) Time:1496993584 Event_size:65(bytes) 
Gtid:89dfa8a4-cb13-11e6-b54-0c29a879a3:4
-->Query Event:Pos:1089(0X441) N_Pos:1161(0X489) Time:1496993584 Event_size:72(bytes) 
Exe_time:0  Use_db:test Statment(35b-trun):BEGIN Gno:4
---->Map Event:Pos1161(0X489) N_pos:1209(0X4b9) Time:1496993584 Event_size:48(bytes) 
TABLE_ID:142 DB_NAME:test TABLE_NAME:test Gno:4
------>Delete Event:Pos:1209(0X4b9) N_pos:1262(0X4ee) Time:1496993584 Event_size:53(bytes) 
Dml on table: test.test  table_id:142 Gno:4 
>Xid Event:Pos:1262(0X4ee) N_Pos:1293(0X50d) Time:1496993584 Event_size:31(bytes) 
COMMIT; Gno:4 --注意这里以N_Pos为结尾及下一个event的开始位置

显然这里包含了3个事物,
1、504到764为一个事物,工具显示这个event为Insert Event,在表test.test
2、764到1024为一个事物,工具显示这个event为Insert Event,在表test.test
3、1024到1293为一个事物,工具显示这个event为Delete Event,在表test.test

这就是我做的操作,这个工具主要是通过分析binlog event方便寻找事物,当然mysqlbinlog也可以只是输出有点不直观。
在通过mysqlbinlog分析的时候一定要注意一个事物的开始和结束。
(mysqlbinlog testsla.000003  -vv --start-postions=504 --stop-postions=1024 --base64-output=decode-rows 查看不通过base64算法显示二进制内容)
(mysqlbinlog testsla.000003  -vv --start-postions=504 --stop-postions=1024 查看通过base64算法显示二进制内容)

下面我们通过mysqlbinlog来分析上面的事物1 504到764为
# at 473
#170609 15:20:45 server id 933310  end_log_pos 504 CRC32 0x609296d7     Xid = 161
COMMIT; ---注意这里上一个事物的结束叫做xid event
# at 504     ---这里是事物1 的起点没叫做gtid event
#170609 15:32:58 server id 933310  end_log_pos 569 CRC32 0xf7eebfc7     GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '89dfa8a4-cb13-11e6-b504-000c29a879a3:2';
# at 569     ---这段event是query event
#170609 15:32:58 server id 933310  end_log_pos 641 CRC32 0xb4caa78c     Query   thread_id=4     exec_time=0     error_code=0
SET TIMESTAMP=1496993578;
BEGIN
;
# at 641     ---这段event是map event
#170609 15:32:58 server id 933310  end_log_pos 689 CRC32 0xb055655f     Table_map: `test`.`test` mapped to number 142
# at 689     ---这段event是insert event
#170609 15:32:58 server id 933310  end_log_pos 733 CRC32 0xd907a353     Write_rows: table id 142 flags: STMT_END_F
### INSERT INTO `test`.`test`
### SET
###   @1=1
###   @2=2
# at 733     --这段event是xid event
#170609 15:32:58 server id 933310  end_log_pos 764 CRC32 0x9dbe0a6b     Xid = 323
COMMIT;  ---这里是一个事物的结尾叫做xid event,但是注意不是733而是下一个event开始的位置764 或者是 xid event 的end_log_pos ,否则将会被回滚掉
# at 764
#170609 15:33:01 server id 933310  end_log_pos 829 CRC32 0x82aac64c     GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '89dfa8a4-cb13-11e6-b504-000c29a879a3:3';

所以我们认为一个事物的binlog是504到764
如果写为733会出现这种情况
 mysqlbinlog testsla.000003   --start-position=504 --stop-position=733 -vv   --base64-output=decode-rows

........
# at 689
#170609 15:32:58 server id 933310  end_log_pos 733 CRC32 0xd907a353     Write_rows: table id 142 flags: STMT_END_F
### INSERT INTO `test`.`test`
### SET
###   @1=1
###   @2=2
DELIMITER ;
# End of log file
ROLLBACK ;  --很明显没有xid event 没有commit而mysqlbinlog自己家了一个rollback而回滚掉了
Gno:5
-->Query Event:Pos:338(0X152) N_Pos:428(0X1ac) Time:1496998879 Event_size:90(bytes) 
Exe_time:0  Use_db:test Statment(35b-trun):delete from test Gno:5
>Xid Event:Pos:428(0X1ac) N_Pos:459(0X1cb) Time:1496998879 Event_size:31(bytes) 
COMMIT; Gno:5
及 
>GTID EVENT :事物开始
-->Query Event :begin
-->Query Event :正真的语句
>Xid Event: commit
没有Map Event和Insert Event,当然记录的是语句就节约空间了。
下面是mysqlbinlog输出

# at 194 --GTID EVENT开始
#170609 17:01:19 server id 933310  end_log_pos 259 CRC32 0x6a408c33     GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '89dfa8a4-cb13-11e6-b504-000c29a879a3:5';
# at 259   --Query Event BEGIN
#170609 17:01:19 server id 933310  end_log_pos 338 CRC32 0x9b25b2af     Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1496998879;
SET @@session.pseudo_thread_id=2;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1;
SET @@session.sql_mode=1075838976;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
;
SET @@session.character_set_client=83,@@session.collation_connection=83,@@session.collation_server=83;
SET @@session.lc_time_names=0;
SET @@session.collation_database=DEFAULT;
BEGIN
;
# at 338   --Query Event 正真的语句
#170609 17:01:19 server id 933310  end_log_pos 428 CRC32 0x4e4230f8     Query   thread_id=2     exec_time=0     error_code=0
use `test`;
SET TIMESTAMP=1496998879;
delete from test
;
# at 428 -- XID EVENT结束
#170609 17:01:19 server id 933310  end_log_pos 459 CRC32 0x38079d60     Xid = 159
COMMIT;

作者微信:

MYSQL如何识别一个binlog中的一个事物

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MYSQL如何识别一个binlog中的一个事物

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql如何开启一个事物

要在MySQL中开启一个事物,可以使用以下命令:START TRANSACTION;在事物开始后,可以执行需要在同一个事物中执行的SQL语句。最后,可以使用COMMIT语句来提交事物的更改,或者使用ROLLBACK语句来回滚事物并取消更改
mysql如何开启一个事物
2024-05-22

python 如何做一个识别率百分百的OCR

目录写在前面技术栈实现思路具体实现读取图片二值化图像膨胀找轮廓外接矩形过滤字符字符分割构造数据集向量搜索(分类)生成结果写在前面 当然这里说的百分百可能有点夸张,但其实想象一下,游戏里面的某个窗口的字符就是那种样子,不会变化的。而且识别的字
2022-06-02

如何利用MySQL和C++开发一个简单的人脸识别功能

要利用MySQL和C++开发一个简单的人脸识别功能,你可以按照以下步骤进行:1. 使用C++编写人脸识别程序的主要逻辑。你可以使用开源的人脸识别库,如dlib、OpenCV等。这些库提供了人脸检测、特征提取和人脸匹配等功能,可以帮助你实现人
2023-10-20

如何用php+mysql实现一个购物车功能

本篇内容介绍了“如何用php+mysql实现一个购物车功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、购物车功能概述购物车是一个在线商
2023-07-05

如何动手做一个识别手写数字的web应用

如何动手做一个识别手写数字的web应用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 01 进入docker容器我们使用docker容器,可以终端输入 :docker ps -
2023-06-19

MySQL中如何创建一个视图

在 MySQL 中创建一个视图可以通过使用 CREATE VIEW 语句来完成。视图是基于一个或多个表的查询结果,它类似于虚拟表,可以像表一样查询和使用。 下面是创建一个视图的基本语法: CREATE VIEW view_name ASSE
2023-08-17

如何在C#中实现一个TextBox事件

本篇文章为大家展示了如何在C#中实现一个TextBox事件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# TextBox事件的效果预期一般情况下:◆当一个页面有TextBox以及Button的时
2023-06-17

mysql中如何获取一个表的长度

在MySQL中,可以通过以下几种方式获取一个表的长度(即表的记录数):使用COUNT(*)函数:SELECT COUNT(*) FROM table_name;使用SHOW TABLE STATUS语句:SHOW TABLE STATU
mysql中如何获取一个表的长度
2023-10-28

mysql中如何拼接一个列的字段

在MySQL中,可以使用CONCAT()函数来拼接一个列的字段,示例如下:SELECT CONCAT(first_name, ' ', last_name) AS full_nameFROM customers;在上
mysql中如何拼接一个列的字段
2024-04-22

如何使用MongoDB开发一个简单的人脸识别系统

如何使用MongoDB开发一个简单的人脸识别系统人脸识别技术在当今社会中被广泛应用,它可以用于安全控制、人脸支付、人脸门禁等场景。利用MongoDB数据库与人脸识别算法结合,可以开发出一个简单而高效的人脸识别系统。本文将介绍如何使用Mong
2023-10-22

如何使用C++编写一个简单的图像识别程序?

如何使用C++编写一个简单的图像识别程序?在现代科技的发展中,图像识别技术扮演了越来越重要的角色。无论是人脸识别、物体检测还是自动驾驶,图像识别都发挥着关键作用。本文将介绍如何使用C++编写一个简单的图像识别程序,帮助读者了解图像识别的基本
如何使用C++编写一个简单的图像识别程序?
2023-11-03

如何中止一个 Promise 呢?一个有意思的问题

我们在工作中都会使用到 Promise.race这个方法去判断一个请求有没有超时,那同理,可不可以用 Promise.race 来进行中止 Promise 的操作呢?
Promise变量2024-11-29

一个月备考软考,如何快速识别并攻克薄弱知识点?

备考软考,一个月的时间虽然紧张,但只要方法得当,依然可以高效识别并攻克薄弱知识点。打算参加软考的考生,要如何快速识别并攻克薄弱知识点呢?具体请见下文。
一个月备考软考,如何快速识别并攻克薄弱知识点?
2024-10-14

如何在 Java 中编写一个类?详细步骤及注意事项(java如何写一个类)

在Java编程中,编写一个类是基础且重要的步骤。以下将详细介绍在Java中如何写一个类,分为以下几个关键步骤:一、类的定义在Java中,类是对象的模板,它定义了对象的属性和行为。类的定义以关键字clas
如何在 Java 中编写一个类?详细步骤及注意事项(java如何写一个类)
Java2024-12-18

MySQL如何让一个表中可以有多个自增列

目录1.手动指定自增值2.手动修改自增值3.一个表可以有多个自增列吗?4.其他注意事项4.1 自增列只能为整数类型4.2 必须配合 key 一起使用总结前言:自增列可使用 auto_increment 来实现,当一个列被标识为 auto_
2022-06-22

编程热搜

目录