Oracle expdp/impdp 使用示例

roominess發表於2012-03-31

在之前的blog

       Oracle 10g Data Pump Expdp/Impdp 詳解

       http://space.itpub.net/15880878/viewspace-720012

 

       exp/imp  expdp/impdp 對比 及使用中的一些優化事項

       http://space.itpub.net/15880878/viewspace-720015

 

       中對資料泵這塊的理論知識有一些說明,但是沒有實際操作的例子。 所以在這裡就對expdp/impdp 的使用做一些測試。

 

 

1. 建立目錄

       使用資料泵之前,需要建立一個存放檔案的目錄。 這個目錄要寫入Oracle的資料字典中才能識別。

 

1)先檢視一下已經存在的目錄:

SQL> col owner format a5

SQL> col directory_name format a25

SQL> select * from dba_directories;

 

OWNER DIRECTORY_NAME            DIRECTORY_PATH

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

SYS   BACKUP                    /u01/backup

 

2)把我們把backup 這個目錄刪除掉,在重新建立一下

SQL> drop directory backup;

Directory dropped.

SQL> select * from dba_directories;

SQL> create directory backup as '/u01/backup';

Directory created.

SQL> select * from dba_directories;

OWNER DIRECTORY_NAME            DIRECTORY_PATH

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

SYS   BACKUP                    /u01/backup

 

3)注意事項:

       我這裡是使用sys使用者來進行操作的。 如果是其他使用者,那麼就需要對這個使用者進行賦權。

SQL> grant create any directory to system;

Grant succeeded.

 

SQL> select * from dba_sys_privs where grantee='SYSTEM';

 

grantee        privilege                       adm

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

system        create any directory             no

system       global query rewrite              no

system       create materialized view          no

system       create table                     no

system       unlimited tablespace             yes

system       select any table                  no

 

       如果是其他使用者使用sys建立的目錄,也需要進行賦權,如:

SQL> grant read,write on directory backup to SYSTEM;

Grant succeeded.

 

 

2. 建立測試資料

       我們需要演示expdp/impdp的一些功能,所以需要建立2個使用者和對應的表空間,並且建立一些測試的資料。 SQL 程式碼如下:

 

SQL> create tablespace dave datafile '/u01/app/oracle/oradata/dave/dave01.dbf' size 50m;

SQL> create tablespace bl datafile '/u01/app/oracle/oradata/dave/bl01.dbf' size 50m;

SQL> create user dave identified by dave default tablespace dave temporary tablespace temp;

SQL> create user bl identified by bl default tablespace bl temporary tablespace temp;

SQL> grant read,write on directory backup to dave,bl;

SQL> grant connect,resource to dave,bl;

 

 

SQL> conn dave/dave;

Connected.

SQL> create table dave(id number,name varchar2(10));

Table created.

SQL> begin

  2  for i in 1 .. 10 loop

  3  insert into dave values(i,'dave');

  4  end loop;

  5  end;

  6  /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> select * from dave;

        ID NAME

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

         1 dave

         2 dave

         3 dave

         4 dave

         5 dave

         6 dave

         7 dave

         8 dave

         9 dave

        10 dave

10 rows selected.

 

SQL> conn bl/bl;

Connected.

SQL> create table bl(id number,name varchar2(10));

 

Table created.

 

SQL> begin

  2  for i in 10 .. 20 loop

  3  insert into bl values(i,'bl');

  4  end loop;

  5  commit;

  6  end;

  7  /

 

PL/SQL procedure successfully completed.

 

SQL> select * from bl;

 

        ID NAME

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

        10 bl

        11 bl

        12 bl

        13 bl

        14 bl

        15 bl

        16 bl

        17 bl

        18 bl

        19 bl

        20 bl

 

11 rows selected.

 

 

3. 開始測試

3.1 FULL=Y全庫匯出

1)不指定Job_name

[oracle@qs-dmm-rh2 ~]$ expdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp.dmp logfile=fullexp.log parallel=2;

 

-- 注意使用sys 的格式,還有full=y 匯出的是非syssystem使用者的物件。

Export: Release 10.2.0.4.0 - Production on Friday, 18 March, 2011 15:05:54

 

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

 

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

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

Starting "SYS"."SYS_EXPORT_FULL_02":  '/******** AS SYSDBA' directory=backup full=y dumpfile=fullexp.dmp logfile=fullexp.log parallel=2

Estimate in progress using BLOCKS method...

Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 18.68 MB

……

……

Master table "SYS"."SYS_EXPORT_FULL_02" successfully loaded/unloaded

******************************************************************************

Dump file set for SYS.SYS_EXPORT_FULL_02 is:

  /u01/backup/fullexp.dmp

