使用impdp實現資料在不同使用者、不同例項之間快速複製

realkid4發表於2011-05-07

 

宣告:本文是參考secooler的《同一資料庫例項不同使用者間資料遷移複製——NETWORK_LINK引數》(http://space.itpub.net/519536/viewspace-631571)而成,特此感謝!

 

在實際開發和運維中,我們經常遇到這樣的需求:把一個schema、一個tablespace或者某些資料表的結構和內容轉移到另一個資料schematablespace或者另一個例項上。

 

實現這種需求的方法有很多。比較常用的就是使用exp/expdp工具將指定資料來源的資料匯出,成.dmp格式檔案。之後指向目標資料來源,利用imp/impdp工具匯入。本文介紹一種方式,使用impdp工具的network_link引數,實現資料在同例項或者異例項之間的靈活的快速複製。

 

 

Exp/imp工具是Oracle早期(Oracle Release 5)推出的一種資料匯出匯入工具,因其簡單實用的優點,一直具有很強的生命力。但是隨著海量資料時代的到來,以及Oracle新特性的不斷引入,exp/imp工具的不適應性逐漸顯現。於是,Oracle10g中,推出了了資料泵(Data Dumpexpdp/impdp元件,作為新一代資料管理元件。

 

 

總的來說,資料泵Data Dump元件具有如下的特點:

 

ü        相對於前一代的exp/imp工具,Data Dump具有更好的效能和可管理特性;

ü        Data Dump是一個服務端工具,而不是在Oracle客戶端;

ü        具有匯入匯出作業中斷/重新開始的控制功能;

ü        支援網路network工作模式;

ü        可以在作業中斷後重新啟動;

ü        操作物件範圍更加靈活;

ü        提供了多種方式呼叫的API組織;

 

 

回到本文要實現的任務,首先我們進行環境準備和檢視。當前系統為Oracle 11gR2環境。

//建立一個實驗Tablespace

SQL> create tablespace test datafile '/u01/oradata/WILSON/datafile/test.dbf' size 100m extent management local

  2  uniform. size 1m;

 

Tablespace created

 

SQL> select * from v$tablespace;

 

TS# NAME             INCLUDED_IN_DATABASE_BACKUP

------------------------------ --------------------------- ------- ------------ -----------------

   0 SYSTEM                         YES                  

   1 SYSAUX                         YES                   

   2 UNDOTBS1                    YES                      

   4 USERS                          YES                 

   10 TEST                           YES                    

(篇幅原因,有省略

10 rows selected

 

建立物件test

 

SQL> create user Test identified by test default tablespace TEST temporary tablespace TEMP;

 

User created

 

SQL> grant connect to test;

 

Grant succeeded

 

SQL> grant resource to test;

 

Grant succeeded

 

 

任務詳細描述:將schema scott下的所有物件包括資料,複製給test使用者schema。同時,將這些物件對應的表空間從原來的users,變換為表空間test

 

實現這個任務目標,需要按照兩個步驟:

 

1、為了使用impdp工具的network_link引數,要建立指向資料來源的Database Link物件;

2、使用impdp工具的命令列等模式進行操作;

 

下面,我們根據步驟來進行:

 

建立Database Link

 

Oracle Database Link的介紹,請參考《分散式資料庫元件——Database Link》)(http://space.itpub.net/17203031/viewspace-687469)中相應的介紹。這裡強調一個重點就是,建立Database Link時,using子句後面的命名連線名稱,是要求在資料庫伺服器上的tnsname.ora檔案中建立。而不是在使用者客戶端機器上建立的命名。

 

首先,構建本地服務名,手工改寫tnsname.ora

 

 

[oracle@oracle11g admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/oracle/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

 

WILSON =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle11g)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = wilson)

    )

  )

 

 

本例項是從wilson導向到wilson,所以指向自身就可以了。如果是向不同例項資料庫進行匯入,就需要在目標例項上進行建立databaselink的操作。此處的本地服務命名就是指向源資料庫命名。

 

下面就是建立Database Link

 

//資料庫連線Database Link建立語句

create public database link TO_SELF

  connect to system identified by system

  using 'wilson';

 

 

含義:建立一個Database Link,連線到本地命名服務名為“wilson”的資料庫例項上,使用system使用者登入,密碼為system

 

