Oracle的11gr2版本中,并没有对数据泵做出多大的改动,主要是增加了对原始版本参数的支持,并且去掉了一些小的限制。
这一篇介绍数据泵导入新增的DATA_OPTIONS参数。
Oracle11gr2数据泵新特性(一):http://yangtingkun.itpub.net/post/468/491243
Oracle11gr2数据泵新特性(二):http://yangtingkun.itpub.net/post/468/491323
Oracle11gr2数据泵新特性(三):http://yangtingkun.itpub.net/post/468/491371
在11.2之前,数据泵的导入只提供了一个DATA_OPTIONS——SKIP_CONSTRAINT_ERRORS,而在11.2中,DATA_OPTIONS又增加了一个可用的值:DIABLE_APPEND_HINT。
一般来说我们希望数据泵使用直接路径的方式导入,因为导入的效率会很高。但是有的时候,我们并不需要采用直接路径的方式,因为这种方式对目标表的并发访问有很大的影响,而DIABLE_APPEND_HINT则将掌握权交给了我们。
SQL> create table t_append (id number, name varchar2(30));
表已创建。
SQL> insert into t_append
2 select rownum, object_name
3 from all_objects;
已创建55625行。
SQL> commit;
提交完成。
创建了一个测试表,下面通过数据泵方式导出这个表:
[oracle@bjtest ~]$ expdp test/test dumpfile=t_append.dp directory=d_output tables=t_append
Export: Release 11.2.0.1.0 - Production on 星期三 9月 9 19:05:32 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
启动 "TEST"."SYS_EXPORT_TABLE_01": test/******** dumpfile=t_append.dp directory=d_output tables=t_append
正在使用 BLOCKS 方法进行估计...
处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的总估计: 3 MB
处理对象类型 TABLE_EXPORT/TABLE/TABLE
. . 导出了 "TEST"."T_APPEND" 1.839 MB 55625 行
已成功加载/卸载了主表 "TEST"."SYS_EXPORT_TABLE_01"
******************************************************************************
TEST.SYS_EXPORT_TABLE_01 的转储文件集为:
/home/oracle/t_append.dp
作业 "TEST"."SYS_EXPORT_TABLE_01" 已于 19:05:41 成功完成
下面采用默认的导入方式:
[oracle@bjtest ~]$ impdp test/test dumpfile=t_append.dp directory=d_output tables=t_append content=data_only
Import: Release 11.2.0.1.0 - Production on 星期三 9月 9 19:27:49 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功加载/卸载了主表 "TEST"."SYS_IMPORT_TABLE_01"
启动 "TEST"."SYS_IMPORT_TABLE_01": test/******** dumpfile=t_append.dp directory=d_output tables=t_append content=data_only
处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
. . 导入了 "TEST"."T_APPEND" 1.839 MB 55625 行
作业 "TEST"."SYS_IMPORT_TABLE_01" 已于 19:27:53 成功完成
默认的APPEND方式只需要4秒,就可以把数据加载进去。但是这种方式需要所表,如果同时有其他人在操作,会导致并发问题:
SQL> update t_append set name = lower(name) where id = 1;
已更新2行。
在一个会话中执行了UPDATE操作,启动另一个会话更新不同的记录:
SQL> set sqlp 'SQL2> '
SQL2> update t_append set name = lower(name) where id = 2;
已更新2行。
可以看到由于更新不同的记录,因此两个会话更新都可以执行,下面回滚会话2的操作:
SQL2> rollback;
回退已完成。
现在会话1的UPDATE仍然持有锁,下面执行默认的导入操作:
[oracle@bjtest ~]$ impdp test/test dumpfile=t_append.dp directory=d_output tables=t_append content=data_only
Import: Release 11.2.0.1.0 - Production on 星期三 9月 9 20:20:45 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功加载/卸载了主表 "TEST"."SYS_IMPORT_TABLE_01"
启动 "TEST"."SYS_IMPORT_TABLE_01": test/******** dumpfile=t_append.dp directory=d_output tables=t_append content=data_only
处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
由于使用直接路径导入方式,因此导入进行被锁,检查数据库的锁信息:
SQL2> conn yangtk/yangtk
已连接。
SQL2> select sid, type, id1, id2, lmode, request, ctime, block
2 from v$lock
3 where id1 =
4 (select object_id
5 from dba_objects
6 where wner = 'TEST'
7 and object_name = 'T_APPEND');
SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------- -- ---------- ---------- ---------- ---------- ---------- ----------
130 TM 73846 0 3 0 3214 1
210 TM 73846 0 0 6 178 0
SQL2> select sid, program
2 from v$session
3 where sid = 210;
SID PROGRAM
---------- ------------------------------------------------
210 oracle@bjtest (DW00)
SQL2> select sid, event
2 from v$session_wait
3 where sid = 210;
SID EVENT
---------- ----------------------------------------------------------------
210 enq: TM - contention
可以看到,数据泵的直接路径装载被其他会话的修改锁住。
同时,这个直接路径导入还会锁住其他用户对这个对象的修改操作:
SQL2> conn test/test
已连接。
SQL2> update t_append set name = lower(name) where id = 2;
刚才可以顺利执行的更新操作,由于直接路径的存在,已经被锁定了。
在会话1提交或回滚操作:
SQL> commit;
提交完成。
直接路径导入也随即完成:
. . 导入了 "TEST"."T_APPEND" 1.839 MB 55625 行
作业 "TEST"."SYS_IMPORT_TABLE_01" 已于 20:33:59 成功完成
会话2的update操作也执行完成:
已更新3行。
SQL2> commit;
提交完成。
从更新的数量上就可以看到,更新操作是发生在导入操作之后。
上面的例子不难看出,对于需要同时访问的对象,采用直接路径导入存在严重的并发问题,这时可以利用新功能DISABLE_APPEND_HINT。
在会话1,仍然执行UPDATE操作,并保持锁:
SQL> update t_append set name = lower(name) where id = 1;
已更新3行。
然后再次执行数据泵的导入,不过这次采用DATA_OPTIONS=DISABLE_APPEND_HINT参数进行导入:
[oracle@bjtest ~]$ impdp test/test dumpfile=t_append.dp directory=d_output tables=t_append content=data_only data_options=disable_append_hint
Import: Release 11.2.0.1.0 - Production on 星期三 9月 9 20:39:36 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功加载/卸载了主表 "TEST"."SYS_IMPORT_TABLE_01"
启动 "TEST"."SYS_IMPORT_TABLE_01": test/******** dumpfile=t_append.dp directory=d_output tables=t_append content=data_only data_options=disable_append_hint
处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
. . 导入了 "TEST"."T_APPEND" 1.839 MB 55625 行
作业 "TEST"."SYS_IMPORT_TABLE_01" 已于 20:39:40 成功完成
其他用户对T_APPEND表的修改并没有锁定导入操作,同样导入操作也不会锁定其他用户的访问。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-614407/ ,如需转载,请注明出处,否则将追究法律责任。