-
FLUSH TABLES WITH READ LOCK
ps aux | grep mysqldump
show processlist;
show open tables where in_use > 0;
线上没有开启
performance_schema
的
instruments
和
consumers
(PS:这个对于锁监控很重要,一定记得打开)。如果开启了
performance_schema
,可以通过
metadata_locks
查到相关锁记录,这个我们在后面的复现中看一下。
select * from metadata_locks;
select * from threads order by processlist_time desc limit 10;
原因
mysql备份时使用
--master-data
参数在
SQL
文件的头部会写入
binlog
和
position
信 息,所以在执行备份前mysql需要执行
flush tables
。
flush tables with read lock
全局锁锁住整个数据库。如果数据库中有一个长查询在运行,那么FTWRL就不能获得,会被阻塞,进而阻塞所有的DML操作。
排查
开启慢日志:
SET GLOBAL log_slow_queries = ON;
SET GLOBAL long_query_time = 3;
set global slow_query_log_file='/opt/mysql/slow.log'
select * from metadata_locks;
select * from threads order by processlist_time desc limit 10;
SELECT THREAD_ID, SQL_TEXT AS '锁源当前执行的SQL语句' ,CURRENT_SCHEMA AS '数据库' FROM performance_schema.`events_statements_current`
WHERE thread_id IN (SELECT THREAD_ID FROM performance_schema.threads pt WHERE processlist_id IN (SELECT blocking_pid FROM sys.innodb_lock_waits));
show full processlist;
参考
- MySQL备份导致的waiting for global read lock
- 故障分析 | 全局读锁一直没有释放,发生了什么