如何处理MySQL主从复制元数据锁等待

大晨酱_3816

大晨酱_3816

2026-08-11

1067人浏览

原创

确认主从复制卡在waiting for table metadata lock,需查show processlist中system user线程状态、performance_schema.metadata_locks中lock_status='pending'记录及gtid差值;阻塞源是持有mdl的其他会话(如mysqldump、flush tables或长事务),应kill connection而非sql线程;预防须用pt-online-schema-change、禁用手动读锁、设lock_wait_timeout并优先采用algorithm=instant。

如何处理mysql主从复制元数据锁等待

主从复制卡在 Waiting for table metadata lock,基本就是从库 SQL 线程被 MDL 阻塞了,不是慢,是堵——DDL 拿着写锁不放,后续所有 DML 回放全得排队。

怎么确认是元数据锁卡住的?

别只看 Seconds_Behind_Master,它可能为 0 或虚高。必须查两个地方:

  • 从库执行 SHOW PROCESSLIST,找 system user 身份的线程,State 是 Waiting for table metadata lock
  • 查锁详情:SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS = 'PENDING',重点看 OWNER_THREAD_ID 是否指向那个 system user 线程
  • 再比对 GTID:SELECT @@global.gtid_executed; 在主库查,然后在从库 SHOW SLAVE STATUS\G 中看 Retrieved_Gtid_Set 和 Executed_Gtid_Set 差的那一个 GTID,如果对应的是 ALTER TABLE,就坐实了

为什么 kill 掉 SQL 线程没用?

因为阻塞源从来不是 SQL 线程自己,而是别的连接占着 MDL 不放。常见肇事者:

  • 未结束的 mysqldump --single-transaction(忘了加 --skip-lock-tables)
  • DBA 手动执行了 FLUSH TABLES WITH READ LOCK 后没释放
  • 某个长事务还在跑 SELECT ... FOR UPDATE 或普通 SELECT(MDL 在事务提交前不释放)
  • 监控脚本或定时任务连上来做了 LOCK TABLES

所以该 KILL CONNECTION {id} 的,是这些持有锁的会话,不是 SQL 线程本身。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

如何快速定位并清理阻塞源?

先快速筛出可疑连接:

  • 查长事务:SELECT * FROM information_schema.INNODB_TRX WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60
  • 查正在等 MDL 的线程:SELECT t.ID, t.USER, t.HOST, t.COMMAND, t.TIME, t.STATE, t.INFO FROM performance_schema.threads t JOIN performance_schema.metadata_locks ml ON t.THREAD_ID = ml.OWNER_THREAD_ID WHERE ml.LOCK_STATUS = 'PENDING' AND t.PROCESSLIST_COMMAND != 'Sleep'
  • 查活跃连接里带锁关键词的:SELECT * FROM information_schema.PROCESSLIST WHERE INFO LIKE '%ALTER%' OR INFO LIKE '%LOCK%'

拿到 ID 后直接 KILL CONNECTION {id}。注意:MySQL 5.7+ 必须用 KILL CONNECTION,KILL 默认只杀查询,不杀连接。

怎么避免下次再卡?

预防比抢救重要,尤其线上不能靠每次 KILL 救火:

  • 主库执行 DDL 前,必须用 pt-online-schema-change 或 gh-ost,它们不走原生 DDL,不长期持 MDL
  • 从库禁止任何手动 FLUSH TABLES WITH READ LOCK;备份必须加 --single-transaction --skip-lock-tables
  • 调低 lock_wait_timeout(建议 30–60 秒),让 DDL 失败得快,而不是挂一年
  • MySQL 8.0.12+ 的小变更(如加虚拟列、改注释)优先用 ALGORITHM=INSTANT,完全不触发 MDL

真正难处理的不是锁本身,而是那些没人认领的长连接——它们可能来自某个凌晨跑完就断开的脚本,也可能来自某次忘记关掉的客户端。这类连接不会报错,但会静默锁死整个复制链路。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2253

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1379

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

815

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3132

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5288

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1179

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5551

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4862

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6454

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习