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

云数据库 veDB MySQL 版

复制全文
下载 pdf
内核功能
非阻塞 DDL
复制全文
下载 pdf
非阻塞 DDL
云数据库 veDB MySQL 版支持非阻塞 DDL 功能,该功能能够有效解决 DDL 操作导致的锁表问题,减少对业务的影响,提高数据库性能。​
背景介绍​
在 MySQL 中,执行 DDL 操作时,若目标表上有未提交的长事务或正在进行的大查询,DDL 会持续等待获取 MDL-X 锁。由于 MDL-X 锁具有最高优先级,DDL 在等待 MDL-X 锁的过程中,将阻塞目标表上所有的新事务,会导致业务连接堆积,甚至可能造成整个业务系统崩溃。为了解决这个问题,veDB MySQL 提供非阻塞 DDL 功能,通过设置 MDL-X 锁的超时时间、重试时间间隔和重试次数,保证在无法获取 MDL-X 锁的情况下,允许新事务进入目标表,避免因 DDL 操作阻塞业务系统,从而保证业务系统的可用性和稳定性。​
注意事项​
开启非阻塞 DDL 功能会对数据库的性能和操作产生一定影响。非阻塞 DDL 功能会导致 DDL 操作的优先级降低,同时,MDL 锁的获取可能会失败,从而导致执行 DDL 操作的失败概率也会相应增大。因此,启用非阻塞 DDL 功能前,建议评估数据库的并发操作情况和性能需求,确保其对数据库的影响是可以接受的。​
使用限制​
支持非阻塞的 DDL 类型如下表所示。​
注意​
不支持非阻塞功能的 DDL 会退化为普通的 DDL,阻塞其他并发的 DML。​
​
DDL 类型​
操作​
SQL 语句​
是否支持​
Instant DDL​
​
列操作​
ADD COLUMN​
支持​
​
列操作​
RENAME COLUMN​
支持​
​
表操作​
RENAME TABLE​
不支持​
​
表操作​
TRUNCATE TABLE​
不支持​
​
库操作​
ALTER DATABASE CHARACTER/COLLATE/ENCRYPTION/READ ONLY​
不支持​
Online DDL​
索引操作​
ADD INDEX​
支持​
​
列操作​
DROP COLUMN​
支持​
​
表操作​
ALTER TABLE ENGINE​
支持​
​
表操作​
OPTIMIZE TABLE​
不支持​
Copy DDL​
列操作​
MODIFY COLUMN TYPE​
不支持​
​
使用方法​
veDB MySQL 通过以下参数,控制非阻塞 DDL 功能,各参数详情说明如下表所示。​
​
参数​
生效范围​
说明​
enable_nonblock_ddl​
​
Session​
​
非阻塞 DDL 功能的开关,取值:​
  • ON:开启非阻塞 DDL 功能。​
  • OFF(默认):关闭非阻塞 DDL 功能。​
