您在这里:首页 > 学员专区 > 技术文章
Oracle视频
Oracle
CUUG课程

Oracle11gr2数据泵新特性(四)

 

Oracle的11gr2版本中,并没有对数据泵做出多大的改动,主要是增加了对原始版本参数的支持,并且去掉了一些小的限制。

这一篇介绍数据泵导入新增的DATA_OPTIONS参数。

 

在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: Release11.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 Database11gEnterprise Edition Release11.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: Release11.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 Database11gEnterprise Edition Release11.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: Release11.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 Database11gEnterprise Edition Release11.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: Release11.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 Database11gEnterprise Edition Release11.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表的修改并没有锁定导入操作,同样导入操作也不会锁定其他用户的访问。

 

(以上内容摘于网络,如有侵权,请告之,将第一时间删除)

相关文章 [上一篇] 京东方Oracle DBA工程师(12月26日)
010-88589926(88587026)
CUUG热门培训课程
Oracle DBA就业培训
CUUG名师
网络课程
技术沙龙
最新动态

总机:(010)-88589926,88589826,88587026 QQ讨论群:243729577 182441349 邮箱:cuug_bj@cuug.com
通信地址:北京市海淀区紫竹院路98号北京化工大学科技园609室(CUUG)邮政编码:100089 
中国UNIX用户协会 Copyright 2010  ALL Rights Reserved 北京神脑资讯技术有限公司
京ICP备11008061号  京公网安备110108006275号