好久没写博客了,都长草了。新业务上了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= --oltp-read-only=off --init-rng=on --num-threads= --max-requests= --oltp-dist-type=uniform --max-time= --mysql-user=root --mysql-socket=/data/mysql//mysqltmp/mysql.sock --mysql-password= --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.00 sec) 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 {..};
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 ;
done

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

delete from sbtest where id>100;

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

[root@dbserver-yayun- ~]# sh a.sh
mysql: [Warning] Using a password on the command line interface can be insecure.
slave_1_not-multi-threaded-repl:
mysql: [Warning] Using a password on the command line interface can be insecure.
slave_2_multi-threaded-repl:
mysql: [Warning] Using a password on the command line interface can be insecure.
slave_1_not-multi-threaded-repl:
mysql: [Warning] Using a password on the command line interface can be insecure.
slave_2_multi-threaded-repl:
mysql: [Warning] Using a password on the command line interface can be insecure.
slave_1_not-multi-threaded-repl:
mysql: [Warning] Using a password on the command line interface can be insecure.
slave_2_multi-threaded-repl:
mysql: [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:
slave_2_multi-threaded-repl:

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.01 sec) mysql> show variables like '%log_slave_updates%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| log_slave_updates | OFF |
+-------------------+-------+
1 row in set (0.00 sec) mysql> show variables like '%super%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| super_read_only | ON |
+-----------------+-------+
1 row in set (0.00 sec) mysql>

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

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

查看从库:

mysql> select count(*) from gtid_executed;
+----------+
| count(*) |
+----------+
| 93 |
+----------+
1 row in set (0.44 sec) mysql> select count(*) from gtid_executed;
+----------+
| count(*) |
+----------+
| 113 |
+----------+
1 row in set (0.66 sec) mysql>

可以发现并没有压缩,一直在增加。
执行show engine innodb status可以看到有线程在压缩表的,但是没成功,在回滚

---TRANSACTION 10909611, ACTIVE 2 sec rollback
mysql tables in use 1, locked 1
ROLLING BACK 4 lock struct(s), heap size 1136, 316 row lock(s)
MySQL thread id 1, 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 from information_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(*) from gtid_executed;
+----------+
| count(*) |
+----------+
| 2448 |
+----------+
1 row in set (0.00 sec) mysql>

关闭super_read_only

mysql> set global super_read_only=0;
Query OK, 0 rows affected (0.00 sec) mysql> select count(*) from gtid_executed;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.07 sec) mysql> select count(*) from gtid_executed;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec) mysql>

马上恢复正常了。

参考文章:

https://www.percona.com/blog/2017/02/08/mysql-super_read_only-bugs/
https://www.percona.com/blog/2017/01/27/wrong-seconds_behind_master-with-slave_parallel_workers-0/
http://keithlan.github.io/2017/02/15/gtid_practice/?utm_source=tuicool&utm_medium=referral

