专栏首页MySQL故障优化案例MySQL Cases-何时flush table with read lock会释放?
原创

MySQL Cases-何时flush table with read lock会释放?

今天我又带来一个案例与大家见面了,那么正是flush table with read lock导致的主从切换hang住问题

背景

自动运维平台,在进行主从切换时,偶尔会出现执行hang住的问题,现象如下:

并且执行stop slave的时候甚至也会hang住,从processlist信息可以得知,这分明是加了flush table with read lock全局读锁。

那么为什么会有这个锁呢?如何才能正确释放flush table with read lock?

排查

show processlist显示

mysql> show processlist;
+-----+-----------------+-----------------------+------+------------------+-------+---------------------------------------------------------------+--------------------------+
| Id  | User            | Host                  | db   | Command          | Time  | State                                                         | Info                     |
+-----+-----------------+-----------------------+------+------------------+-------+---------------------------------------------------------------+--------------------------+
|   7 | event_scheduler | localhost             | NULL | Daemon           | 56970 | Waiting on empty queue                                        | NULL                     |
|  27 | drcc            | 192.168.236.151:37716 | NULL | Binlog Dump GTID | 56355 | Master has sent all binlog to slave; waiting for more updates | NULL                     |
| 501 | drcc            | 192.168.51.233:33450  | NULL | Sleep            |   347 |                                                               | NULL                     |
| 629 | root            | localhost             | t    | Query            |  2362 | Waiting for global read lock                                  | insert into t1 values(2) |
| 667 | drcc            | 192.168.242.200:44292 | NULL | Sleep            |   768 |                                                               | NULL                     |
| 668 | drcc            | 192.168.51.233:40572  | NULL | Sleep            |   762 |                                                               | NULL                     |
| 674 | drcc            | 192.168.242.200:48000 | NULL | Sleep            |   130 |                                                               | NULL                     |
| 675 | drcc            | 192.168.242.200:51202 | NULL | Sleep            |   166 |                                                               | NULL                     |
| 685 | root            | localhost             | NULL | Query            |     0 | init                                                          | show processlist         |
| 686 | drcc            | 192.168.51.233:47638  | NULL | Sleep            |    43 |                                                               | NULL                     |
+-----+-----------------+-----------------------+------+------------------+-------+---------------------------------------------------------------+--------------------------+
10 rows in set (0.00 sec)

Waiting for global read lock很明显当前数据库被加载flush table with read lock 全局读锁,那么是怎么加上去的呢?我们的流程有没有什么问题呢?

查看general log日志和切换流程图,加锁会话是501,执行unlock tables的会话是627,这样是不起作用的。

2021-09-23T10:24:08.606341+08:00          501 Query     flush table with read lock
2021-09-23T10:24:09.632922+08:00          626 Connect   drcc@192.168.51.233 on  using TCP/IP
2021-09-23T10:24:09.633557+08:00          626 Query     SET AUTOCOMMIT = 0
2021-09-23T10:24:09.634547+08:00          626 Query     SET AUTOCOMMIT = 1
2021-09-23T10:24:09.635227+08:00          626 Query     set global read_only=ON
2021-09-23T10:24:10.663607+08:00          501 Query     set global super_read_only=ON
2021-09-23T10:24:11.692273+08:00          627 Connect   drcc@192.168.51.233 on  using TCP/IP
2021-09-23T10:24:11.693072+08:00          627 Query     SET AUTOCOMMIT = 0
2021-09-23T10:24:11.693807+08:00          627 Query     SET AUTOCOMMIT = 1
2021-09-23T10:24:11.694578+08:00          627 Query     unlock tables
2021-09-23T10:24:12.710150+08:00          501 Query     show master status
2021-09-23T10:24:23.741698+08:00          626 Query     show master status

从上面的信息可以知道,执行加锁的会话和释放锁unlock tables的会话是不同的,并且加锁会话一直存在,导致数据库一直没有释放。

何时flush table with read lock会释放

  • 同一个会话执行unlock tables;
  • 执行flush table with read lock的会话中断,这种情况下也会自动释放全局读锁,反之,如果这个会话一直存在那么这个锁也就一直存在。

更多文章欢迎关注本人公众号,搜dbachongzi或扫二维码

