You need to enable JavaScript to run this app.
文档中心
云数据库 MySQL 版

云数据库 MySQL 版

复制全文
下载 pdf
功能
非阻塞 DDL
复制全文
下载 pdf
非阻塞 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 操作。​
  • 不支持直接执行 RENAME TABLE。​
  • slave_thread 场景下不生效。​
使用说明 ​
您可以通过 loose_rds_nonblock_ddl_retry_interval 和 loose_rds_nonblock_ddl_lock_wait_timeout 参数来开启和调整非阻塞 DDL 功能。​
​
参数名称​
默认值​
是否需要重启实例生效​
取值范围​
级别​
参数描述​
loose_rds_nonblock_ddl_retry_interval​
0​
否​
0~31536000​
GLOBAL / SESSION​
DDL 线程获取 MDL 锁超时重试的时间间隔。默认值为 0,表示非阻塞 DDL 功能不生效。单位为秒。​
loose_rds_nonblock_ddl_lock_wait_timeout​
1​
否​
1~31536000​
GLOBAL / SESSION​
DDL 线程间歇性获取 MDL 锁的超时时间。默认值为 1,单位为秒。​
​
性能测试​
测试环境​
  • 实例规格:云数据库 MySQL 版 4 核 8 GiB。​
  • 实例版本:MySQL 8.0。​
测试步骤​
  1. 通过 sysbench 构建表并插入数据。​
​
sysbench oltp_read_write \​
--db-ps-mode=auto \​
--percentile=95 \​
--mysql-socket=/var/run/mysqld/mysqld.sock \​
--mysql-user=user \​
--mysql-password=password \​
--mysql-db=test_demo \​
--tables=1 \​
--table-size=10000 \​
--threads=4 \​
prepare​
​
  1. 启动 sysbench 压力测试模拟在线业务。​
​
sysbench oltp_read_write \​
--db-ps-mode=auto \​
--percentile=95 \​
--mysql-socket=/var/run/mysqld/mysqld.sock \​
--mysql-user=user \​
--mysql-password=password \​
--mysql-db=test_demo \​
--tables=1 \​
--table-size=10000 \​
--threads=4 \​
--report-interval=1 \​
--time=100 \​
run​
​
  1. 启动会话 session 1,在待执行的目标表上开启长事务,用于阻塞后续该表的 DDL 操作。​
​
SELECT SLEEP(60) FROM test_demo LIMIT 1; ​
​
  1. 启动另一个会话 session 2,在非阻塞 DDL 功能关闭的情况下执行 DDL 操作。​
​
ALTER TABLE test_demo ENGINE = InnoDB;​
​
  1. 开启非阻塞 DDL 功能,并设置 loose_rds_nonblock_ddl_retry_interval 参数值为 6,loose_rds_nonblock_ddl_lock_wait_timeout 参数值为 1。执行与上一步操作相同的 DDL 。​
​
ALTER TABLE test_demo ENGINE = InnoDB;​
​
测试结果​
由下面的对比图可得出以下结论:​
  • 非阻塞 DDL 功能关闭时,DDL 线程无法获取 MDL 锁,会话被完全阻塞。​
  • 非阻塞 DDL 功能开启后,DDL 线程可以间歇性地获取 MDL 锁,会话不会被完全阻塞。​
​​​
​​​
​
最近更新时间:2026.10.16 16:50:06
这个页面对您有帮助吗?
有用
有用
无用
无用