mysql binlog关闭会提高入库效率吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql binlog关闭会提高入库效率吗相关的知识,希望对你有一定的参考价值。

之前有做过一个 binlog 压缩能节约多少空间的测试,效果上看还是比较理想的,可以节约一半以上的空间。但是这个又引出了一个新的问题,那就是这个功能对性能有多大影响呢?于是我又在测试环境试了一下,测试环境的物理配置如下。

根据之前的经验这套测试环境在 120 个表 + 240 个并发的情况,可以取得一个性能上的极大值;所以在这里就直接使用这个作为测试压力。

8.0.19 场景

第一步:安装。

dbma-cli-single-instance --port=3306 --max-mem=131072 \\--pkg=mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz install

第二步:创建测试用户。

create user sysbench@'%' identified by 'sysbench';create database tempdb;grant all on tempdb.* to sysbench@'%';

第三步:填充数据并进行压力测试。

sysbench --mysql-host=192.168.100.10  --mysql-port=3306 --mysql-user=sysbench \\--mysql-password=sysbench --tables=120 --table_size=100000 --mysql-db=tempdb \\--time=3600 --threads=240 oltp_point_select prepare
sysbench --mysql-host=192.168.100.10  --mysql-port=3306 --mysql-user=sysbench \\--mysql-password=sysbench --tables=120 --table_size=100000 --mysql-db=tempdb \\--time=3600 --threads=240 oltp_point_select run

性能表现。

资源消耗情况。

8.0.20 + binlog 压缩

第一步:安装。

dbma-cli-single-instance --port=3306 --max-mem=131072 \\--pkg=mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz install

第二步:创建测试用户。

create user sysbench@'%' identified by 'sysbench';create database tempdb;grant all on tempdb.* to sysbench@'%';
-- dbm-agent 默认会开启 binlog 压缩show global variables like 'binlog_transaction_compression%';+-------------------------------------------+-------+| Variable_name                             | Value |+-------------------------------------------+-------+| binlog_transaction_compression            | ON    || binlog_transaction_compression_level_zstd | 3     |+-------------------------------------------+-------+2 rows in set (0.00 sec)

第三步:填充数据并进行压力测试。

sysbench --mysql-host=192.168.100.10  --mysql-port=3306 --mysql-user=sysbench \\--mysql-password=sysbench --tables=120 --table_size=100000 --mysql-db=tempdb \\--time=3600 --threads=240 oltp_point_select prepare
sysbench --mysql-host=192.168.100.10  --mysql-port=3306 --mysql-user=sysbench \\--mysql-password=sysbench --tables=120 --table_size=100000 --mysql-db=tempdb \\--time=3600 --threads=240 oltp_point_select run

性能表现。

资源消耗情况。


8.0.20 + binlog 不压缩

第一步: 关闭 binlog 压缩功能。

set @@global.binlog_transaction_compression='OFF';
show global variables like 'binlog_transaction_compression%';+-------------------------------------------+-------+| Variable_name                             | Value |+-------------------------------------------+-------+| binlog_transaction_compression            | OFF   || binlog_transaction_compression_level_zstd | 3     |+-------------------------------------------+-------+2 rows in set (0.01 sec)

第二步:进行压力测试。

sysbench --mysql-host=192.168.100.10  --mysql-port=3306 --mysql-user=sysbench \\--mysql-password=sysbench --tables=120 --table_size=100000 --mysql-db=tempdb \\--time=3600 --threads=240 oltp_point_select run

性能表现。

资源消耗情况。

结论

开启 binlog 压缩会对性能有影响,大概会让性能下降 1%,cpu 多消耗 1%。

参考技术A 生产环境显然不可能重启数据库
看来在不重启的情况下,只能
set global sql_log_bin=OFF
在数据导入前先设定此参数
数据导入完成后,可以再开启本回答被提问者采纳

38 基于RocketMQ的数据过滤机制,提高订单数据库同步的处理效率

1. 数据库中混杂的binlog造成的问题

一个数据库中可能包含很多的数据,比如订单数据库,里面除了订单信息表以外,还包含很多其他的表。

这就导致在进行数据库 binlog 同步的时候,连带着会把一个数据库里所有表的 binlog 都推送到MQ里去了。

这样的情况下,在MQ的某个Topic中,就会混杂了几个或十几个表的 binlog数据,而不仅仅是订单表的binlog。

而在大数据系统中,它只关心订单数据库中的表A的 binlog ,并不关心其他表的 binlog,此时大数据系统就必须对获取到的所有表的 binlog 之后,对每条binlog判断一下是否是表 A 的 binlog。而这种操作必然导致大数据系统多耗费性能与时间去处理不关注的表的 binlog ,从而降低消息处理的效率。

2. 解决方案第一步:在发送消息的时候,给消息设置tag和属性

解决方案可以采用RocketMQ支持的数据过滤机制,来让大数据系统仅仅关注他想要的表的binlog数据即可。

首先,在发送消息的时候,可以给消息设置 tag 和属性。示例代码如下:

在上面的案例中,展示了发送消息的时候,还可以给消息设置 tag、属性等多个附加的信息。

3. 解决方案第二步:在消费数据的时候根据 tag 和属性进行过滤

在消费的时候根据 tag 和属性进行过滤,比如通过下面的代码去指定,只要 tag=TableA 和 tag=TableB 的数据。

 也可以通过下面的语法去指定,这里是根据每条消息的属性的值进行过滤,语法示例如下:

 RocketMQ支持比较丰富的数据过滤语法,如下所示:

(1)数值比较,比如:>,>=,<,<=,BETWEEN,=;

(2)字符比较,比如:=,<>,IN;

(3)IS NULL 或者 IS NOT NULL;

(4)逻辑符号 AND,OR,NOT;

(5)数值,比如:123,3.1415;

(6)字符,比如:‘abc’ ,比如用单引号包括起来;

(7)NULL, 特殊的常量;

(8)布尔值,TRUE 或 FALSE

以上是关于mysql binlog关闭会提高入库效率吗的主要内容,如果未能解决你的问题,请参考以下文章

MySQL BinLog 恢复误更新删除数据

MySQL BinLog 恢复误更新删除数据

MySQL BinLog 恢复误更新删除数据

MySQL BinLog 恢复误更新删除数据

java Spring 的JDBCTemplet批量入库数据时如果有一条数据入库不成功,其他的数据还会入库吗

redis 队列缓存 + mysql 批量入库 + php 离线整合