- 文档首页
云数据库 MySQL 版
内核功能
功能
非阻塞 DDL
非阻塞 DDL
本文介绍云数据库 MySQL 版提供的非阻塞 DDL 功能的相关信息。
MySQL 8.0 版本,且内核小版本为 MySQL 8.0.43_20260815 及以上。
在 MySQL 中,DDL 操作需要获取到目标表的 MDL 锁,才能提交元数据变更,从而保证元数据的一致性。MDL 锁与其他任意类型的锁均不兼容,如果 DDL 线程因为无法立即获取锁而进入等待状态(pending),会导致目标表后续的所有访问被阻塞,进而导致业务系统故障不可用。
开启非阻塞 DDL 后,对于需要升级为 MDL 锁的 DDL 线程,系统在等待 MDL 锁期间会以间歇重试的方式获取锁,不会持续阻塞。在两次重试获取锁期间,业务的 DDL 仍可继续执行。
- 开启非阻塞 DDL 功能会降低 DDL 的优先级,因此无法获取 MDL 锁导致 DDL 失败的概率会增大。
- 当前仅支持 ALTER TABLE、CREATE INDEX 和 DROP INDEX 操作。
您可以通过 loose_rds_nonblock_ddl_retry_interval 和 loose_rds_nonblock_ddl_lock_wait_timeout 参数来开启和调整非阻塞 DDL 功能。
- 实例规格:云数据库 MySQL 版 4 核 8 GiB。
- 启动会话 session 1,在待执行的目标表上开启长事务,用于阻塞后续该表的 DDL 操作。
- 启动另一个会话 session 2,在非阻塞 DDL 功能关闭的情况下执行 DDL 操作。
- 开启非阻塞 DDL 功能,并设置 loose_rds_nonblock_ddl_retry_interval 参数值为 6,loose_rds_nonblock_ddl_lock_wait_timeout 参数值为 1。执行与上一步操作相同的 DDL 。
由下面的对比图可得出以下结论:
- 非阻塞 DDL 功能关闭时,DDL 线程无法获取 MDL 锁,会话被完全阻塞。
- 非阻塞 DDL 功能开启后,DDL 线程可以间歇性地获取 MDL 锁,会话不会被完全阻塞。
最近更新时间:2026.10.16 16:50:06