作者:姚崇 Oracle OCM、MySQL OCP、Oceanbase OBCA、PingCAP PCTA认证,擅长基于Oracle、MySQL Performance Turning及多种关系型 NoSQL数据库

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用mysqldump导出数据库

        mysqldump是mysql用于转存储数据库的客户端程序。它主要产生一系列的SQL语句,可以封装到文件,该文件包含有所有重建您的数据库所需要的SQL命...

    Leshami
  • 记一次生产环境MySQL数据库的备份与还原

    版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

    耕耘实录
  • pt-heartbeat 监测RDS延迟

    官方手册:https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html

    二狗不要跑
  • MySQL SHOW PROCESSLIST 状态详解

    官方手册:https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html

    二狗不要跑
  • MySQL Cases-MySQL找出谁持有全局读锁

    全局读锁通常是由flush table with read lock;这类语句添加的。在各种备份工具为了得到一致性备份,已经在具备主从复制架构的环境中做主备切换...

    姚崇
  • MetaData Lock 之三

    一 简介 通过前面两篇文章的介绍,相信读到这里的各位对MDL 锁已经有了比较深入的了解了,本文将结合理论知识介绍几组MDL 锁的案例。 二 常见MDL 锁的...

    用户1278550
  • MetaData Lock 之二

    一 简介 上一篇文章 《MetaData Lock 之一》 简单的介绍了MySQL 引入MDL 的前因后果,本文深入了解MDL的实现原理和运行机制。

    用户1278550
  • SHOW PROCESSLIST的各个状态说明

    如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程)。

    二狗不要跑
  • MySQLdump里的秘密,终于被我发现了

    1 Part1 引言 在日常数据库运维中,经常要对数据库进行热备。热备的一个关键点是保证数据的一致性,即在备份进行时发生的数据更改,不会在备份结果中出现。my...

    腾讯云数据库 TencentDB
  • 浅谈MySQL中的锁

    全局锁是对整个数据库进行加锁的,执行Flush table with read lock对整个数据库加锁,执行之后会使得整个库处于只读状态,数据更新语句,数据定...

    你的益达
  • MySQL 8.0新特性 — 备份锁

    在MySQL 8.0中,引入了一个轻量级的备份锁,这个锁可以保证备份一致性,而且阻塞的操作相对比较少,是一个非常重要的新特性,接下来我们就来了解一下。

    brightdeng@DBA
  • 加速MySQL的alter table操作(书摘备查)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148526
  • 为什么只查一条记录也那么慢?

    在MySQL中,有些情况下仅仅查询一条语句,查询的过程也会非常慢,有时候还会出现不返回的情况,今天我们来分析可能造成这个现象的场景。

    AsiaYe
  • MySQL 案例:analyze,慢查询,与查询无响应

    有时候,遇到同样的 SQL 语句在正式环境的主库和只读实例的执行时间相距甚远时,第一时间就会想到是不是采样信息不一致,导致执行计划不准,从一个高效的查询变成了慢...

    王文安@DBA
  • mysqldump与innobackupex备份过程你知多少(一)

    导语 1、先看mysqldump 1.1. mysqldump备份过程解读 1.2. mysqldump备份过程中的关键步骤 1.2.1. FLUS...

    沃趣科技
  • mysqldump与innobackupex备份过程你知多少(完结篇)

    相关阅读: mysqldump与innobackupex备份过程你知多少(三) mysqldump与innobackupex备份过程你知多少(二) mysqld...

    沃趣科技
  • Mysql备份工具mysqldump--参数

    陈不成i
  • mysqldump备份时的数据一致性问题

    在日常运维当中,经常会用到mysqldump。使用mysqldump导出数据的时候,我们最关心的问题之一就是表的一致性。简单的说就是所有表是不是同一时间的数据和...

    田帅萌
  • 数据库诊断不了的,腾讯大神来“诊断”

    | 作者 王文安,腾讯CSIG数据库专项的数据库工程师,主要负责腾讯云数据库 MySQL 的相关的工作,热爱技术,欢迎留言进行交流。 ---- 有时候,遇到同...

    腾讯云数据库 TencentDB

扫码关注云+社区

领取腾讯云代金券