Job "SYS"."SYS_EXPORT_FULL_02" successfully completed at 15:07:27

 

       expdp/impd Job形式的,會呼叫DBMS_DATAPUMP PL/SQL包,這個API提供高速的匯出匯入功能;還有DBMS_METADATA PL/SQL包,這個包是將metadata(物件定義)儲存在XML裡。 所有的程式都能load unload 這些metadata

       在備份期間,會自動的生成一張與Job_name 相同名稱的表, 該表在備份期間儲存metadata資料。 當備份技術後,自動刪除該表。

       我們可以使用SQL

              SQL>select *  FROM dba_datapump_jobs

       檢視Job 的資訊。 如果意外情況導致備份Job失敗,那麼對應儲存metadata的表,還是會存在。 這個時候,如果查詢dba_datapump_jobs,會顯示該Jobnot running。 這時候,我們只需要drop 掉對應的表,在查詢dba_datapump_jobs。 就沒有記錄了。 這個也是一種處理方法。

      

       在開始我就說了,這裡沒有指定Job name。 所以系統自動給我們生成了一個:SYS_EXPORT_FULL_02

       預設是從SYS_EXPORT_FULL_01開始,因為我之前有一個沒有執行的Job,所以這裡從2開始了。

 

2)指定Job_name

[oracle@qs-dmm-rh2 ~]$ expdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2job_name=daveJob;

--在這裡我指定了Job_name

Export: Release 10.2.0.4.0 - Production on Friday, 18 March, 2011 15:29:56

 

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

 

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

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

Starting "SYS"."DAVEJOB":  '/******** AS SYSDBA' directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2 job_name=daveJob

Estimate in progress using BLOCKS method...

Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 18.68 MB

……

……

……

Master table "SYS"."DAVEJOB" successfully loaded/unloaded

******************************************************************************

Dump file set for SYS.DAVEJOB is:

  /u01/backup/fullexp3.dmp

Job "SYS"."DAVEJOB" successfully completed at 15:31:06

 

 

3.2 全庫匯入

[oracle@qs-dmm-rh2 archivelog]$ impdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2 job_name=daveJob table_exists_action=replace;

 

       注意: 匯入的過程會生成歸檔日誌,所以,如果是Data Guard 環境,只需要匯入主庫就可以了。

 

 

3.3  匯出表

$ expdp  /'/ as sysdba/' directory=backup dumpfile=table.dmp logfile=table.log tables=dave.dave,dave.dba;

注意: 這裡必須是同一個schema下的表

 

或者:

$expdp  dave/dave directory=backup dumpfile=table.dmp logfile=table.log tables=dave, dba;

 

3.4 匯入表

$impdp dave/dave directory=backup dumpfile=table.dmp logfile=table.log tables=dave,dba;

 

 

3.5 匯出使用者

$ expdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log schemas=dave,bl;

 

這裡是同時匯出多個使用者

 

3.6 匯入使用者

$ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log schemas=dave,bl table_exists_action=replace;

 

 

3.7 匯出表空間

$ expdp  /'/ as sysdba/' directory=backup dumpfile=tbs.dmp logfile=tbs.log tablespaces=dave,bl;

 

--同時匯出2個表空間

 

3.8 匯入表空間

$ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log tablespaces=dave table_exists_action=replace;

--匯入一個表空間

 

$ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log tablespaces=dave,bl table_exists_action=replace;

 

--匯入2個表空間

 

3.9  REMAP_SCHEMA

       該選項用於將源方案的所有物件裝載到目標方案中.  我們匯出dave 使用者下的表,然後把它匯入bl使用者下。

 

$ expdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log schemas=dave;

 

$ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log remap_schema=dave:bl;

 

驗證一下:

SQL> conn bl/bl;

Connected.

SQL> select count(*) from dave;

 

  COUNT(*)

----------

        10

 

3.10  REMAP_TABLESPACE

       將源表空間的所有物件匯入到目標表空間中,我們將dave表空間下的物件匯入到bl表空間下。

 

$ expdp  /'/ as sysdba/' directory=backup dumpfile=tbs.dmp logfile=tbs.log tablespaces=dave;

 

$ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log remap_tablespace=dave:bl table_exists_action=replace;

 

 

3.11  REMAP_DATAFILE

       該全庫匯出時有用,用於將源資料檔名轉變為目標資料檔名,在不同平臺之間搬移表空間時可能需要該選項。比如把dbunix匯入到win下,全庫匯出時裡面有create tablespace的語法,這樣就有datafile的語法,裡面就有路徑,匯入到win時建立tablespace時的路徑就不能是unix下的路徑了,此時可以通過該引數remap一下路徑:

       remap_datafile=/oradata/orcl/dave01.dbf:e:/oradata/orcl/dave01.dbf

全庫匯出:

$expdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2 job_name=daveJob;

 

全庫匯入:

$impdp  /'/ as sysdba/' directory=backup dumpfile=fullexp3.dmp logfile=tbs.log full=y remap_datafile='/u01/app/oracle/oradata/dave/dave01.dbf':'/u01/app/oracle/oradata/dave/tianlesoftware01.dbf';

 

