当前位置: 首页 > news >正文

MySQL binlog 日志解析后的exec_time导致表示什么时间?

1. exec_time 到底表示什么时间?

MySQL binlog日志解析后,我们能看到会有 exec_time= ,从字面意思理解这个记录的是执行时间,那这个记录的到底是单条sql的执行时间?还是事务的执行时间?下面通过测试来解读一下!

2.创建测试库表

mysql> create database test_shao;
Query OK, 1 row affected (0.03 sec)
mysql> use test_shao;
Database changed
mysql> create table test_1(id int not null auto_increment,primary key(id)) engine=innodb default charset=utf8mb4;
Query OK, 0 rows affected (0.03 sec)

3.RC隔离级别下 事务测试

show variables like 'transaction_isolation';
+-----------------------+----------------+
| Variable_name         | Value          |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+flush logs;
begin;
select count(*) from cmp_sys_1.message;
insert into test_1 select sleep(5);
select count(*) from cmp_sys_1.message;
insert into test_1 select sleep(10);
commit;mysql> flush logs;
Query OK, 0 rows affected (0.02 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> select count(*) from cmp_sys_1.message;+----------+
| count(*) |
+----------+
| 62882460 |
+----------+
1 row in set (45.24 sec)mysql> 
mysql> insert into test_1 select sleep(5);
Query OK, 1 row affected (5.00 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> select count(*) from cmp_sys_1.message;
+----------+
| count(*) |
+----------+
| 62882460 |
+----------+
1 row in set (35.73 sec)mysql> insert into test_1 select sleep(10);
Query OK, 1 row affected (10.00 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> commit;
Query OK, 0 rows affected (0.00 sec)

4.解析第3步生成的主库binlog

show master status;
+-----------------+-----------+--------------+------------------+----------------------------------------------+
| File            | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                            |
+-----------------+-----------+--------------+------------------+----------------------------------------------+
| 3306-bin.000781 | 364155470 |              |                  | bc129ea5-5f01-11ed-ae48-fa163efcbfd5:1-17199 |
+-----------------+-----------+--------------+------------------+----------------------------------------------+
show variables like 'log_bin_basename';
+------------------+-----------------------------------+
| Variable_name    | Value                             |
+------------------+-----------------------------------+
| log_bin_basename | /app/mysql/mysql3306/log/3306-bin |
+------------------+-----------------------------------+mysqlbinlog --base64-output=decode-rows -vvv  3306-bin.000781 >3306-bin.000781.txt

5.解析第3步生成的从库binlog

6.RR 隔离级别下,statment binlog格式下事务测试(从库还是row格式binlog)

#RC隔离级别下,binlog_format不允许使用statment格式

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> select count(*) from cmp_sys_1.message;
+----------+
| count(*) |
+----------+
| 62882460 |
+----------+
1 row in set (38.37 sec)mysql> insert into test_1 select sleep(10);
Query OK, 1 row affected, 1 warning (10.05 sec)
Records: 1  Duplicates: 0  Warnings: 1mysql> select count(*) from cmp_sys_1.message;
+----------+
| count(*) |
+----------+
| 62882460 |
+----------+
1 row in set (26.10 sec)mysql> insert into test_1 select sleep(15);
Query OK, 1 row affected, 1 warning (15.00 sec)
Records: 1  Duplicates: 0  Warnings: 1mysql> commit;
Query OK, 0 rows affected (0.00 sec)

7.解析第6步主库binlog日志(binlog_format=statment)

8.解析第6步从库binlog(binlog_format=row)

9.主库从库隔离级别都为RR,binlog_format=row时事务测试

mysql> use test_shao;
Database changed
mysql> set transaction_isolation='REPEATABLE-READ';
Query OK, 0 rows affected (0.00 sec)mysql> set binlog_format='Statement';
Query OK, 0 rows affected (0.00 sec)mysql> select * from test_1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
+----+
6 rows in set (0.00 sec)mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> select count(*) from cmp_sys_1.message;+----------+
| count(*) |
+----------+
| 62882460 |
+----------+
1 row in set (29.95 sec)mysql> 
mysql> insert into test_1 select sleep(4);
Query OK, 1 row affected, 1 warning (4.02 sec)
Records: 1  Duplicates: 0  Warnings: 1mysql> select count(*) from cmp_sys_1.message;
+----------+
| count(*) |
+----------+
| 62882460 |
+----------+
1 row in set (24.32 sec)mysql> insert into test_1 select sleep(8);
Query OK, 1 row affected, 1 warning (8.00 sec)
Records: 1  Duplicates: 0  Warnings: 1mysql> commit;
Query OK, 0 rows affected (0.00 sec)

10.解析第9步中主库binlog日志(隔离级别RR,binlog_format=statment)

11.解析第9步中从库binlog日志(隔离级别RR,binlog_format=statment)

#对应的relaylog中记录的是statment格式的binlog

##从库记录的binlog格式依然为row格式是因为我只是设置了从库全局的隔离级别为RR,binlog_format=statment,但是我并没有重启从库io和sql线程。如果只是设置了从库的binlog_format=statment,主要为row格式的话,从库复制会报如下错误

   LAST_ERROR_MESSAGE: Worker 1 failed executing transaction 'bc129ea5-5f01-11ed-ae48-fa163efcbfd5:17204' at master log 3306-bin.000785, end_log_pos 488; Error executing row event: 'Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.'

设置主库从库隔离级别为RR,binlog_format格式为statment重启复制线程后测试结果如下:

mysql> use test_shao;
Database changed
mysql> set transaction_isolation='REPEATABLE-READ';
Query OK, 0 rows affected (0.00 sec)mysql> set binlog_format='Statement';
Query OK, 0 rows affected (0.00 sec)mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> select count(*) from cmp_sys_1.message;
+----------+
| count(*) |
+----------+
| 62882460 |
+----------+
1 row in set (25.33 sec)mysql> insert into test_1 select sleep(2);
Query OK, 1 row affected, 1 warning (2.03 sec)
Records: 1  Duplicates: 0  Warnings: 1mysql> select count(*) from cmp_sys_1.message;
+----------+
| count(*) |
+----------+
| 62882460 |
+----------+
1 row in set (20.08 sec)mysql> insert into test_1 select sleep(4);
Query OK, 1 row affected, 1 warning (4.01 sec)
Records: 1  Duplicates: 0  Warnings: 1mysql> commit;
Query OK, 0 rows affected (0.00 sec)

主库binlog日志

从库binlog日志

#为什么从库binlog中第二个语句的exec_time时间为10s??从库statment binlog格式下,exec_time 到底如何记录时间,有待继续研究

http://www.lryc.cn/news/228778.html

相关文章:

  • 【Linux】:git基本操作_添加文件_两种场景_查看.git文件 || git修改文件 || 版本回退
  • Django 基于ORM的CURD、外键关联,请求的生命周期
  • 集合贴4——QA机器人设计与优化
  • 【Verilog语法】
  • 阿里云通用算力型u1服务器和e实例有什么区别?选择攻略
  • modbus-TCP协议详解
  • 爬虫项目(12):正则、多线程抓取腾讯动漫,Flask展示数据
  • gedit编辑文件时常用快捷键
  • 【C++干货铺】剖析string | 底层实现
  • nmap原理与使用
  • AI批量剪辑矩阵托管系统----源码技术开发
  • Pandas数据预处理python 数据分析之4——pandas 预处理在线闯关_头歌实践教学平台
  • [html] 动态炫彩渐变背景
  • AI 绘画 | Stable Diffusion 高清修复、细节优化
  • 想要检测TikTok网络是否安全?这五个网站请收好
  • 【docker:容器提交成镜像】
  • UE5中一机一码功能
  • gpt支持json格式的数据返回(response_format: ‘json_object‘)
  • MySQL(13):约束
  • 可以为一个servlet定义多个servlet-mapping、或url-pattern
  • .net在使用存储过程中IN参数的拼接方案,使用Join()方法
  • 基于RK3399的室内健身魔镜方案
  • leetCode 25.K 个一组翻转链表
  • ElasticSearch中常见的分词器介绍
  • 前端案例-css实现ul中对li进行换行
  • 【Unity】 场景优化策略
  • JavaWeb Day09 Mybatis-基础操作01-增删改查
  • 2.前端调试(控制台使用)
  • Jenkins简介及Docker Compose部署
  • sqli-labs关卡14(基于post提交的双引号闭合的报错注入)通关思路