设为首页 收藏本站
查看: 2250|回复: 0

[经验分享] MySQL 5.7最新版本的2个bug

[复制链接]

尚未签到

发表于 2017-12-12 18:22:26 | 显示全部楼层 |阅读模式
  好久没写博客了,都长草了。新业务上了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.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 {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>  

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

[iyunv@dbserver-yayun-04 ~]# sh a.sh  
mysql: [Warning] Using a password on the command line interface can be insecure.
  
slave_1_not
-multi-threaded-repl: 103  
mysql: [Warning] Using a password on the command line interface can be insecure.
  
slave_2_multi
-threaded-repl: 0  
mysql: [Warning] Using a password on the command line interface can be insecure.
  
slave_1_not
-multi-threaded-repl: 104  
mysql: [Warning] Using a password on the command line interface can be insecure.
  
slave_2_multi
-threaded-repl: 0  
mysql: [Warning] Using a password on the command line interface can be insecure.
  
slave_1_not
-multi-threaded-repl: 105  
mysql: [Warning] Using a password on the command line interface can be insecure.
  
slave_2_multi
-threaded-repl: 0  
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: 106  
slave_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.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=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(*) 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>
  
MySQL thread>  

  查看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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-423427-1-1.html 上篇帖子: .NET Core1.1+VS2017RC+MySQL+EF搭建多层Web应用程序 下篇帖子: MySQL中字符串与数字比较的坑
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表