MySQL Replication--复制延迟02--exec_time测试
复制延迟(Seconds_Behind_Master)测试
测试环境: MySQL 5.7.19
测试主从时间差:
检查主从系统时间差,同时在主库和从库执行SELECT NOW()语句:
主库:-- ::
从库:-- ::
从库比主库提前14秒,主从时间差14秒。
在主库上执行(使用基于语句格式复制):
select now();
update tb003 set c1=SLEEP() where id=;
select now();
主库上上执行效果:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| -- :: |
+---------------------+
row in set (0.00 sec) mysql> update tb003 set c1=SLEEP() where id=;
Query OK, row affected, warning (20.06 sec)
Rows matched: Changed: Warnings: mysql> select now();
+---------------------+
| now() |
+---------------------+
| -- :: |
+---------------------+
row in set (0.00 sec)
主库上生成的binlog解析结果:
# :: server id end_log_pos CRC32 0xcf2313f1 GTID last_committed= sequence_number= rbr_only=no
SET @@SESSION.GTID_NEXT= '025fd638-89ea-11e9-a749-40f2e9cf3aaa:9'/*!*/;
# at
# :: server id end_log_pos CRC32 0xa14a2bcb Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0xc283c9af Query thread_id= exec_time= error_code=
use `db001`/*!*/;
SET TIMESTAMP=/*!*/;
update tb003 set c1=SLEEP() where id=
/*!*/;
# at
# :: server id end_log_pos CRC32 0x0f3bdc57 Xid =
COMMIT/*!*/;
从库上relay log解析结果:
BINLOG '
+zwQXQ+4ohgAdwAAAAAAAAAgAAQANS43LjE5LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
Af0UlBk=
'/*!*/;
# at
# :: server id end_log_pos CRC32 0xcf2313f1 GTID last_committed= sequence_number= rbr_only=no
SET @@SESSION.GTID_NEXT= '025fd638-89ea-11e9-a749-40f2e9cf3aaa:9'/*!*/;
# at
# :: server id end_log_pos CRC32 0xa14a2bcb Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0xc283c9af Query thread_id= exec_time= error_code=
use `db001`/*!*/;
SET TIMESTAMP=/*!*/;
update tb003 set c1=SLEEP() where id=
/*!*/;
# at
# :: server id end_log_pos CRC32 0x0f3bdc57 Xid =
COMMIT/*!*/;
从库上生成binlog解析结果(从库上默认binlog_format=row):
# :: server id end_log_pos CRC32 0x6e1a971f GTID last_committed= sequence_number= rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= '025fd638-89ea-11e9-a749-40f2e9cf3aaa:9'/*!*/;
# at
# :: server id end_log_pos CRC32 0x063cd6ca Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0x405b61c7 Rows_query
# update tb003 set c1=SLEEP() where id=
# at
# :: server id end_log_pos CRC32 0x015803f1 Table_map: `db001`.`tb003` mapped to number
# at
# :: server id end_log_pos CRC32 0xb59069f9 Update_rows: table id flags: STMT_END_F BINLOG '
Ij0QXR24ohgAQAAAAIwBAACAACh1cGRhdGUgdGIwMDMgc2V0IGMxPVNMRUVQKDIwKSB3aGVyZSBp
ZD0xx2FbQA==
Ij0QXRO4ohgANAAAAMABAAAAAOgAAAAAAAEABWRiMDAxAAV0YjAwMwADCAMRAQAC8QNYAQ==
Ij0QXR+4ohgARgAAAAYCAAAAAOgAAAAAAAEAAgAD///4AQAAAAAAAAABAAAAXRA89fgBAAAAAAAA
AAAAAABdED0i+WmQtQ==
'/*!*/;
### UPDATE `db001`.`tb003`
### WHERE
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### SET
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
# at
# :: server id end_log_pos CRC32 0xae037515 Xid =
COMMIT/*!*/;
无论时主库binlog事件中还是从库relaylog事件以及从库binlog事件中记录的时间都是事务语句执行开始时间:
SET TIMESTAMP=/*!*/; SELECT FROM_UNIXTIME();
+---------------------------+
| FROM_UNIXTIME() |
+---------------------------+
| -- :: |
+---------------------------+
exec_time计算:The time from when the query started to when it was logged in the binlog, in seconds.
1、由于SQL语句中使用函数SLEEP(20),因此SQL语句执行时间=SLEEP(20)的执行时间+UPDATE操作的执行时间,而UPDATE操作的执行时间在10ms以内,因此整个SQL语句在主库的执行时间=20S,因此主库binlog的中记录exec_time=20
2、从库的relaylog用来存放主库传递过来的binlog,因此从库relaylog与主库binlog相同,从库relaylog中记录也是exec_time=20
3、由于主库使用binlog_format=statement的复制格式,因此SQL语句被传递到从库并原样执行,同样执行需要20S,但该语句在主库的开始执行时间(the query started)为2019-06-24 11:01:54,而在从库执行结束时间(log in binlog)为2019-06-24 11:02:48,因此从库binlog中记录时间exec_time=54,忽略主从事务日志落盘和网络传输时间,exec_time=54S=主库语句执行时间(20)+从库语句执行时间(20S)+主从时间差(14S)。
在主库上执行(使用基于行格式复制):
mysql> select now();
+---------------------+
| now() |
+---------------------+
| -- :: |
+---------------------+
row in set (0.00 sec) mysql> update tb003 set c1=SLEEP() where id in (,);
Query OK, rows affected (40.04 sec)
Rows matched: Changed: Warnings: mysql> select now();
+---------------------+
| now() |
+---------------------+
| -- :: |
+---------------------+
row in set (0.00 sec)
产生的binlog解析结果为:
# at
# :: server id end_log_pos CRC32 0x037e9b24 GTID last_committed= sequence_number= rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= '025fd638-89ea-11e9-a749-40f2e9cf3aaa:65'/*!*/;
# at
# :: server id end_log_pos CRC32 0xe186daee Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0x9f76a54a Rows_query
# update tb003 set c1=SLEEP() where id in (,)
# at
# :: server id end_log_pos CRC32 0x139892d9 Table_map: `db001`.`tb003` mapped to number
# at
# :: server id end_log_pos CRC32 0xf7980c93 Update_rows: table id flags: STMT_END_F BINLOG '
ZW0RXR24ohgARwAAAPYCAACAAC91cGRhdGUgdGIwMDMgc2V0IGMxPVNMRUVQKDIwKSB3aGVyZSBp
ZCBpbiAoMyw0KUqldp8=
ZW0RXRO4ohgANAAAACoDAAAAAGwAAAAAAAEABWRiMDAxAAV0YjAwMwADCAMRAQAC2ZKYEw==
ZW0RXR+4ohgAaAAAAJIDAAAAAGwAAAAAAAEAAgAD///4AwAAAAAAAAABAAAAXRFrW/gDAAAAAAAA
AAAAAABdEW1l+AQAAAAAAAAAAQAAAF0Ra1v4BAAAAAAAAAAAAAAAXRFtZZMMmPc=
'/*!*/;
### UPDATE `db001`.`tb003`
### WHERE
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### SET
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### UPDATE `db001`.`tb003`
### WHERE
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### SET
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
# at
# :: server id end_log_pos CRC32 0x1f65c801 Xid =
COMMIT/*!*/;
在主库上执行(使用基于行格式复制+两条语句组合事务操作):
mysql> select now();
+---------------------+
| now() |
+---------------------+
| -- :: |
+---------------------+
row in set (0.00 sec) mysql> begin;
Query OK, rows affected (0.00 sec) mysql> update tb003 set c1=SLEEP() where id =;
Query OK, row affected (20.00 sec)
Rows matched: Changed: Warnings: mysql> update tb003 set c1=SLEEP() where id =;
Query OK, row affected (20.00 sec)
Rows matched: Changed: Warnings: mysql> commit;
Query OK, rows affected (0.05 sec) mysql> select now();
+---------------------+
| now() |
+---------------------+
| -- :: |
+---------------------+
row in set (0.00 sec)
产生的binlog解析结果为:
# at
# :: server id end_log_pos CRC32 0x5a8cb5f0 GTID last_committed= sequence_number= rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= '025fd638-89ea-11e9-a749-40f2e9cf3aaa:66'/*!*/;
# at
# :: server id end_log_pos CRC32 0x5217a928 Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0x1a70cac7 Rows_query
# update tb003 set c1=SLEEP() where id =
# at
# :: server id end_log_pos CRC32 0x4cf6d8c7 Table_map: `db001`.`tb003` mapped to number
# at
# :: server id end_log_pos CRC32 0x033f26f8 Update_rows: table id flags: STMT_END_F BINLOG '
HHERXR24ohgAQQAAAHwEAACAACl1cGRhdGUgdGIwMDMgc2V0IGMxPVNMRUVQKDIwKSB3aGVyZSBp
ZCA9NcfKcBo=
HHERXRO4ohgANAAAALAEAAAAAGwAAAAAAAEABWRiMDAxAAV0YjAwMwADCAMRAQACx9j2TA==
HHERXR+4ohgARgAAAPYEAAAAAGwAAAAAAAEAAgAD///4BQAAAAAAAAABAAAAXRDBV/gFAAAAAAAA
AAAAAABdEXEc+CY/Aw==
'/*!*/;
### UPDATE `db001`.`tb003`
### WHERE
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### SET
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
# at
# :: server id end_log_pos CRC32 0x3b3202fa Rows_query
# update tb003 set c1=SLEEP() where id =
# at
# :: server id end_log_pos CRC32 0x8b013c05 Table_map: `db001`.`tb003` mapped to number
# at
# :: server id end_log_pos CRC32 0xf7d67996 Update_rows: table id flags: STMT_END_F BINLOG '
MHERXR24ohgAQQAAADcFAACAACl1cGRhdGUgdGIwMDMgc2V0IGMxPVNMRUVQKDIwKSB3aGVyZSBp
ZCA9NvoCMjs=
MHERXRO4ohgANAAAAGsFAAAAAGwAAAAAAAEABWRiMDAxAAV0YjAwMwADCAMRAQACBTwBiw==
MHERXR+4ohgARgAAALEFAAAAAGwAAAAAAAEAAgAD///4BgAAAAAAAAABAAAAXRB9NvgGAAAAAAAA
AAAAAABdEXEwlnnW9w==
'/*!*/;
### UPDATE `db001`.`tb003`
### WHERE
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
### SET
### @= /* LONGINT meta=0 nullable=0 is_null=0 */
### @= /* INT meta=0 nullable=1 is_null=0 */
### @= /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */
# at
# :: server id end_log_pos CRC32 0x8b074201 Xid =
COMMIT/*!*/;
可以发现上面两个操作都执行了40秒,但在事务开始前(BEGIN)的exec_time都仅为20,且事务内部单个操作没有exec_time。
ev->exec_time的计算在sql/log_event.cc中的代码如下:
/*
exec_time calculation has changed to use the same method that is used
to fill out "thd_arg->start_time"
*/ struct timeval end_time;
ulonglong micro_end_time= my_micro_time();
my_micro_time_to_timeval(micro_end_time, &end_time); exec_time= end_time.tv_sec - thd_arg->start_time.tv_sec;
exec_time在文件sql/log_event.h中的注解如下:
<tr>
<td>exec_time</td>
<td>4 byte unsigned integer</td>
<td>The time from when the query started to when it was logged in the binlog, in seconds.</td>
</tr>
MySQL Replication--复制延迟02--exec_time测试的更多相关文章
- 浅谈MySQL Replication(复制)基本原理
1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...
- mysql replication 复制的一些问题
1 过大的复制延迟 mysql 的复制延迟是一个常见问题,现在已经有一些解决方案,如淘宝开发的一些工具 2 没有磁盘空间 复制导致磁盘空间塞满,二进制日志.中继日志或临时文件把磁盘塞满,slave ...
- 在Docker平台实现MySQL Replication(复制)
MySQL Replication提供了数据库之间复制数据的功能,通过这个功能可以让一个数据库的数据更改自动同步到另外一个数据库.通常用这个功能来实现数据备份.数据容灾.数据冗余,进一步实现数据的读写 ...
- mysql cp复制和mysqldump备份测试
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 备份策略 针对不同的场景下, 我们应该制定不同的备份策略对数据库进行 ...
- Windows 下MySql Replication(复制)配置
环境准备 到官网下载mysql-installer-web-community-5.7.21.0.msi并安装,选择MySql Workbench,记录安装时root输入的密码. 需要安装在两台机器上 ...
- 你遇到过哪些原因造成MySQL异步复制延迟?
master上多为并发事务,salve上则多为单线程回放(MySQL 5.7起,支持真正的并行回放,有所缓解) 异步复制,本来就是有一定延迟的(否则也不叫做异步了,介意的话可以改成半同步复制) sla ...
- MySQL异步复制延迟解决
http://www.ttlsa.com/mysql/mysql-5-7-enhanced-multi-thread-salve/
- 浅析 MySQL Replication(本文转自网络,非本人所写)
作者:卢飞 来源:DoDBA(mysqlcode) 0.导读 本文几乎涵盖了MySQL Replication(主从复制)的大部分知识点,包括Replication原理.binlog format.复 ...
- 浅析 MySQL Replication(转)
目前很多公司中的生产环境中都使用了MySQL Replication ,也叫 MySQL 复制,搭建配置方便等很多特性让 MySQL Replication 的应用很广泛,我们曾经使用过一主拖20多个 ...
- 浅析 MySQL Replication(本文转自网络)
作者:卢飞 来源:DoDBA(mysqlcode) 0.导读 本文几乎涵盖了MySQL Replication(主从复制)的大部分知识点,包括Replication原理.binlog format.复 ...
随机推荐
- Java8相关底层
Java8是往并行方向走的.由面向对象到函数式编程. 在支持函数式编程的同时还可以支持面向对象的开发. 在JDK1.8里面,接口里面可以有实现方法的!默认方法,default.实现这个接口. 接口里面 ...
- mysql中字符串的隐藏字符处理
三步解决mysql字符串的隐藏字符: 1. 隐藏字符导致字符串长度边长,用mysql 自带的 Hex函数让隐藏字符显示真身, 2. 可以拿到隐藏字符的16进制码,然后用windows自带的计算器转化成 ...
- Android android:allowBackup waiting for backup
在Google settings 中,有个backup 选项,在里面选择开启 如果开启vpn,还是在setting里面还是waiting for backup, 就通过手机链接电脑,安装android ...
- json 格式化处理工具
json 格式化处理工具 用于JSON的快速命令行处理工具,简单无依赖. 我这边列举一些最常用的: 调试 http 请求时打印格式化后的数据 格式化本地或或流中的数据 获取 json 的键值或进行执行 ...
- Hive、Inceptor数据倾斜详解及解决
一.倾斜造成的原因 正常的数据分布理论上都是倾斜的,就是我们所说的20-80原理:80%的财富集中在20%的人手中, 80%的用户只使用20%的功能 , 20%的用户贡献了80%的访问量. 俗话是,一 ...
- PAT-2019年冬季考试-甲级 7-4 Cartesian Tree (30分)(最小堆的中序遍历求层序遍历,递归建树bfs层序)
7-4 Cartesian Tree (30分) A Cartesian tree is a binary tree constructed from a sequence of distinct ...
- 工控随笔_22_关于Profibus网络接线的规则
最近在做一个项目调试,用的是西门子的PLC,416-2 DP,下面挂了几个DP子网,在进行现场网络测试的时候,有几个走的DP网络的 绝对值编码器,无论怎么弄DP网络不能联通. 一开始我以为DP网线接的 ...
- 2019 西安邀请赛 D
//n件物品,m种关系,(有关系的2个不能在同一组) //把所有物品分为2组,希望最后2组的差值尽可能小,输出较大者 /* 二分图涂色+可行性(01)背包 dp[i] =1表示 最后差值为i可行 建图 ...
- 手撕面试官系列(十一):BAT面试必备之常问85题
JVM专题 (面试题+答案领取方式见侧边栏) Java 类加载过程? 描述一下 JVM 加载 Class 文件的原理机制? Java 内存分配. GC 是什么? 为什么要有 GC? 简述 Java ...
- Python之路【第十七篇】:Python并发编程|协程
一.协程 协程,又叫微线程,纤程.英文名Coroutine.协程本质上就是一个线程 优点1:协程极高的执行效率.因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线 ...