mysql出现大量FLUSH TABLES WITH READ LOCK

解决办法

故障总结

系统中的global read lock被其它线程获取了(被加上了S锁),因此DML在grl上面加IX锁时会出现Waiting for global read lock,而set read_only在grl上加的是S锁,因此此时是可以grant的,而此时系统中存在大查询,set global read_only=1需要等待表被关闭,因此状态是:Waiting for table flush

因此原因可以确定了:系统中存在flush tables with read lock但是没有unlock tables

小技巧

在手动做FLUSH TABLES WITH READ LOCK/set global read_only=1之前,先执行一下FLUSH TABLES,能够很大概率地减小系统变成只读的时间

参考

http://www.gpfeng.com/?p=222

时间: 2024-10-10 18:03:15

mysql出现大量FLUSH TABLES WITH READ LOCK的相关文章

FLUSH TABLES WITH READ LOCK

会话1: mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.18 sec) mysql> show processlist; +----+------+-----------------+------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-

FLUSH TABLES WITH READ LOCK 和 LOCK TABLES 之种种

1.FLUSH TABLES WITH READ LOCK 这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读.一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行. 解锁的语句也是unlock tables. 2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} 这个命令是表级别的锁定,可以定制锁定某一个表.例如: lock  tables test read; 不影响其他

FLUSH TABLE WITH READ LOCK详解

FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与binlog位点匹配).由于FTWRL总共需要持有两把全局的MDL锁,并且还需要关闭所有表对象,因此这个命令的杀伤性很大,执行命令时容易导致库hang住.如果是主库,则业务无法正常访问:如果是备库,则会导致SQL线程卡住,主备延迟.本文将详细介绍FTWRL到底做了什么操作,每个操作的对库的影响,以及操作背后的原因. FTWRL做了什么操作? FTWRL主要包括3个步骤: 1.上全

flush table with read lock的轻量级解决方案[原创]

为什么要使用FTWRL ? MySQL dba在日常工作中,数据备份绝对是工作频度最高的工作内容之一.当你使用逻辑方式进行备份(mydumper,mysqldump)或物理方式进行备份(percona-xtrabackup),为了保证数据的一致性,这两种备份方式都会在备份过程中执行 flush table with read lock 这个命令(**以下简称为FTWRL**),通过执行FTWRL,来对事务和非事务表来加table level级别的共享锁,取得此时的gtid或者binlog偏移量,

mysql清空缓存flush

清空缓存主要执行flush命令,必须有reload权限 flush hosts    清空主机缓存表.如果主机改变ip,或者收到报错host...is blocked,清空主机表.当连接mysql服务器时,一台指定主机连接数据库次数大于max_connect_errors时,mysql为了安全,会阻止该主机对应的ip的连接请求.此时需要清空主机缓存再尝试连接. flush privileges    从数据库授权表中重新装载权限到缓存中.当有新用户赋权后,执行该命令,立即生效. flush ta

Innodb加载数据字典 && flush tables

测试了两个case,属于之前blog的遗留问题: innodb如何加载数据字典 flush tables都做了什么操作 先来看下innodb加载数据字典: 首次使用:select * from tt; 1. 创建handler对象 函数调用栈: open_binary_frm get_new_handler innobase_create_handler ha_innobase::ha_innobase 根据单实例 handlerton + table_share两个参数,创建了handler对

mysqldump: Got error: 1556: You can't use locks with log tables. when using LOCK TABLES

mysqldump: Got error: 1556: You can't use locks with log tables. when using LOCK TABLES 我是把一些mysqldump语句放在一个批量命令文件(传说中的.sh文件)中执行的,而当我把这些mysqldump语句分离开来一个一个执行的时候,我发现是没有任何错误的,于是在网络上找了一些资料:发现是mysql默认数据库里的logs表,不能被加锁(lock tables)引起的.于是我测试了一下,把关于mysql这个默认

[mysql] Some non-transactional changed tables couldn't be rolled back

使用peewee的事务时,碰到一个郁闷的问题,事务似乎无效! 于是简化了下模型,写了简单的测试代码,发现问题,如题所示. 找到解答: https://github.com/etianen/django-reversion/issues/362 https://dev.mysql.com/doc/refman/5.0/en/nontransactional-tables.html 原因就是数据库表的引擎需要设置为InnoDB才能支持事物,解决方法如下: http://dev.mysql.com/d

flush tables 好危险啊

请看图 +----+------+-----------+------+------------+------+-------------------------+----------------------------------------+| Id | User | Host | db | Command | Time | State | Info |+----+------+-----------+------+------------+------+------------------