nonblock_ddl_lock_wait_timeout​
​
Session​
设置获取 MDL-X 锁超时的时间,默认值为 1,取值范围:1~31536000 ,单位:秒。​
超过此值之后,DDL 会暂时放锁,并结合重试间隔和次数来等待下次持锁。​
nonblock_ddl_retry_interval​
Session​
设置获取 MDL-X 锁超时重试的时间间隔,默认值为 3,取值范围:1~31536000 ,单位:秒。​
nonblock_ddl_retry_times​
​
Session​
​
设置获取 MDL-X 锁超时重试的次数,默认值为 0, 取值范围:0~31536000 。​
在非阻塞 DDL 模式下,尝试等锁一段时间后会释放。​
​
性能对比​
使用 SysBench 工具测试开启或关闭非阻塞 DDL 功能对业务的影响。​
  1. 使用 SysBench 启动并注入读写事务。​
  • ​
    ./oltp_point_select.lua --mysql-storage-engine=innodb --tables=5 --mysql-db=sbtest --table-size=10000 --mysql-user=root --mysql-password=TAK**** --mysql-port=4200 --mysql-host=127.0.0.1 --rand-type=special --threads=128 --events=0 --range_selects=0 --rand-seed=42 --time=40 --report-interval=1 --percentile=99 --forced-shutdown=3 prepare​
    ​
    ./oltp_read_write.lua --mysql-storage-engine=innodb --tables=1 --mysql-db=sbtest --table-size=10000 --mysql-user=root --mysql-password=TAK**** --mysql-port=4200 --mysql-host=127.0.0.1 --rand-type=special --threads=128 --events=0 --range_selects=0 --rand-seed=42 --time=600 --report-interval=1 --percentile=99 --forced-shutdown=3 run​
    ​
  1. 设置非阻塞 DDL 参数。​
  • ​
    set session enable_nonblock_ddl = 0 ;​
    set session nonblock_ddl_lock_wait_timeout = 1;​
    set session nonblock_ddl_retry_interval = 1;​
    set session nonblock_ddl_retry_times = 3;​
    ​
  1. 在有阻塞的状态下测试 DDL,观察 TPS 的变化情况。​
  • ​
    -- 在 session 1 中开启一个长事务,不提交​
    begin;​
    select * from sbtest1;​
    ​
    -- 在 session 2 中执行 DDL 操作​
    alter table sbtest1 add index idx_k_4(k);​
    ​
  • 未开启非阻塞 DDL 功能,可以观察到 TPS 持续跌 0。​
  • ​
    [ 317s ] thds: 128 tps: 90.00 qps: 1412.03 (r/w/o: 877.02/349.01/186.00) lat (ms,99%): 3208.88 err/s: 6.00 reconn/s: 0.00​
    [ 318s ] thds: 128 tps: 73.00 qps: 1360.07 (r/w/o: 885.05/323.02/152.01) lat (ms,99%): 3208.88 err/s: 6.00 reconn/s: 0.00​
    [ 319s ] thds: 128 tps: 132.00 qps: 1804.01 (r/w/o: 1017.01/505.00/282.00) lat (ms,99%): 3773.42 err/s: 18.00 reconn/s: 0.00​
    [ 320s ] thds: 128 tps: 78.00 qps: 400.00 (r/w/o: 0.00/243.00/157.00) lat (ms,99%): 3448.53 err/s: 1.00 reconn/s: 0.00​
    [ 321s ] thds: 128 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,99%): 0.00 err/s: 0.00 reconn/s: 0.00​
    [ 322s ] thds: 128 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,99%): 0.00 err/s: 0.00 reconn/s: 0.00​
    [ 323s ] thds: 128 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,99%): 0.00 err/s: 0.00 reconn/s: 0.00​
    [ 324s ] thds: 128 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,99%): 0.00 err/s: 0.00 reconn/s: 0.00​
    [ 325s ] thds: 128 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,99%): 0.00 err/s: 0.00 reconn/s: 0.00​
    [ 326s ] thds: 128 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,99%): 0.00 err/s: 0.00 reconn/s: 0.00​
    [ 327s ] thds: 128 tps: 0.00 qps: 0.00 (r/w/o: 0.00/0.00/0.00) lat (ms,99%): 0.00 err/s: 0.00 reconn/s: 0.00​
    ​
  • 开启非阻塞 DDL 功能,可以观察到 TPS 有所下降,但未跌 0。​
  • ​
    -- 开启非阻塞 DDL​
    set session enable_nonblock_ddl =1;​
    alter table sbtest1 add index idx_k_4(k);​
    ​
    [ 28s ] thds: 128 tps: 31.00 qps: 818.96 (r/w/o: 529.97/225.99/63.00) lat (ms,99%): 2159.29 err/s: 1.00 reconn/s: 0.00​
    [ 29s ] thds: 128 tps: 24.00 qps: 410.99 (r/w/o: 263.99/95.00/52.00) lat (ms,99%): 7346.49 err/s: 4.00 reconn/s: 0.00​
    [ 30s ] thds: 128 tps: 45.00 qps: 717.03 (r/w/o: 449.02/176.01/92.00) lat (ms,99%): 6026.41 err/s: 2.00 reconn/s: 0.00​
    [ 31s ] thds: 128 tps: 65.00 qps: 1103.99 (r/w/o: 703.00/267.00/134.00) lat (ms,99%): 5033.35 err/s: 4.00 reconn/s: 0.00​
    [ 32s ] thds: 128 tps: 47.00 qps: 844.00 (r/w/o: 540.00/203.00/101.00) lat (ms,99%): 6026.41 err/s: 7.00 reconn/s: 0.00​
    [ 33s ] thds: 128 tps: 78.00 qps: 1245.97 (r/w/o: 783.98/301.99/160.00) lat (ms,99%): 6713.97 err/s: 4.00 reconn/s: 0.00​
    [ 34s ] thds: 128 tps: 48.00 qps: 789.01 (r/w/o: 493.01/196.00/100.00) lat (ms,99%): 4683.57 err/s: 4.00 reconn/s: 0.00​
    [ 35s ] thds: 128 tps: 45.00 qps: 873.02 (r/w/o: 593.02/183.00/97.00) lat (ms,99%): 7346.49 err/s: 7.00 reconn/s: 0.00​
    [ 36s ] thds: 128 tps: 57.99 qps: 930.86 (r/w/o: 573.92/237.96/118.98) lat (ms,99%): 6476.48 err/s: 3.00 reconn/s: 0.00​
    [ 37s ] thds: 128 tps: 91.01 qps: 1467.16 (r/w/o: 909.10/374.04/184.02) lat (ms,99%): 6713.97 err/s: 2.00 reconn/s: 0.00​
    [ 38s ] thds: 128 tps: 69.00 qps: 1138.04 (r/w/o: 719.02/279.01/140.00) lat (ms,99%): 5409.26 err/s: 2.00 reconn/s: 0.00​
    [ 39s ] thds: 128 tps: 40.00 qps: 698.97 (r/w/o: 453.98/162.99/82.00) lat (ms,99%): 3841.98 err/s: 2.00 reconn/s: 0.00​
    [ 40s ] thds: 128 tps: 39.00 qps: 712.02 (r/w/o: 458.01/172.00/82.00) lat (ms,99%): 5312.73 err/s: 4.00 reconn/s: 0.00​
    [ 41s ] thds: 128 tps: 38.00 qps: 618.01 (r/w/o: 386.01/153.00/79.00) lat (ms,99%): 7086.63 err/s: 3.00 reconn/s: 0.00​
    [ 42s ] thds: 128 tps: 47.00 qps: 827.01 (r/w/o: 544.00/183.00/100.00) lat (ms,99%): 5607.61 err/s: 5.00 reconn/s: 0.00​
    [ 43s ] thds: 128 tps: 42.00 qps: 709.99 (r/w/o: 450.00/172.00/88.00) lat (ms,99%): 6135.91 err/s: 4.00 reconn/s: 0.00​
    [ 44s ] thds: 128 tps: 56.00 qps: 848.01 (r/w/o: 515.01/220.00/113.00) lat (ms,99%): 6247.39 err/s: 1.00 reconn/s: 0.00​
    [ 45s ] thds: 128 tps: 80.00 qps: 1252.98 (r/w/o: 781.99/309.00/162.00) lat (ms,99%): 7215.39 err/s: 2.00 reconn/s: 0.00​
    [ 46s ] thds: 128 tps: 49.00 qps: 918.02 (r/w/o: 615.01/201.00/102.00) lat (ms,99%): 8038.61 err/s: 4.00 reconn/s: 0.00​
    [ 47s ] thds: 128 tps: 34.00 qps: 601.00 (r/w/o: 378.00/152.00/71.00) lat (ms,99%): 7086.63 err/s: 2.00 reconn/s: 0.00​
    [ 48s ] thds: 128 tps: 52.00 qps: 855.00 (r/w/o: 525.00/221.00/109.00) lat (ms,99%): 5217.92 err/s: 5.00 reconn/s: 0.00​
    [ 49s ] thds: 128 tps: 79.00 qps: 1268.94 (r/w/o: 798.96/308.99/160.99) lat (ms,99%): 5217.92 err/s: 3.00 reconn/s: 0.00​
    [ 50s ] thds: 128 tps: 47.00 qps: 859.02 (r/w/o: 547.01/214.01/98.00) lat (ms,99%): 6835.96 err/s: 4.00 reconn/s: 0.00​
    [ 51s ] thds: 128 tps: 66.00 qps: 1067.02 (r/w/o: 670.01/261.00/136.00) lat (ms,99%): 5607.61 err/s: 4.00 reconn/s: 0.00​
    [ 52s ] thds: 128 tps: 44.00 qps: 815.01 (r/w/o: 539.00/184.00/92.00) lat (ms,99%): 7895.16 err/s: 4.00 reconn/s: 0.00​
    [ 53s ] thds: 128 tps: 20.00 qps: 348.99 (r/w/o: 227.99/78.00/43.00) lat (ms,99%): 4683.57 err/s: 4.00 reconn/s: 0.00​
    [ 54s ] thds: 128 tps: 53.00 qps: 878.00 (r/w/o: 552.00/218.00/108.00) lat (ms,99%): 9977.52 err/s: 1.00 reconn/s: 0.00​
    [ 55s ] thds: 128 tps: 32.00 qps: 539.00 (r/w/o: 346.00/126.00/67.00) lat (ms,99%): 6835.96 err/s: 3.00 reconn/s: 0.00​
    [ 56s ] thds: 128 tps: 35.00 qps: 593.01 (r/w/o: 374.01/147.00/72.00) lat (ms,99%): 6960.17 err/s: 2.00 reconn/s: 0.00​
    ​
​
最近更新时间:2025.11.24 14:46:13
这个页面对您有帮助吗?
有用
有用
无用
无用