返回顶部
首页 > 资讯 > 数据库 >MYSQL如何识别一个binlog中的一个事物
  • 743
分享到

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

2024-04-02 19:04:59 743人浏览 八月长安
摘要

原创水平有限 测试版本5.7.14 设置GTID_MODE=ON ON(3): Both new and replicated transactions must be GTID transactions

原创水平有限

测试版本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中的一个事物
您可能感兴趣的文档:

--结束END--

本文标题: MYSQL如何识别一个binlog中的一个事物

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

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

猜你喜欢
  • MYSQL如何识别一个binlog中的一个事物
    原创水平有限 测试版本5.7.14 设置GTID_MODE=ON ON(3): Both new and replicated transactions must be GTID transactions...
    99+
    2024-04-02
  • mysql如何开启一个事物
    要在MySQL中开启一个事物,可以使用以下命令: START TRANSACTION; 在事物开始后,可以执行需要在同一个事物中执...
    99+
    2024-05-22
    mysql
  • 基于Python制作一个动物识别小程序
    目录 引言研究背景目的与意义 动物识别技术概述基本原理图像处理与特征提取机器学习与深度学习方法 数据集与数据预处理数据收集与构建数据预处理步骤数据增强技术 特征提取与选择基...
    99+
    2023-10-25
    python 开发语言 图像处理
  • python 如何做一个识别率百分百的OCR
    目录写在前面技术栈实现思路具体实现读取图片二值化图像膨胀找轮廓外接矩形过滤字符字符分割构造数据集向量搜索(分类)生成结果写在前面 当然这里说的百分百可能有点夸张,但其实想象一下,游戏里面的某个窗口的字符就是那种样子,...
    99+
    2022-06-02
    python OCR python OCR识别率百分百
  • jQuery如何绑定一个函数到一个事件
    这篇文章将为大家详细讲解有关jQuery如何绑定一个函数到一个事件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。绑定一个函数到一个事件$('#foo').bind('click&#...
    99+
    2023-06-27
  • 如何用php+mysql实现一个购物车功能
    本篇内容介绍了“如何用php+mysql实现一个购物车功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、购物车功能概述购物车是一个在线商...
    99+
    2023-07-05
  • 如何利用MySQL和C++开发一个简单的人脸识别功能
    要利用MySQL和C++开发一个简单的人脸识别功能,你可以按照以下步骤进行:1. 使用C++编写人脸识别程序的主要逻辑。你可以使用开...
    99+
    2023-10-20
    MySQL
  • html如何实现一个只有微软IE可识别
    这篇文章主要为大家展示了“html如何实现一个只有微软IE可识别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“html如何实现一个只有微软IE可识别”这篇文章吧...
    99+
    2024-04-02
  • 一文弄懂MySQL中redo log与binlog的区别
    目录前言1. 什么是redo log?1.1 redo日志文件名1.2 影响redo log参数1.3 redo log大小怎么设置?2. 什么是binlog2.1 binlog文件...
    99+
    2024-04-02
  • 如何动手做一个识别手写数字的web应用
    如何动手做一个识别手写数字的web应用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 01 进入docker容器我们使用docker容器,可以终端输入 :d...
    99+
    2023-06-19
  • MySQL中如何创建一个视图
    在 MySQL 中创建一个视图可以通过使用 CREATE VIEW 语句来完成。视图是基于一个或多个表的查询结果,它类似于虚拟表,可以像表一样查询和使用。 下面是创建一个视图的基本语法: CREATE VIEW view_name ASSE...
    99+
    2023-08-17
    mysql 数据库
  • 如何在C#中实现一个TextBox事件
    本篇文章为大家展示了如何在C#中实现一个TextBox事件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# TextBox事件的效果预期一般情况下:◆当一个页面有TextBox以及Button的时...
    99+
    2023-06-17
  • 如何使用vue3打造一个物料库
    目录为什么要做物料库?物料是什么?物料的类别fuep,基于vue3的物料库为什么要做物料库? 我们写过很多登录页面。而每个登录页面除了一些背景图和颜色外,主体布局几乎是一致的,就那...
    99+
    2024-04-02
  • mysql如何给一个表一次增加多个字段
    可以使用ALTER TABLE语句来一次增加多个字段,语法如下: ALTER TABLE table_name ADD COLUMN...
    99+
    2024-04-09
    mysql
  • python如何在一个py文件中获取另一个py文件中的值(一个或多个)
    目录如何在一个py文件中获取另一个py文件中的值(一个或多个)在一个py文件中调用另一个py文件中的变量一、目的二、解决方案三、实例演示如何在一个py文件中获取另一个py文件中的值(...
    99+
    2024-04-02
  • Python中怎么实现一个面部识别功能
    这篇文章给大家介绍Python中怎么实现一个面部识别功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Haar人脸特征分类器用以下图像为例:来看看识别这张图片中的人脸代码:import cv2 ...
    99+
    2023-06-16
  • mysql如何创建一个表
    这篇文章给大家分享的是有关mysql如何创建一个表的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1.登陆成功后,首先进入某一个数据库 (不是指数据库服务器)use t1; //...
    99+
    2024-04-02
  • mysql如何建立一个表
    要建立一个 mysql 表,需要执行以下五个步骤:1. 连接到 mysql 服务器;2. 创建数据库;3. 使用数据库;4. 使用 create table 语句创建表;5. 提交更改。...
    99+
    2024-06-15
    mysql
  • spring注解识别一个接口的多个实现类方法
    1.比如有一个接口如下:public interface Filter { public String doFilter(String param); }...
    99+
    2023-05-31
    spring 注解 接口
  • mysql中如何获取一个表的长度
    在MySQL中,可以通过以下几种方式获取一个表的长度(即表的记录数): 使用COUNT(*)函数: SELECT COU...
    99+
    2023-10-28
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作