在IMPDP Job期间产生大量UNDO的大部分原因都是因为在目标数据库导入的表已经存在,并且在这个表上存在一个或多个的索引。在impdp job期间,插入的每一行都需要维护索引。
要解决这个问题,请确保在目标数据库不存在需要导入的表,之后让impdp来创建表。也就是说在执行impdp DataPump job的时候不要使用TABLE_EXISTS_ACTION=APPEND或者TABLE_EXISTS_ACTION=TRUNCATE参数,除非是真正必须要使用。
如果一个大数据量需要导入一个存在表,你不得不使用TABLE_EXISTS_ACTION=APPEND,那么请执行以下的步骤:
1).在目标数据库执行存在表的export,以至于在需要的时候能够恢复表的数据和相关对象的DDL操作。
2).如果在目标数据库存在的表上有触发器,如果可能考虑DROP它们。
3).确保在表上没有主键(索引),(如果你的目的是为了防止重复行,你必须要保留主键约束,这将不可避免在相关索引import job期间产生UNDO)。
4).如果在目标数据库存在的表上包含其它的索引,如果可能考虑DROP它们(注意在执行impdp期间使用EXCLUDE=INDEX不能跳过任何存在索引的维护工作)。
5).将数据导入目标数据库存在的表中。
6).重建索引、主键和触发器。
DataPump会选择最佳的方法确保数据和元数据以最有效的方法完成导出和导入。
默认情况在impdp期间,Impdp将维护索引,如果表和索引已经创建,不要使用direct_path,然而,如果没有索引强制约束,可以在DataPump导入命令行指定ACCESS_METHOD=DIRECT_PATH,DataPump能使用直接路径(direct path)方法实施导入。
也可以通过禁用主键约束来实现直接路径加载数据(使用ALTER TABLE ... MODIFY CONSTRAINT ... DISABLE NOVALIDATE),之后在impdp期间使用access_method=direct_path参数加载数据,最后启用主键约束(使用ALTER TABLE ... MODIFY CONSTRAINT ... ENABLE VALIDATE)。
在导入期间不创建索引消耗UNDO是非常小的,下面是一个很好的数据导出、导入案例(案例转载自: http://www.anbob.com/archives/1888.html ):
因一次硬件原因导致了服务器异常停机,防止蝴蝶效应及时进行了数据迁移,一周发现了这个决定正确的。
申请了2小时的停机时间。因数据不大且表空间开始使用不规范决定用expdp数据泵方式迁移。
在新设备
1).raid10+安装OS
2).安装oracle 10.2.0.1(single instance)+
要解决这个问题,请确保在目标数据库不存在需要导入的表,之后让impdp来创建表。也就是说在执行impdp DataPump job的时候不要使用TABLE_EXISTS_ACTION=APPEND或者TABLE_EXISTS_ACTION=TRUNCATE参数,除非是真正必须要使用。
如果一个大数据量需要导入一个存在表,你不得不使用TABLE_EXISTS_ACTION=APPEND,那么请执行以下的步骤:
1).在目标数据库执行存在表的export,以至于在需要的时候能够恢复表的数据和相关对象的DDL操作。
2).如果在目标数据库存在的表上有触发器,如果可能考虑DROP它们。
3).确保在表上没有主键(索引),(如果你的目的是为了防止重复行,你必须要保留主键约束,这将不可避免在相关索引import job期间产生UNDO)。
4).如果在目标数据库存在的表上包含其它的索引,如果可能考虑DROP它们(注意在执行impdp期间使用EXCLUDE=INDEX不能跳过任何存在索引的维护工作)。
5).将数据导入目标数据库存在的表中。
6).重建索引、主键和触发器。
DataPump会选择最佳的方法确保数据和元数据以最有效的方法完成导出和导入。
默认情况在impdp期间,Impdp将维护索引,如果表和索引已经创建,不要使用direct_path,然而,如果没有索引强制约束,可以在DataPump导入命令行指定ACCESS_METHOD=DIRECT_PATH,DataPump能使用直接路径(direct path)方法实施导入。
也可以通过禁用主键约束来实现直接路径加载数据(使用ALTER TABLE ... MODIFY CONSTRAINT ... DISABLE NOVALIDATE),之后在impdp期间使用access_method=direct_path参数加载数据,最后启用主键约束(使用ALTER TABLE ... MODIFY CONSTRAINT ... ENABLE VALIDATE)。
在导入期间不创建索引消耗UNDO是非常小的,下面是一个很好的数据导出、导入案例(案例转载自: http://www.anbob.com/archives/1888.html ):
因一次硬件原因导致了服务器异常停机,防止蝴蝶效应及时进行了数据迁移,一周发现了这个决定正确的。
申请了2小时的停机时间。因数据不大且表空间开始使用不规范决定用expdp数据泵方式迁移。
在新设备
1).raid10+安装OS
2).安装oracle 10.2.0.1(single instance)+