mysql 5.7 binlog 压缩_MySQL:MySQL工具以及5.7mysqlbinlog|mysql速度极慢问题

本文介绍了在使用mysqlbinlog|mysql处理大事务时遇到的性能问题,详细描述了由于每次仅读取76字节导致的效率低下。作者通过修改源代码,增大初始缓冲区大小来提高处理速度,并分享了修改后的执行效果。
摘要由CSDN通过智能技术生成

---

随便记录点 5.7.22代码

MySQL工具主要分为 交互式和非交互式

- 交互式

就是我们平时用的交互式命令方式

- 非交互式(batch mode)

主要用于解析binlog和批量导入sql,每次都会读取1行数据到buffer

如果是binlog,那么每次大约读取的原始数据为76字节,及mysqlbinlog解析出来的一行

```

AAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAA

AAAAAP4AAAAAAAAAAP4KAAAAAAAAAP4UAAAAAAAAAP4eAAAAAAAAAP4oAAAAAAAAAP4yAAAAAAAA

AP48AAAAAAAAAP5GAAAAAAAAAP5QAAAAAAAAAP5aAAAAAAAAAP4KAAAAAAAAAP4AAAAAAAAAAP4A

AAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAA

AAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4KAAAAAAAAAP4UAAAAAAAAAP4eAAAAAAAAAP4oAAAAAAAA

AP4yAAAAAAAAAP48AAAAAAAAAP5GAAAAAAAAAP5QAAAAAAAAAP5aAAAAAAAAAP4KAAAAAAAAAP4A

```

类似这里就有6行。如果是大事务,每次解析76字节,add_line 函数。然后等待大事务所有行解析完成后进行com_do函数进行执行命令。

如果是sql语句,那么就是一条sql执行一次没有什么问题。

最近遇到mysqlbinlog|mysql大事务特别慢的情况,因此提交了如下问题:

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

8.0.13修复了,5.7.33最新版本依旧存在这个问题。

```

Hi:

we use mysqlbinlog|mysql to parse binlog and recover binlog,when have large trasaction,mysql client tool

is very slow at add_line function.

20M trasaction event mysql add line use 1 hour!! cpu is 100% use in sy% and pstack mysql client stack like:

__memmove_sse3

my_realloc

String::mem_realloc

add_line

read_and_execute

main

when batch mode,mysql every time add 76 bytes event line to buffer,buffer init 520 bytes,when 20M event load in

buffer then call com_do funcation to execute command。

Breakpoint 9, add_line (buffer=..., line=0xa603e0 "/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;", line_length=45, in_string=0x7fffffffe287 "", ml_comment=0x7fffffffe286, truncated=false)

at /opt/percona-server-locks-detail-5.7.22/client/mysql.cc:2533

2533 bool need_space= 0;

(gdb) p buffer.m_length

$20 = 0

(gdb) p buffer.m_alloced_length

$21 = 520

when buffer is smaller, every time allocate 4K mem:

if (buffer.length() + length >= buffer.alloced_length())

buffer.mem_realloc(buffer.length()+length+IO_SIZE);

this step rise frequently mem allocate.and cpu sy% is very high!!

when mysql use batch mode can we use large init buffer or give our a parameter to control this.

when i search bug i find Bug #85155 is like this,is this fix at mysql 8.0.13,what 5.7 version fix this?

thanks!!

```

我进行了一下修改,如下:

```

mysql.cc main函数下

MAX_BATCH_BUFFER_SIZE 已经定义好为1G

glob_buffer.mem_realloc(MAX_BATCH_BUFFER_SIZE);

[root@mgr3 client]# /opt/my_mysql/bin/mysqlbinlog /opt/bin/log_bin.000002 |/opt/my_mysql/bin/mysql

速度极快了

[root@mgr3 client]# /opt/my_mysql/bin/mysqlbinlog /opt/bin/log_bin.000002 |/opt/my_mysql/bin/mysqlbak

CPU 99%

位于192.168.1.63 上的/opt/my_mysql/bin/mysqlbak目录下,如果再次遇到这种问题,可以使用修改过的进行执行。

```

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-2757322/,如需转载,请注明出处,否则将追究法律责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值