Oracle 19c REF分区在线重定义时父表TM锁阻塞会话问题咨询
在线重定义父表TM锁阻塞问题的原因与解决办法
问题原因
- 确实是外键约束导致的锁冲突:当在线重定义的中间表(临时表)存在指向父表的外键时,Oracle为了保证外键约束的数据一致性,在
START_REDEF_TABLE启动后的全量数据加载、增量同步阶段,会对父表持续持有模式4的TM独占锁,防止父表的主键/唯一键被修改,避免中间表的外键数据出现不一致。 - 并行DML/DDL设置不影响锁机制:并行仅优化数据加载的并行处理能力,无法改变外键约束触发的锁策略。
解决办法
1. 临时移除中间表的外键约束
在在线重定义流程开始前,先删除或禁用中间表上指向父表的外键,等重定义全部完成后再重建启用:
-- 禁用中间表的外键约束 ALTER TABLE interim_table DISABLE CONSTRAINT fk_interim_parent; -- 执行在线重定义流程 BEGIN DBMS_REDEFINITION.START_REDEF_TABLE( uname => 'YOUR_SCHEMA', orig_table => 'SOURCE_TABLE', int_table => 'INTERIM_TABLE', col_mapping => 'col1 col1, col2 col2' -- 按实际字段映射填写 ); -- 增量同步数据 DBMS_REDEFINITION.SYNC_INTERIM_TABLE( uname => 'YOUR_SCHEMA', orig_table => 'SOURCE_TABLE', int_table => 'INTERIM_TABLE' ); -- 完成重定义 DBMS_REDEFINITION.FINISH_REDEF_TABLE( uname => 'YOUR_SCHEMA', orig_table => 'SOURCE_TABLE', int_table => 'INTERIM_TABLE' ); END; / -- 重建并启用外键约束 ALTER TABLE interim_table ENABLE CONSTRAINT fk_interim_parent;
2. 先创建无外键的中间表,重定义后再添加外键
创建中间表时不包含外键约束,完成整个重定义流程(包括FINISH_REDEF_TABLE)后,再在目标表上添加外键。这种方式能彻底避免父表被加锁。
3. 分阶段增量同步缩短阻塞时间(无法完全避免)
如果业务不允许临时移除外键,可以在低峰期多次调用SYNC_INTERIM_TABLE提前同步大部分数据,最后执行FINISH_REDEF_TABLE时,锁持有的时间会大幅缩短,减少对业务的影响。
内容的提问来源于stack exchange,提问作者Atta
相关产品推荐
相关产品推荐

