Oracle11gr2資料泵新特性(四)

yangtingkun發表於2009-09-10

Oracle11gr2版本中,並沒有對資料泵做出多大的改動,主要是增加了對原始版本引數的支援,並且去掉了一些小的限制。

這一篇介紹資料泵匯入新增的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;

回退已完成。

現在會話1UPDATE仍然持有鎖,下面執行預設的匯入操作:

[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 成功完成

會話2update操作也執行完成:


已更新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部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-614407/,如需轉載,請註明出處,否則將追究法律責任。

相關文章