代码改变世界

数据泵在导入数据时为什么会大量使用undo

2022-02-07 14:15  abce  阅读(199)  评论(0编辑  收藏  举报

1.为什么undo在不断增长

可能是开启了undo的自动扩展功能。如果undo空间不够,会报以下错误信息:

ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1'

2.谁在使用undo

数据泵导入数据的时候,索引和主键约束会使用undo空间。

如果有索引,import不会使用direct_path方法导入数据。如果有主键约束,就会使用undo表空间。

在导入有主键的大表的时候,import数据泵在导入过程中,要在表上维护唯一索引,就会大量使用undo空间。

3.有哪些解决方法

(1)对于小表,可以不考虑该问题,

(2)对于大表

·导入之前,禁用主键约束,如果有外键约束,也要禁用

ALTER TABLE ... MODIFY CONSTRAINT ... DISABLE NOVALIDATE; 

·仅导入数据,导入之后再创建索引

·impdp使用参数access_method=direct_path

·导入结束后,开启主键约束(外键约束也如此)

ALTER TABLE ... MODIFY CONSTRAINT ... ENABLE VALIDATE 

  

脚本:

--disable constraints
select 'ALTER TABLE ' || owner || '.' || table_name ||
       ' MODIFY CONSTRAINT ' || constraint_name || ' DISABLE NOVALIDATE;'
  from dba_constraints
 where owner = 'HR'
   and constraint_type = 'P'
 order by owner, table_name, constraint_name;

--enable constraints
select 'ALTER TABLE ' || owner || '.' || table_name ||
       ' MODIFY CONSTRAINT ' || constraint_name || ' ENABLE VALIDATE;'
  from dba_constraints
 where owner = 'HR'
   and constraint_type = 'P'
 order by owner, table_name, constraint_name;