能否在导入Oracle表时保持ORA_ROWSCN值不变?
问题
我有一张启用了rowdependencies的表test_MD,希望将其导出/导入到另一schema时,保持原有ORA_ROWSCN值不变。但使用expdp/impdp数据泵操作后,ORA_ROWSCN值发生了变化。以下是操作步骤及结果:
drop table test_MD / Create table test_MD (id number(3) null, name varchar2(100) null) rowdependencies / insert into test_MD (id , name) values (1,'ONE') / commit / select id,name,ORA_ROWSCN from TEST_MD / insert into test_MD (id , name) values (2,'TWO') / commit / select id,name,ORA_ROWSCN from TEST_MD -- ORA_ROWSCN =230702466 230702475 / expdp testschema/testschema@testsrvr tables=TEST_MD directory=scehmadir dumpfile=MD_DMP.dmp logfile=expdpEMP_DEPT.log / alter table TEST_MD rename to TEST_MD1 / impdp testschema1/testschema1@testsrvr tables=TEST_MD directory=scehmadir dumpfile=MD_DMP.dmp logfile=impdpEMP_DEPT.log / select id,name,ORA_ROWSCN from TEST_MD1 / ORA_ROWSCN = 230708371 230708371
希望ORA_ROWSCN值保持为230702466和230702475,请问是否可行?或者有其他替代方法?
解决方案
直接保留原ORA_ROWSCN不可行
ORA_ROWSCN是Oracle自动维护的系统值,代表行最后一次被修改的SCN(系统更改号)。数据泵导入时,导入操作本身属于对行的写入操作,Oracle会自动生成新的SCN标记更新这个值,无法通过常规expdp/impdp参数直接保留原ORA_ROWSCN。
替代方案:手动存储原SCN值
如果业务需要保留原行的修改标记,可以按以下步骤操作:
- 在原表新增自定义字段存储原SCN
修改原表结构,添加一个用于存储原ORA_ROWSCN的字段,例如ORIGINAL_ROWSCN,并将原值写入该字段:ALTER TABLE test_MD ADD ORIGINAL_ROWSCN NUMBER; UPDATE test_MD SET ORIGINAL_ROWSCN = ORA_ROWSCN; COMMIT; - 导出导入包含自定义字段的表
执行expdp导出时,自定义字段会被包含在导出数据中,导入到目标schema后,该字段会保留原数值,业务可通过查询这个字段获取原来的SCN值。 - (可选)目标表启用
rowdependencies
若目标表需要继续使用rowdependencies特性,可在创建表时指定该选项,导入后新的ORA_ROWSCN会记录导入操作的SCN,而自定义字段保留原表的SCN值。
注意事项
- 自定义字段存储的是静态值,后续原表中
ORA_ROWSCN更新时,需手动同步ORIGINAL_ROWSCN(如有业务需求)。 - 该方法适用于同数据库跨schema迁移,也适用于跨数据库迁移,因为自定义字段属于业务数据,会被正常导出导入。
内容的提问来源于stack exchange,提问作者Baalback
相关产品推荐
相关产品推荐

