在线DDL
可获得性
本特性自V500R002C00版本开始引入。
特性简介
部分在线DDL只需要修改元数据,不涉及重建数据,操作时长较快,对业务影响较小。传统DDL操作若涉及重建数据,例如修改列类型、移动表空间、VACUUM FULL等操作,会对操作的表加长时间的排他锁,阻塞对该表的并发读写操作,影响用户业务运行。阻塞时长与数据量成正比,当数据量较大时,阻塞时长可达数小时、甚至数天。相比之下,在线DDL不会长时间加排他锁,执行中允许对该表的并发读写操作,减少对用户业务运行影响。
客户价值
相比于传统DDL,在线DDL支持对正常业务影响较小的情况下进行在线DDL操作,减少对业务的影响,提高业务运行的连续性和数据库的可用性。
特性描述
在线DDL支持添加列(包含设置列默认值为表达式的场景)、删除列、重命名列、设置列的默认值、删除列的默认值、扩展varchar大小(仅长度增加时)、修改numeric精度 (numeric(p,s))(仅p增大,s不变时)、修改ENUM/SET列定义、重命名表、指定字符集、设置列约束为NULL、添加分区、删除分区、截断分区、行迁移开关、设置分区索引不可用、创建索引concurrently、重建索引concurrently、重命名表空间、修改表空间所有者。
特性增强
- 在线DDL支持在线修改列类型、精度、长度缩减、char类型长度扩长、表级在线移动表空间、在线加非空/检查/主键/唯一约束、在线VACUUM FULL。
- 在线DDL仅在执行前期和后期短暂加排他锁,不会长时间阻塞并发读写业务。
特性约束
- 进行本特性操作时,需预留足够的磁盘空间,即剩余空间是所操作的表(及其上索引等附属品)总和的1倍。
- 本特性支持普通表,不支持数据库级、索引级、分区表、二级分区表、段页式表、hash bucket表、临时表、unlogged表等。对不支持的对象,DDL默认以历史版本方式执行。
- 若DDL语句包含本特性支持操作(包含在线修改列类型/精度/长度缩减、表级在线移动表空间、在线加非空/检查/主键/唯一约束、在线VACUUM FULL等)以外的操作,DDL默认以历史版本方式执行。
- 长事务可能会阻塞在线DDL,建议避免在长事务存在时进行在线DDL。本特性执行后期将阻塞DQL操作,对并发的DML操作进行报错。因此只支持用户业务允许报错重试的场景。对于不停重试的业务模型可能出现线程池满无法对外提供服务的严重影响,因此使用本特性前需要谨慎评估业务模型对等锁的容忍程度以及是否存在慢SQL情况来评估是否能够进行本特性操作。
- 本特性不支持在事务内执行,不支持在存储过程中执行。
- 本特性执行期间,应尽量避免与DDL并发执行,否则有一定概率出现死锁、报错等;若出现此类情况,可以重新连接客户端进行重试。
- 从不支持使用本特性的版本升级至支持新特性的版本,升级待观察期间不支持使用本特性,本次支持的在线DDL将不会生效,DDL默认以历史版本执行,并提示升级期间不支持。
- 本特性过程中会生成名为online$$ddl$$[(表所在的模式+表名)的hash值]的schema。
- Schema的属主默认为初始用户,不建议在线DDL执行中操作此schema,可能会导致中止在线DDL并产生未知错误。不建议用户对此schema下的表格进行查询。
- 用户不可创建online$$为前缀的schema,会有报错提示。若已存在同名schema冲突,在线DDL将不会生效,DDL默认以历史版本执行,并提示当前DDL语句是因为schema名冲突不可在线。
- 若之前版本已创建online$$为前缀的schema且属主是初始用户,则在升级到支持本特性的版本后,不可对该模式进行GRANT和REVOKE操作,不可在该schema下创建、GRANT、REVOKE前缀为online_ddl的表或序列,否则会有报错提示,建议重命名schema后重试。
- 若本特性(包含在线修改列类型/精度/长度缩减、表级在线移动表空间,在线VACUUM FULL)操作失败,表上可能会有明显存储空间膨胀。在线加非空/检查/主键约束操作无论失败与否, 表上可能会有明显存储空间膨胀。其中膨胀程度与DDL执行时长以及并发写操作量成正比,建议避免在长事务存在时进行在线DDL。
- 本特性执行过程中发生严重故障,如FATAL、PANIC、数据库故障和节点断连等故障时,创建的临时模式和表的追加状态可能残留,需要手动清理和恢复,通过online_ddl_cleanup()进行手动清理 (参见《开发指南》中的“SQL参考 > 函数和操作符 > 其他系统函数”章节)。如不及时清理,可能导致reloption中online_ddl_status、online_ddl_internal_status、online_ddl_start_ctid_internal、online_ddl_end_ctid_internal、online_ddl_toast_end_ctid_internal、online_ddl_toast_index_end_ctid_internal、online_ddl_toast_oid、online_ddl_lock_tag残留,进而影响依赖于以上一系列的操作。不建议在线DDL正常执行过程中进行online_ddl_cleanup()清理操作,可能会导致中止在线DDL或产生未知错误。在线DDL发生严重故障后,用户进行IUD时可能会报错提示进行手动清理。如果用户取消本特性执行过程,首先会进入残留清理流程,如果用户再次取消,则会结束清理流程导致残留。
- 本特性存在用户业务与在线DDL资源的争抢,不适合大业务背景下做在线DDL。对于资源有限的场景,建议采用细粒度资源管控进行操作。 本特性支持开启多线程加速DDL执行(具体参见《开发指南》中的“SQL参考 > SQL语法 > ALTER TABLE”章节)。当用户开启或使用资源负载管理时,比如启用IO资源管理 (如io_limits>0或io_priority = high/medium/low),若本特性同时开启多线程加速,将忽略用户/会话下的资源负载管理,并给出提示当前资源负载管理无效并开启多线程加速。在线DDL多线程执行过程实际遵循初始用户的资源负载管理。
- 本特性(包含在线修改列类型/精度/长度缩减、表级在线移动表空间,在线VACUUM FULL)操作的表上包含GSI或DDL语句中包含BY GLOBAL INDEX语法时,本次支持的在线DDL将不会生效,DDL默认以历史版本执行。
- 本特性继承CREATE TABLE LIKE的使用约束(参见《开发指南》中的“SQL参考 > SQL语法 > CREATE TABLE”章节)。
- 本特性操作不支持M-Compatibility模式。
- 本特性中在线修改列类型,不支持将类型修改、转换为SET数据类型。
- 本特性在线修改列类型char类型扩展时,不会修改重写底层数据。在线DDL操作后,已有的数据底层存储仍保有旧的长度,新增修改数据的底层存储则会服从扩展后的长度。
- 若对表进行本特性操作同时包含修改列类型/精度/长度缩减、表级在线移动表空间和加非空/检查/主键/唯一约束,当出现违反约束的数据进行报错时,报错信息会存在区别于非在线DDL的情况。
- 在线DDL修改列类型/精度/长度缩减时, 若使用MODIFY [ COLUMN ] column_name data_type语法且子句包含CHARSET、COLLATE、FIRST、AFTER等任何一个关键字或column_constraint (参见《开发指南》中的“SQL参考 > SQL语法 > ALTER TABLE”章节),在线DDL将不会生效,DDL默认以历史版本执行。
- 在线DDL修改列类型/精度/长度缩减时, 若使用CHANGE [ COLUMN ] column_name new_column_name data_type语法 (参见《开发指南》中的“SQL参考 > SQL语法 > ALTER TABLE”章节),在线DDL将不会生效,DDL默认以历史版本执行。
- 在线DDL修改列类型/精度/长度缩减或在线添加非空/检查/主键/唯一约束时,会检查数据是否满足数据类型转换、精度修改、长度缩减或约束条件等。若检查结果为不满足,DDL操作则会报错。在线DDL可并发DML,可能会出现并发DML将不满足转换或违反约束的数据删除,但DDL仍然报错的情况。例如:在线DDL扫描表修改列类型时,若表上元组A的数据并不满足数据转换,在线DDL的事务扫描到元组A时,会立即报错。如果在同一时间使用并行事务DELETE把元组A删除,但在线DDL扫描检查的事务早于并行事务DELETE,因此不会认为元组A已被删除。
- 在线添加主键和唯一约束涉及在线创建索引,若在线创建索引期间发生异常情况(如用户手动取消、唯一索引键值重复、资源不足、启动线程失败、锁超时等失败场景)导致在线创建索引失败。这种情况下可能会残留下not ready或者not valid的索引以及临时表,占用系统资源,请参考《开发指南》中的“SQL参考 > SQL语法 > CREATE INDEX”章节对异常情况处理。
- 在线VACUUM FULL不支持FREEZE关键字,若同时指定FREEZE关键字与ONLINE关键字,VACUUM FULL默认以历史版本执行,并提示当前VACUUM FULL语句不支持在线执行。
- 在线DDL和在线VACUUM FULL操作用户为非初始用户时,若表上带有表达式索引,且表达式索引中会调用用户自定义函数,则操作报错。
- 本特性其他约束继承开发指南中关于ALTER TABLE的约束(参见《开发指南》中的“SQL参考 > SQL语法 > ALTER TABLE”章节)。在线VACUUM FULL其他约束继承开发指南中关于VACUUM FULL的约束(参见《开发指南》中的“SQL参考 > SQL语法 > VACUUM”章节)。
浙公网安备 33010602011771号