MySQL偏移量的一点分析

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 在搭建MySQL主从的时候,change master是一个关键,如果没有使用GTID的方式,就需要使用偏移量和指定的binlog,每次需要手工去抓取这些信息,感觉还是比较费力,而且偏移量对我们来说就是一个黑盒子,到底递增多少,我们也不知道,只是给我们一个结果,但是搭建了一些环境之后,我突然发现了一些“规律”,比如下面的语句。

img_4e0a680c4a1d6bdcc915eb8175872e97.jpe

在搭建MySQL主从的时候,change master是一个关键,如果没有使用GTID的方式,就需要使用偏移量和指定的binlog,每次需要手工去抓取这些信息,感觉还是比较费力,而且偏移量对我们来说就是一个黑盒子,到底递增多少,我们也不知道,只是给我们一个结果,但是搭建了一些环境之后,我突然发现了一些“规律”,比如下面的语句。

CHANGE MASTER TO

MASTER_HOST='192.168.xxx.xxx.',

MASTER_USER='rpl_user1',

MASTER_PASSWORD='xxxx',

MASTER_PORT=24405,

MASTER_LOG_FILE='mysqlbin.000002',

MASTER_LOG_POS=154;

偏移量是154,当时觉得可能是巧合吧,也就没有在意,但是又配置了几套环境,发现指定的binlog偏移量都是154,我觉得这个问题蛮有意思,就做了些简单的测试。

我找了很多套环境,建立了主从复制关系,发现不同版本的这个偏移量都有些差别。

比如在Percona的一个指定版本中就是154,在官方版本中就是另外一个值,是否开启GTID使得这个偏移量也有很大的差别。怎么从这些信息中找到一个共性的东西呢。

我觉得偏移量就是一个类似步长的指标,对于MySQL中的操作都是通过event来触发,每个event的触发都有一个指定的步长,或者是一个指定范围的值。

比如在slave中show slave status的结果。

mysql> show slave statusG

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.xx.xxx

Master_User: rpl_user1

Master_Port: 24402

Connect_Retry: 60

Master_Log_File: mysqlbin.000027

Read_Master_Log_Pos: 154

Relay_Log_File: slave-relay-bin.000009

Relay_Log_Pos: 356711893

Relay_Master_Log_File: mysqlbin.000024

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如此一来,我的分析就有了一些思路,在不同版本中,这个值可能是有一定的差别,那我就不用钻牛角尖在这个具体的值上了。在不同的版本,是否启用GTID等都会有一个不同的范围。

-----+----------------+-----------+-------------+---------------------------------------

Pos | Event_type | Server_id | End_log_pos | Info

-----+----------------+-----------+-------------+---------------------------------------

4 | Format_desc | 228048 | 123 | Server ver: 5.7.19-log, Binlog ver: 4

通过上面的例子可以看到,其实的偏移量是4,第一行的信息就是binlog日志的头部信息了,Percona 5.7.19的这个偏移量终止于123,如果是在5.5.19的官方版本,这个值是107。

那得到了这个信息,对我们处理问题有什么实际意义呢,目前来看是没有,我们指定偏移量还是得做基本的验证。

那我们换个角度。查看binary log的信息。

mysql> show binary logs;

+---------------+-----------+

| Log_name | File_size |

+---------------+-----------+

| binlog.000019 | 239621 |

| binlog.000020 | 249 |

| binlog.000021 | 3783715 |

| binlog.000022 | 16632 |

| binlog.000023 | 249 |

| binlog.000024 | 249 |

| binlog.000025 | 65965 |

| binlog.000026 | 270 |

| binlog.000027 | 230 |

+---------------+-----------+

可以看到日志的大小。

系统层面的日志情况如何呢。可以看到日志的大小不一,很可能是我们做了手工做了切换。

-rw-r-----. 1 mysql mysql 239621 Oct 20 11:32 binlog.000019

-rw-r-----. 1 mysql mysql 249 Oct 20 16:28 binlog.000020

-rw-r-----. 1 mysql mysql 3783715 Oct 20 21:54 binlog.000021

