MySQL:MySQL工具以及5.7mysqlbinlog|mysql速度極慢問題


隨便記錄點(diǎn) 5.7.22代碼

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

  • 交互式
    就是我們平時(shí)用的交互式命令方式
  • 非交互式(batch mode)
    主要用于解析binlog和批量導(dǎo)入sql,每次都會(huì)讀取1行數(shù)據(jù)到buffer
    如果是binlog,那么每次大約讀取的原始數(shù)據(jù)為76字節(jié),及mysqlbinlog解析出來的一行
AAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAA
AAAAAP4AAAAAAAAAAP4KAAAAAAAAAP4UAAAAAAAAAP4eAAAAAAAAAP4oAAAAAAAAAP4yAAAAAAAA
AP48AAAAAAAAAP5GAAAAAAAAAP5QAAAAAAAAAP5aAAAAAAAAAP4KAAAAAAAAAP4AAAAAAAAAAP4A
AAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4AAAAA
AAAAAP4AAAAAAAAAAP4AAAAAAAAAAP4KAAAAAAAAAP4UAAAAAAAAAP4eAAAAAAAAAP4oAAAAAAAA
AP4yAAAAAAAAAP48AAAAAAAAAP5GAAAAAAAAAP5QAAAAAAAAAP5aAAAAAAAAAP4KAAAAAAAAAP4A

類似這里就有6行。如果是大事務(wù),每次解析76字節(jié),add_line 函數(shù)。然后等待大事務(wù)所有行解析完成后進(jìn)行com_do函數(shù)進(jìn)行執(zhí)行命令。
如果是sql語句,那么就是一條sql執(zhí)行一次沒有什么問題。

最近遇到mysqlbinlog|mysql大事務(wù)特別慢的情況,因此提交了如下問題:
https://bugs.mysql.com/bug.php?id=102278
8.0.13修復(fù)了,5.7.33最新版本依舊存在這個(gè)問題。

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!!

我進(jìn)行了一下修改,如下:

mysql.cc main函數(shù)下
MAX_BATCH_BUFFER_SIZE 已經(jīng)定義好為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目錄下,如果再次遇到這種問題,可以使用修改過的進(jìn)行執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容