PolarDB MySQL版新增Online Copy DDL功能,有效缓解传统Copy DDL(如MODIFY COLUMN、普通表与分区表互转等)在执行过程中因全程持有MDL锁而导致的业务阻塞问题。
背景信息
在标准Copy DDL执行期间,MySQL会持有MDL-SNW(Shared No Write)锁,导致表上的所有写操作(INSERT/UPDATE/DELETE)被持续阻塞。这可能引发业务连接堆积,严重时甚至造成系统雪崩。Online Copy DDL通过优化数据拷贝阶段的锁机制,在保证数据一致性的前提下,允许并发读写操作,显著提升DDL执行期间的业务可用性。
适用范围
PolarDB MySQL版8.0.2版本且修订版本为8.0.2.2.33.1及以上,可通过查询版本号确认集群版本。
Online Copy DDL功能目前处于灰度发布阶段。如需使用,请前往配额中心,根据配额ID polarm_82_online_copy_ddl找到配额名称,在对应的操作列单击申请来开通该功能。申请时请提供需要开通的集群ID(形如pc-xxx)。
使用限制
支持的操作:
普通表与分区表互相转换。
MODIFY COLUMN语句(不支持同时修改列位置)。
不支持的操作或对象:
含有JSON类型列的表。
含有空间索引(SPATIAL INDEX)的表。
含有全局二级索引(GSI)的表。
混合分区(Hybrid Partitioning)表。
表上已执行过
LOCK TABLES的会话。显式指定
ALGORITHM=COPY且LOCK=SHARED或LOCK=EXCLUSIVE的DDL。
您可以在执行DDL操作前使用EXPLAIN DDL功能,直观地判断当前DDL操作是否支持Online Copy DDL。
使用方法
您可以先通过loose_polar_support_online_copy_ddl_algorithm参数开启Online Copy DDL功能。针对MODIFY COLUMN语句,需要额外开启loose_polar_support_online_copy_ddl_algorithm_for_modify参数。具体操作请参见设置集群参数和节点参数。参数说明如下:
参数 | 级别 | 说明 |
| Global | Online Copy DDL主开关。取值范围如下:
|
| Global | 专用于
|
方式一:显式指定算法(推荐)
通过ALGORITHM=COPY, LOCK=NONE强制使用Online Copy DDL:
CREATE TABLE t(a int);
ALTER TABLE t MODIFY COLUMN a BIGINT DEFAULT NULL, ALGORITHM=COPY, LOCK=NONE;使用上述语句时,若返回ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.的错误,表示当前修改字段类型操作无法使用Online Copy DDL算法执行。建议您查看loose_polar_support_online_copy_ddl_algorithm参数是否已开启,并仔细核对使用限制。
方式二:自动选择最优算法(默认行为)
不指定算法或使用DEFAULT,系统将自动选择最合适的执行方式:
-- 方法1:显式DEFAULT
ALTER TABLE t MODIFY COLUMN a BIGINT DEFAULT NULL, ALGORITHM=DEFAULT, LOCK=DEFAULT;
-- 方法2:完全省略(等效)
ALTER TABLE t MODIFY COLUMN a BIGINT DEFAULT NULL;系统优先尝试Online Copy DDL。若不满足条件,则自动回退到传统Copy DDL(会锁表),确保DDL最终能完成。