測試Database Link的情況。

 

//使用To_Self名稱連線

SQL> select count(*) from dba_objects@to_self;

 

  COUNT(*)

----------

     72470

 

 

 

進行命令列匯入

 

匯入操作之前,我們先觀察一下scott下資料物件的情況。

 

 

SQL> select table_name, tablespace_name from dba_tables where wner='SCOTT';

 

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

DEPT                           USERS

EMP                            USERS

SALGRADE                       USERS

T2                             USERS

T1                             USERS

BONUS                          USERS

 

6 rows selected

 

SQL> select index_name, tablespace_name from dba_indexes where wner='SCOTT';

 

INDEX_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

PK_DEPT                        USERS

PK_EMP                         USERS

 

 

 

此時,我們有兩個問題需要解決,首先是如何將scott使用者的資料錶轉變為test使用者,另一個是如何將users表空間變換為test表空間。

 

此處我們介紹impdp工具的兩個引數:remap_schemaremap_tablespace。這兩個引數分別實現將特定Schema、特定表空間的轉換對映。利用這兩個引數,可以定義轉換規則。

 

下面開始進行匯入:

 

 

[oracle@oracle11g admin]$ impdp system/system network_link=to_self schemas=scott remap_schema=scott:test remap_tablespace=users:test

 

Import: Release 11.2.0.1.0 - Production on Thu May 5 07:51:00 2011

 

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

 

UDI-28002: operation generated ORACLE error 28002

ORA-28002: the password will expire within 7 days

 

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

Starting "SYSTEM"."SYS_IMPORT_SCHEMA_01":  system/******** network_link=to_self schemas=scott remap_schema=scott:test remap_tablespace=users:test

Estimate in progress using BLOCKS method...

Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 192 KB

Processing object type SCHEMA_EXPORT/USER

ORA-31684: Object type USER:"TEST" already exists

Processing object type SCHEMA_EXPORT/SYSTEM_GRANT

Processing object type SCHEMA_EXPORT/ROLE_GRANT

Processing object type SCHEMA_EXPORT/DEFAULT_ROLE

Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

Processing object type SCHEMA_EXPORT/TABLE/TABLE

. . imported "TEST"."DEPT"                                    4 rows

. . imported "TEST"."EMP"                                    14 rows

. . imported "TEST"."SALGRADE"                                5 rows

. . imported "TEST"."BONUS"                                   0 rows

. . imported "TEST"."T1"                                      0 rows

. . imported "TEST"."T2"                                      0 rows

Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS

Processing object type SCHEMA_EXPORT/TABLE/COMMENT

Processing object type SCHEMA_EXPORT/VIEW/VIEW

ORA-39082: Object type VIEW:"TEST"."V_T1" created with compilation warnings

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" completed with 2 error(s) at 07:52:18

 

這樣,我們就實現了匯入。Impdp引數中,首先需要輸入指定的使用者名稱和密碼,之後表示將scott schema下的資料庫物件,透過Network_linkTo_Self匯入到目標資料庫例項上。在schema方面,如果是scott的物件,全部轉化為test使用者。在tablespace方面,如果是users表空間的物件,全部轉化到test表空間。

 

下面我們觀察下實驗結果:

 

 

SQL> select table_name, tablespace_name from dba_tables where wner='TEST';

 

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

DEPT                           TEST

EMP                            TEST

SALGRADE                       TEST

T2                             TEST

T1                             TEST

BONUS                          TEST

 

6 rows selected

 

SQL> select index_name, tablespace_name from dba_indexes where wner='TEST';

 

INDEX_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

PK_DEPT                        TEST

PK_EMP                         TEST

 

 

匯入成功。

 

這種方法的優勢很多,特別是在進行同例項資料物件複製方面,network_link可以幫助我們提高工作效率。

 

ü        直接使用impdp進行匯入。避免了使用dmp檔案的過渡過程;

ü        藉助impdp新一代工具,可以更有效的提高複製速度;

ü        定製靈活的匯入對映規則,滿足更多個性化的複製需求;

 

 

對新工具、新特性的勇於嘗試,可以讓我們的生活變得更輕鬆。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-694740/,如需轉載,請註明出處,否則將追究法律責任。

相關文章