如果這裡的remap 檔案比較多,可以把這部分單獨拿出來,放到一個檔案裡。

 

$impdp  /'/ as sysdba/' directory=backup dumpfile=fullexp3.dmp logfile=tbs.log full=y parfile=payroll.par

 

payroll.par 內容:

remap_datafile='/oradata/orcl/system01.dbf':'/u01/oradata/orcl/system01.dbf'

remap_datafile='/oradata/orcl/sysaux01.dbf':'/u01/oradata/orcl/sysaux01.dbf'

remap_datafile='/oradata/orcl/undotbs4.dbf':'/u01/oradata/orcl/undotbs4.dbf'

remap_datafile='/oradata/orcl/test02.dbf':'/u01/oradata/orcl/test02.dbf'

 

如果是windows系統,需要加雙引號:

remap_datafile="'d:/orcl/system01.dbf':'e:/orcl/system01.dbf'"

 

 

 

3.12  TRANSPORT_DATAFILES

       該選項表示的是表空間的傳輸。用於指定搬移空間時要被匯入到目標資料庫的資料檔案。

 

這種方法的操作步驟如下:

1)將表空間改成read only 狀態,然後copy 待傳輸的表空間的所有資料檔案到目標庫。 這裡可以進行重新命名。

       SQL> alter tablespace dave read only;

2)按transport 方式匯出表空間。如:

       expdp directory=backup dumpfile=tts.dmp transport_tablespaces=dave

       注意:這步操作只把metadata,即後設資料,只有定義,沒有data匯入了dump檔案。 實際的data 我們在第一步已經copy 過去了。

3import 我們的資料。 如:

       impdp hr directory=dpump_dir1 dumpfile=tts.dmp transport_datafiles='/user01/data/workers.dat'

4)將表空間改成read write

       SQL>alter tablespace dave read write ;

       SQL>select * from dba_tablespaces ;
       SQL>select * from dba_data_files ;

 

       後設資料(metadata)從我們的dump檔案匯入,Data Pump將實際的data從我們指定的workers.dat 匯入。 這裡必須寫絕對路勁。

 

我們看個例項:

1)先對錶空間Dave 新增一個資料檔案:

       SQL> alter tablespace dave add datafile '/u01/dave02.dbf' size 20m;

       Tablespace altered.

2copy 到其他例項的對應位置

在移動之前先將表空間改成read only 狀態:

       SQL> alter tablespace dave read only;

 

       將表空間下的所有資料檔案移動到其他的例項上。可以進行重命令。 我這裡是同一個例項。 因為我這裡是一個例項。 我將我們剛才新增的資料檔案dave02.dbf 移動到/u01/app/oracle/oradata/dave下。 待expdp 完成後,我們將表空間drop掉,在import進來。

 

$ cp /u01/dave02.dbf /u01/app/oracle/oradata/dave/bl02.dbf

 

dave01.dbf 複製成bl03.dbf. 等會刪除表空間,不然會被刪除掉。

$ cp dave01.dbf bl03.dbf

 

 

3expdp 匯出後設資料

 

$expdp /'/ as sysdba /' directory=backup dumpfile=tts.dmp transport_tablespaces=dave

 

4import 資料

 

先把表空間drop掉在import

SQL> drop tablespace dave including contents and datafiles;

Tablespace dropped.

 

 

$ impdp /'/ as sysdba /' directory=backup dumpfile=tts.dmp transport_datafiles='/u01/app/oracle/oradata/dave/bl02.dbf', '/u01/app/oracle/oradata/dave/bl03.dbf'

 

注意一點: 這裡transport 的表空間,在另一個例項上是不可以存在的。 不然不能匯入。

 

如果檔案很多,也可以寫入個配置檔案裡。 匯入時通過PARFILE引數來指定。

 

 

5)將表空間改成read write模式:

SQL> select tablespace_name,status from dba_tablespaces;

 

TABLESPACE_NAME                STATUS

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

SYSTEM                         ONLINE

UNDOTBS1                       ONLINE

SYSAUX                         ONLINE

TEMP                           ONLINE

USERS                          ONLINE

DAVE                           READ ONLY

BL                             ONLINE

 

7 rows selected.

 

SQL> alter tablespace dave read write;

Tablespace altered.

 

SQL> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME                STATUS

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

SYSTEM                         ONLINE

UNDOTBS1                       ONLINE

SYSAUX                         ONLINE

TEMP                           ONLINE

USERS                          ONLINE

DAVE                           ONLINE

BL                             ONLINE

 

7 rows selected.

 

transport_datafiles 注意的幾點:

1)表空間所有的資料檔案都要copy到目標庫。

2copy 之間,將表空間改成read only 狀態。

3copy之後可以對資料檔案進行重新命名。 所以,transport_datafiles 也可以用來對資料檔案進行重新命名和移動位置。

4transport_datafiles 完成之後,不要忘記將表空間改成讀寫模式。

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

相關文章