mysql个版本bug_MySQL 5.7最新版本的2个bug

本文详细介绍了在MySQL 5.7.17版本中遇到的两个bug:一是开启多线程复制时Seconds_Behind_Master延迟指标不准确;二是super_read_only开启时gtid_executed表压缩失败。通过复现bug,作者展示了问题的表现,并给出了Percona提供的解决方案。
摘要由CSDN通过智能技术生成

好久没写博客了,都长草了。新业务上了5.7没遇到什么问题,虽然没遇到什么问题,但不代表没有问题,我有个习惯就是没事就喜欢逛逛percona的Blog,于是看到目前最新GA版本5.7.17的2个bug,于是就搭建环境进行bug复现。目前知道的2个bug如下:

1. slave_parallel_workers > 0,也就是开启了多线程复制的时候如果有延时,那么Seconds_Behind_Master一直是0,不会变化,虽然这个参数不准确,但也是一个衡量指标。准确的复制延时判断的请看我前面的文章:主从复制延时判断

2. super_read_only开启的时候mysql库中的gtid_executed表会压缩失败,至于这个表是干嘛的请参考文章:MySQL 5.7中新增的表gtid_executed,看看是否解决了你的痛点,原文作者是姜承尧,但原作者的连接打不开了。

环境:5.7.17, 1主2从,下面进行第一个bug的复现,其中一个从库是普通复制,也就是没开启多线程复制,另外一个从库开启多线程复制。

首先用sysbench写入100w数据,然后在主库进行delete操作,模拟延时,然后查看区别。

sysbench --test=oltp --oltp-table-size=1000000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=1800 --mysql-user=root --mysql-socket=/data/mysql/3306/mysqltmp/mysql.sock --mysql-password=123 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex prepare

普通复制:

mysql> show variables like ‘%parallel%‘;+------------------------+----------+

| Variable_name | Value |

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

| slave_parallel_type | DATABASE |

| slave_parallel_workers | 0 |

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

2 rows in set (0.00sec)

mysql>

多线程复制:

mysql> show variables like ‘%parallel%‘;+------------------------+---------------+

| Variable_name | Value |

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

| slave_parallel_type | LOGICAL_CLOCK |

| slave_parallel_workers | 8 |

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

2 rows in set (0.02 sec)

准备查看复制延时脚本:

for i in {1..1000};do(

mysql-uroot -p123 -h 192.168.0.20 -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master" | awk ‘{print "slave_1_not-multi-threaded-repl: " $2}‘ &

sleep 0.1;

mysql-uroot -p123 -h 192.168.0.30 -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master" | awk ‘{print "slave_2_multi-threaded-repl: " $2}‘ &);sleep 1;done

让这个脚本跑起来,然后在主库删除数据,看复制延时的情况。然后在主库删除数据:

delete from sbtest where id>100;

运行脚本,查看复制延时情况,输出如下,可以看到开启了多线程复制的Seconds_Behind_Master一直为0,不会变化,而普通复制则显示延时了。

[[email protected]04 ~]# sh a.shmysql: [Warning] Using a password on the command line interface can be insecure.

slave_1_not-multi-threaded-repl: 103mysql: [Warning] Using a password on the command line interface can be insecure.

slave_2_multi-threaded-repl: 0mysql: [Warning] Using a password on the command line interface can be insecure.

slave_1_not-multi-threaded-repl: 104mysql: [Warning] Using a password on the command line interface can be insecure.

slave_2_multi-threaded-repl: 0mysql: [Warning] Using a password on the command line interface can be insecure.

slave_1_not-multi-threaded-repl: 105mysql: [Warning] Using a password on the command line interface can be insecure.

slave_2_multi-threaded-repl: 0mysql: [Warning] Using a password on the command line interface can be insecure.

mysql: [Warning] Using a password on the command line interface can be insecure.

slave_1_not-multi-threaded-repl: 106slave_2_multi-threaded-repl: 0

Percona给的解决方法是:

SELECT PROCESSLIST_TIME FROM performance_schema.threads WHERE NAME = ‘thread/sql/slave_worker‘ AND (PROCESSLIST_STATE IS NULL or PROCESSLIST_STATE != ‘Waiting for an event from Coordinator‘) ORDER BY PROCESSLIST_TIME DESC LIMIT 1;

下面进行super_read_only开启以后触发bug的复现:

1. 其中一个从库设置gtid_executed_compression_period=1,用来控制每执行多少个事务,对此表进行压缩,默认值为1000

2. super_read_only开启,超级用户都无法更改从库的数据。

3. 关闭log_slave_updates,如果开启,gtid_executed表不会实时变更,也不会压缩。(percona博客中开启了log_slave_updates也触发了bug,我认为是博客中有错误)

mysql> show variables like ‘%gtid_ex%‘;+----------------------------------+-------+

| Variable_name | Value |

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

| gtid_executed_compression_period | 1 |

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

1 row in set (0.01sec)

mysql> show variables like ‘%log_slave_updates%‘;+-------------------+-------+

| Variable_name | Value |

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

| log_slave_updates | OFF |

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

1 row in set (0.00sec)

mysql> show variables like ‘%super%‘;+-----------------+-------+

| Variable_name | Value |

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

| super_read_only | ON |

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

1 row in set (0.00sec)

mysql>

下面在主库运行sysbench进行压测,产生事务。

sysbench --test=oltp --oltp-table-size=100000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=1800 --mysql-user=root --mysql-socket=/data/mysql/3306/mysqltmp/mysql.sock --mysql-password=123 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex run

查看从库:

mysql> select count(*) fromgtid_executed;+----------+

| count(*) |

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

| 93 |

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

1 row in set (0.44sec)

mysql> select count(*) fromgtid_executed;+----------+

| count(*) |

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

| 113 |

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

1 row in set (0.66sec)

mysql>

可以发现并没有压缩,一直在增加。

执行show engine innodb status可以看到有线程在压缩表的,但是没成功,在回滚

---TRANSACTION 10909611, ACTIVE 2 sec rollback

mysql tables in use 1, locked 1ROLLING BACK4 lock struct(s), heap size 1136, 316row lock(s)

MySQL thread id1, OS thread handle 140435435284224, query id 0 Compressing gtid_executed table

查看INNODB_TRX表,也能发现有事务在回滚。

mysql> select trx_id,trx_state,trx_operation_state,trx_isolation_level frominformation_schema.INNODB_TRX;+-----------------+--------------+---------------------+---------------------+

| trx_id | trx_state | trx_operation_state | trx_isolation_level |

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

| 10919604 | ROLLING BACK | rollback | REPEATABLE READ |

| 421910840085200 | RUNNING | starting index read | REPEATABLE READ |

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

2 rows in set (0.00 sec)

看见现在表已经有很多记录了:

mysql> select count(*) fromgtid_executed;+----------+

| count(*) |

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

| 2448 |

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

1 row in set (0.00sec)

mysql>

关闭super_read_only

mysql> set global super_read_only=0;

Query OK,0 rows affected (0.00sec)

mysql> select count(*) fromgtid_executed;+----------+

| count(*) |

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

| 2 |

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

1 row in set (0.07sec)

mysql> select count(*) fromgtid_executed;+----------+

| count(*) |

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

| 2 |

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

1 row in set (0.00sec)

mysql>

马上恢复正常了。

参考文章:

原文:http://www.cnblogs.com/gomysql/p/6509237.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值