首页 > 数据库 >技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因

时间:2022-12-20 15:36:25浏览次数:64  
标签:Binlog 8.0 MySQL t1 回灌 mysql 客户端


作者:郭斌斌

爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。



一、背景

客户反馈生产环境中,MySQL 5.7 通过 xtrabackup+ Binlog 做基于时间点的恢复操作时,持续卡在 Binlog 的回放阶段,旷日持久,久到离谱。他对于这种旷日持久的操作产生了怀疑,想要确认数据库的这种行为是否合理,因此有了本文的 Binlog 回灌验证操作。

二、复现前提

MySQL Version:5.7.22

Binlog format: Row

准备 Delete 800多万记录的 Binlog

三、复现准备

3.1 创建表、构造数据

mysql> create table t1(id int primary key,name varchar(10));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1 values(1,repeat('a',10));
Query OK, 1 row affected (0.01 sec)

mysql> insert into t1 select (select count(1) from t1)+id,name from t1;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
………………
mysql> insert into t1 select (select count(1) from t1)+id,name from t1;
Query OK, 4194304 rows affected (57.75 sec)
Records: 4194304 Duplicates: 0 Warnings: 0

3.2 准备 Delete 800多万记录的 Binlog 文件

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_mysql

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_客户端_02

MySQL Binlog mysql-bin.000003 用于回灌测试

3.3 由于 Binlog 的回灌和造数是在同一个实例上,之前为了构建 Delete 800多万记录的 Binlog ,已经将数据删除,因此在进行 binlog 回灌前,需要使用之前造数的方法,重新造数

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_MySQL_03

3.4 同一个实例上先进行了 Delete ,又重新构建新的数据。导致 Delete 操作的 GTID 要比重新造数操作的 GTID 小,为保证可以正常回灌,可以执行 reset master

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_数据恢复_04

四、复现测试

4.1 解析 MySQL Binlog mysql-bin.000003

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_数据恢复_05

4.2 导入解析文件

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_mysql_06

A Few Moment Later

4.3 查看 processlist ,发现导入线程一直处于 Sleep 状态,现象跟客户描述契合。

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_mysql_07

4.4 随即中断导入操作,重新发起导入同时使用 strace 记录操作的行为。

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_客户端_08

4.5 通过观测产生的 strace.log ,发现两个 read 的时间间隔不固定,少的也需要140ms左右,而读取的大小却只有4k(4096),读取效率偏低。

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_数据恢复_09

五、分析

通过 Google 检索“MySQL Mem Load Slow”发现这是一个 BUG ,MySQL 5.7 Client 在读取较大事务(涉及多行操作)时,由于内存分配效率比较低,导致消耗大量的时间,已在 MySQL 8.0.13 中修复。

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_MySQL_10

六、复测

6.1 Mysql 8.0.18 客户端进行 Binlog 解析文件的回灌,提示 MySQL Server has gone away

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_数据恢复_11

6.2 导数报错时数据库没触发重启,查看 error 日志,有如下报错:

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_客户端_12

6.3 调大 max_allowed_packet 配置后重新测试

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_客户端_13

6.4 观测 strace 日志,每次读取 Binlog 大小16M,远高于原来的4k

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_数据恢复_14

6.5 观测线程状态

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_MySQL_15

6.6 观察执行耗时,MySQL 8.0.18 客户端导数时间变短,效率提升明显。

技术分享 | MySQL Binlog 通过 MySQL 客户端导入数据库效率低的原因_mysql_16

七、结论

目前官方在 MySQL 8.0.13 版本中,解决了“在使用 MySQL Client 进行批量导数时,内存分配效率低”的问题,因此 MySQL 8.0.18 客户端在进行回灌 Binlog 解析后的文件时,读取文件效率明显高于5.7.22的客户端,提升了 Binlog回放的效率。

参考链接

​https://bugs.mysql.com/bug.php?id=85155​

​https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-13.html#mysqld-8-0-13-bug​


标签:Binlog,8.0,MySQL,t1,回灌,mysql,客户端
From: https://blog.51cto.com/u_15077536/5955940

相关文章

  • 技术分享 | MySQL 执行 GROUP BY 的四种方式
    作者:PeterZaitsev翻译:管长龙在日常查询中,索引或其他数据查找的方法可能不是查询执行中最高昂的部分,例如:MySQLGROUPBY可能负责查询执行时间90%还多。MySQL执行GROUP......
  • 技术分享 | 从 MySQL 8.0 复制到 MySQL 5.7
    作者:ViniciusGrippa翻译:管长龙本文中,我们将讨论如何设置从MySQL8.0到MySQL5.7的复制。在某些情况下,使用此配置可能会有所帮助。例如,在MySQL升级的情况下,将使用较......
  • 技术分享 | MySQL 内存管理初探
    作者:xuty*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。一、背景经常在项目上碰到在没有大并发活跃SQL的情况下,MySQL所占用的物理内存......
  • 技术分享 | ProxySQL 搭配 MySQL HA (下)
    作者:杨涛涛资深数据库专家,专研MySQL十余年。擅长MySQL、PostgreSQL、MongoDB等开源数据库相关的备份恢复、SQL调优、监控运维、高可用架构设计等。目前任职于爱可生,为......
  • 技术分享 | 关于 MySQL 自增 ID 的事儿
    作者:贲绍华爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。当我们使用MySQL进行数据存储时,一般会为一张表设置一个自增主键,当有数据行插入时,该主键......
  • 技术分享 | MySQL:change buffer 何时生效
    作者:胡呈清爱可生DBA团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。已知changebuffer的原理对于普通二级索引,当插入、修改......
  • 技术分享 | 网络带宽如何影响 MySQL 性能
    作者:VadimTkachenko翻译:管长龙网络是数据库基础架构的主要部分。但是,通常性能基准测试是在本地计算机上完成的,客户端和服务器并置在一起。这样做是为了简化结构并排除一个......
  • 技术分享 | 实战 MySQL 8.0.17 Clone Plugin
    作者:陈俊聪背景很神奇,5.7.17和8.0.17,连续两个17小版本都让人眼前一亮。前者加入了组复制(GroupReplication)功能,后者加入了克隆插件(ClonePlugin)功能。今天我们实战测......
  • 故障分析 | MySQL:唯一键约束失效
    作者:胡呈清爱可生DBA团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。最近遇到一个故障:单主模式5节点MGR集群,在使用mysqlshe......
  • docker-compose 编排Net6项目,redis/mysql/nlog实战
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、新建net6webapi项目一个非常简单的net6项目,使用mysql数据库,redis做缓存   关于项目的搭建,这里不做说明,本篇主......