MySQL 5.7最新版本的2个bug的更多相关文章

  1. phpstudy2016最新版本mysql无法使用innodb的问题解决

    这里顺便记录一下今天遇见的神奇问题,在使用官方最新版本的phpstudy中,其它组件一切正常,但是奇怪的发现mysql是无法开启innodb的,以下为最新的下载地址: http://www.phpst ...

  2. 全新安装mysql最新版本

    写在前面: 下面写的东西只是最近安装的一个说明,是在系统中没存在mysql的情况下安装的,后期会根据官方文档写一个详细有价值的文档 安装原理:利用mysql官方的mysql_apt-repositor ...

  3. Windows7 64位安装最新版本MySQL服务器

    Windows7 64位安装最新版本MySQL服务器 近期,一直在研究MySQL数据库,经常修改配置文件,导致MySQL数据库无法使用,不得不反复重装MySQL数据库.以下是在Windows7 64位 ...

  4. 【添加最新版本的mysql的jdbc连接jar包】java.math.BigInteger cannot be cast to java.lang.Long异常

    [问题描述] 从我的电脑把项目拷贝到guo小中的win8电脑,but出现了那个错误,估计他的mysql是最新版本的. [如何下载连接jar包] 链接:https://pan.baidu.com/s/1 ...

  5. 安装Mysql最新版本mysql-5.7.10-winx64出现的几个问题解决

    电脑是64位的安装不了Windows (x86, 32-bit),Mysql installer MSI ,然后下载了Windows (x86, 32-bit), ZIP Archive 这种是免安装 ...

  6. 安装MYSQL详细教程 版本:mysql-installer-community-5.7.16.0 免安装版本和安装版本出现错误的解决

    一.版本的选择 之前安装的Mysql,现在才来总结,好像有点晚,后台换系统了,现在从新装上Mysql,感觉好多坑,我是来踩坑,大家看到坑就别跳了,这样可以省点安装时间,这个折腾了两天,安装了好多个版本 ...

  7. centos7 + php7 lamp全套最新版本配置,还有mongodb和redis

    我是个懒人,能yum就yum啦 所有软件的版本一直会升级,注意自己当时的版本是不是已经更新了. 首先装centos7 如果你忘了设置swap分区,下面的文章可以教你怎么补一个上去: http://ww ...

  8. 在Windows下安装64位压缩包版mysql 5.7.11版本的方法

    为了学习数据库,自己去网上下载了最新版本的Windows64位的mysql 5.7.11,但是花了很长的时间在安装的问题上,同时也借鉴了几位前辈的博文来帮助自己解决在安装过程中遇到的问题,安装成功之后 ...

  9. 【转】Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)

    http://blog.csdn.net/ccf19881030/article/details/9204801 很久以前使用博客园博主子龙山人的一篇博文<Cocos2d-x win7+vs20 ...

随机推荐

  1. input 随笔

    1,input 点击出现蓝色外边框 解决:outline:none

  2. java基础面试(上)

    面向对象的特征 答:抽象.继承.封装.多态 short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 答:对于short s1 = 1; s1 ...

  3. 选择困难症的福音——团队Scrum冲刺阶段-Day 1领航

    选择困难症的福音--团队Scrum冲刺阶段-Day 1领航 各个成员在 Alpha 阶段认领的任务 小组成员 分工 任务量 严域俊 完成小游戏接口部分.小游戏编写部分 21 吴恒佚 决策判断部分.小游 ...

  4. [翻译]高并发框架 LMAX Disruptor 介绍

    原文地址:Concurrency with LMAX Disruptor – An Introduction 译者序 前些天在并发编程网,看到了关于 Disruptor 的介绍.感觉此框架惊为天人,值 ...

  5. SVN忘记登陆用户

    C:\Users\Yaolz\AppData\Roaming\Subversion\auth 删除里面所有文件

  6. linux rescue 修复引导 与linux下修复windows引导

    在windows有引导的情况下修复linux引导 插入U盘启动 进入rescue模式 fdisk -l 查看分区情况 chroot /mnt/sysimage/ 进入系统 grub-install / ...

  7. 使用RabbitMq

    1.配置环境 http://www.cnblogs.com/longlongogo/p/6479424.html 2.安装RabbitMQ https://www.cnblogs.com/longlo ...

  8. jquery 判断 元素是否具有某个class

    两种方法如下: 1.hasClass(‘classname’) 2.is(‘.classname’) 例子: 1.使用is(‘.classname’)的方法 $('div').is('.redColo ...

  9. hadoop启动

    安装完hadoop集群之后,第一次启动之前必须初始化,之后就可以不用再初始化(注意:初始化操作只可以一次) hdfs namenode -format (hadoop namenode -format ...

  10. (钉钉)第三方WEB网站扫码登录

    年底在做钉钉和公司的知识库产品的对接,怎么使用钉钉api的如下: 第一步: 登录:https://oa.dingtalk.com/#/welcome 这点可以自己建立一个企业账号进行测试 点击工作台建 ...