-rw-r-----. 1 mysql mysql 16632 Oct 21 08:19 binlog.000022

-rw-r-----. 1 mysql mysql 249 Oct 21 08:21 binlog.000023

-rw-r-----. 1 mysql mysql 249 Oct 21 08:22 binlog.000024

-rw-r-----. 1 mysql mysql 65965 Oct 21 11:23 binlog.000025

-rw-r-----. 1 mysql mysql 270 Oct 21 14:23 binlog.000026

-rw-r-----. 1 mysql mysql 230 Oct 21 14:23 binlog.000027

不知道大家看到这里有什么收获呢。我们来解析一下,找一个有日志内容的文件,比如binlog.000025

mysql> show binlog events in 'binlog.000025';

最后一条信息就很有意思了。

| Log_name | Pos | Event_type | Server_id | End_log_pos | Info

| binlog.000025 | 65925 | Rotate | 228048 | 65965 | binlog.000026;pos=4

终止偏移量是65965,这个值和系统层面的binlog文件大小是一致的。所以明白了这一点之后,对于偏移量的理解又明白了一些。

而binlog里面存在大量的event,比如这里末尾的Rotate是什么意思呢。

是max_binlog_size的值或者执行flush logs命令时,binlog会发生切换,指向下一个binlog,其实偏移量还是4,但是如果是从库应用,就会是另外一个值,比如154或者更高的一个值。

得到这样一个值的意义是什么呢,我们就可以根据偏移量来计算数据变化的情况,比如从库端的复制进度,这些都是可以做出评估的。

更多的内容就需要看看源码里面是怎么写的了。

img_b1222c3bf9c2c8c7aa3b26f1e8aac226.jpe

img_a65e02317d3a9239759faa83028242ec.gif
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
关系型数据库 MySQL OLAP
无缝集成 MySQL,解锁秒级 OLAP 分析性能极限,完成任务可领取三合一数据线!
通过 AnalyticDB MySQL 版、DMS、DTS 和 RDS MySQL 版协同工作,解决大规模业务数据统计难题,参与活动完成任务即可领取三合一数据线(限量200个),还有机会抽取蓝牙音箱大奖!
|
2月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
124 7
MySQL事务日志-Undo Log工作原理分析
|
2月前
|
关系型数据库 MySQL 数据库
mysql慢查询每日汇报与分析
通过启用慢查询日志、提取和分析慢查询日志,可以有效识别和优化数据库中的性能瓶颈。结合适当的自动化工具和优化措施,可以显著提高MySQL数据库的性能和稳定性。希望本文的详解和示例能够为数据库管理人员提供有价值的参考,帮助实现高效的数据库管理。
58 11
|
1月前
|
缓存 NoSQL 关系型数据库
MySQL原理简介—4.深入分析Buffer Pool
本文介绍了MySQL的Buffer Pool机制,包括其作用、配置方法及内部结构。Buffer Pool是MySQL用于缓存磁盘数据页的关键组件,能显著提升数据库读写性能。默认大小为128MB,可根据服务器配置调整(如32GB内存可设为2GB)。它通过free链表管理空闲缓存页,flush链表记录脏页,并用LRU链表区分冷热数据以优化淘汰策略。此外,还探讨了多Buffer Pool实例、chunk动态调整等优化并发性能的方法,以及如何通过`show engine innodb status`查看Buffer Pool状态。关键词:MySQL内存数据更新机制。
|
3月前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
196 11
|
5月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1904 14
MySQL事务日志-Redo Log工作原理分析
|
5月前
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
|
5月前
|
SQL 关系型数据库 MySQL
MySQL 更新1000万条数据和DDL执行时间分析
MySQL 更新1000万条数据和DDL执行时间分析
376 4
|
5月前
|
SQL 自然语言处理 关系型数据库
Vanna使用ollama分析本地MySQL数据库
这篇文章详细介绍了如何使用Vanna结合Ollama框架来分析本地MySQL数据库,实现自然语言查询功能,包括环境搭建和配置流程。
815 0
|
6月前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
1180 2