在Oracle 12c中,在数据泵(expdp)方面有哪些增强的新特性?
A 答案
Oracle 12c的数据泵新增了很多的新特性,分别如下所示:
(1)在Data Pump中引入了新的TRANSFORM的选项DISABLE_ARCHIVE_LOGGING,这对于表和索引在导入期间提供了关闭Redo日志生成的灵活性。当为TRANSFORM选项指定了DISABLE_ARCHIVE_LOGGING:Y值,那么在整个导入期间,表和索引的Redo日志就会处于关闭状态,仅生成少量的日志。这一功能在导入大型表时缓解了压力,并且减少了过度的Redo产生,从而加快了导入。这一属性对表和索引都适用。不管是在非归档还是归档情况下使用DISABLE_ARCHIVE_LOGGING都会减小导入时间,减少归档量。但是需要注意的是,如果数据库处于FORCE LOGGING模式,那么DISABLE_ARCHIVE_LOGGING参数会无效。
以下SQL演示了这一功能:
l impdp directory=dpump dumpfile=abcd.dmp TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y logfile=abcd.log
l impdp hr/hr DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp SCHEMAS=hr TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y --表和索引都关闭日志
l impdp hr/hr DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp SCHEMAS=hr TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y:TABLE --只有表关闭日志
l impdp hr/hr DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp SCHEMAS=hr TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y TRANSFORM=DISABLE_ARCHIVE_LOGGING:N:INDEX
“TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y”表示表和索引都关闭日志。
有关该新特性需要注意以下几点:
① 在导入完成后,表和索引的状态(包括LOGGING状态和索引是否有效的状态)都会恢复到导入之前的状态。
② 在使用该参数导入数据文件后,如果相应的datafile被restored和recovered,那么接下来的涉及到目标表的查询会报ORA-01578和ORA-26040的坏块错误。例如:
例如:
SQL> select * from test_nologging;
ORA-01578: ORACLE data block corrupted (file #11, block # 84)
ORA-01110: data file 4: '/oradata/users.dbf'
ORA-26040: Data block was loaded using theNOLOGGING option
因此,在使用该参数导入数据文件后,需要立马对相关的数据文件做RMAN备份。
(2)使用VIEWS_AS_TABLES选项可以让数据泵将视图转换为表然后导出。需要注意的是,导出到dmp文件后,视图的定义已经自动转换为表的定义了。在执行导入操作后,会以表的形式存在。
以下SQL演示了这一功能:
l expdp system/lhr DIRECTORY=data_pump_dir DUMPFILE=expdp_vw.dmp LOGFILE=expdp_vw.log VIEWS_AS_TABLES=lhr.my_view
l impdp system/lhr DIRECTORY=data_pump_dir DUMPFILE=expdp_vw.dmp LOGFILE=impdp_vw.log remap_schema=lhr:lhr01
l impdp lhr/lhr DIRECTORY=data_pump_dir DUMPFILE=expdp_vw.dmp LOGFILE=impdp_vw.log remap_schema=lhr:lhr1 VIEWS_AS_TABLES=lhr.my_view
l impdp lhr/lhr DIRECTORY=data_pump_dir DUMPFILE=expdp_vw.dmp LOGFILE=impdp_vw.log remap_schema=lhr:lhr1 TABLES=lhr.my_view
表数据准备:
create table lhr.my_tab1 (nr number, txt varchar2(10));
insert into lhr.my_tab1 values (1,'Line 1');
insert into lhr.my_tab1 values (2,'Line 2');
create table lhr.my_tab2 (nr number, col2 number, col3 varchar2(10));
insert into lhr.my_tab2 values (1,1,'c3_1');
insert into lhr.my_tab2 values (2,2,'c3_2');
commit;
create view lhr.my_view (nr, txt, col3) as
select t1.nr, t1.txt, t2.col3
from lhr.my_tab1 t1, lhr.my_tab2 t2
where t1.nr=t2.nr;
(3)LOGTIME参数决定时间戳是否将包括在expdp和impdp功能的输出信息中。LOGTIME的可用值如下所示:
① NONE:默认值,指示输出中不包括时间戳,输出和之前的版本相似。
② STATUS:时间戳包括在控制台输出中,但不会在日志文件中出现。
③ LOGFILE:时间戳出现在日志文件中,但不会输出到控制台。
④ ALL:时间戳出现在日志文件和控制台输出中。
关于Oracle 12c的数据泵还有很多的新特性,例如压缩、加密、审计等,这里不再详细介绍,读者可参考作者的博客或阅读相关的官方文档进行学习。