關於資料泵impdp引數驗證(一)

DBA_建瑾發表於2014-07-15

 

 

關於資料泵impdp匯入的部分引數的使用驗證,本章驗證的引數包括remap_dataremap_datafileremap_schemaremap_tableremap_tablespacereuse_datafile


1. remap_data

 

1.建立源表並增加資料

SQL> create table t_source (id number,name varchar2(20));

Table created.

SQL> insert into t_source values (1,'aaa');

1 row created.

SQL> insert into t_source values (2,'bbb');

1 row created.

 

2.匯出源表

[oracle@ENMOEDU ~]$ expdp \'/ as sysdba\' directory=MY_DIR tables=test.t_source

 

3.建立包和包體

SQL> create or replace package p_stu

  2  as

  3  function my_upper(text varchar2) return varchar2;

  4  end;

  5  /

Package created.

 

SQL> create or replace package body p_stu as

  2  function my_upper(text varchar2) return varchar2 as

  3  begin

  4  return upper(text);

  5  end;

  6  end;

  7  /

 

4.驗證remap_data

[oracle@ENMOEDU ~]$ impdp \'/ as sysdba\' directory=MY_DIR  remap_data=test.t_source.name:test.p_stu.my_upper table_exists_action=replace

 

SQL> select * from t_source;

    ID NAME

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

     1 AAA

     2 BBB

 

說明:資料結果從小寫字母變成大寫字母。remap_data引數的意思是匯入指定表時對欄位內容作修改。格式為:remap_data=使用者名稱.表名.欄位:使用者名稱.包名.方法名

 

2.remap_datafile


注:修改源資料檔名到目錄資料檔名,並參考源資料檔案中建立表空間,建立資料字典,建立目錄。一般會用在全庫匯出後跨平臺匯入。

 

1. 全庫匯出:

 [oracle@ENMOEDU dmp]$ expdp \'/ as sysdba\' directory=my_dir full=y dumpfile=all.dmp

 

2. 刪除test使用者和所屬test_space表空間

SQL> drop user test cascade;

User dropped.

SQL> drop tablespace test_space;

Tablespace dropped.

 

3.手動刪除表空間物理檔案/u01/app/oracle/oradata/enmo/test01.dbf

  FILE_ID FILE_NAME

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

     4 /u01/app/oracle/oradata/enmo/users01.dbf

     3 /u01/app/oracle/oradata/enmo/undotbs01.dbf

     2 /u01/app/oracle/oradata/enmo/sysaux01.dbf

     1 /u01/app/oracle/oradata/enmo/system01.dbf

     5 /u01/app/oracle/oradata/enmo/test01.dbf

     6 /u01/app/oracle/oradata/enmo/bidpro01.dbf

 


1.   行執全庫匯入,驗證沒有建立test使用者和test_space表空間是否會報錯


1.全庫匯入

impdp \'/ as sysdba\' directory=my_dir dumpfile=all.dmp full=y

2.匯入完成後使用者和表空間已經自動建立

SQL> select username,default_tablespace from dba_users;

USERNAME               DEFAULT_TABLESPACE

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

SYS                   SYSTEM

SYSTEM                 SYSTEM

TEST                   TEST_SPACE

BIDPRO                 BIDPRO_SPACE

OUTLN                  SYSTEM

3.表空間資料檔案已經自動建立,資料檔案路徑與檔名與源庫一至。

  FILE_ID FILE_NAME

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

     4 /u01/app/oracle/oradata/enmo/users01.dbf

     3 /u01/app/oracle/oradata/enmo/undotbs01.dbf

     2 /u01/app/oracle/oradata/enmo/sysaux01.dbf

     1 /u01/app/oracle/oradata/enmo/system01.dbf

     5 /u01/app/oracle/oradata/enmo/test01.dbf

     6 /u01/app/oracle/oradata/enmo/bidpro01.dbf

 

說明:非跨平臺時不用指定此remap_datafile引數。全庫匯入會自動建立使用者和表空間,並使用源資料庫資料檔案路徑和資料檔名稱建立表空間。

 

2. 匯入時使用remap_datafile指定資料檔案路徑和名字

1.刪除test使用者和所屬test_space表空間

SQL> drop user test cascade;

User dropped.

SQL> drop tablespace test_space;

Tablespace dropped.

2.全庫匯入時使用remap_datafile指定資料檔案

[oracle@ENMOEDU dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=all.dmp full=y              remap_datafile=\"\'/u01/app/oracle/oradata/enmo/test01.dbf\':\'/u01/app/oracle/oradata/enmo /test_space.dbf\'\"

3.匯入完成後檢視資料檔案狀態

   FILE_ID FILE_NAME

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

     4 /u01/app/oracle/oradata/enmo/users01.dbf

     3 /u01/app/oracle/oradata/enmo/undotbs01.dbf

     2 /u01/app/oracle/oradata/enmo/sysaux01.dbf

     1 /u01/app/oracle/oradata/enmo/system01.dbf

     5 /u01/app/oracle/oradata/enmo/test_space.dbf

     6 /u01/app/oracle/oradata/enmo/bidpro01.dbf

 

說明:全庫匯入時使用者、表空間、資料檔案都可以自動建立,並可以使用remap_datafile更改資料檔案路徑和資料檔名稱。

3.全庫匯入ASM磁碟管理資料庫(源資料庫為本地檔案管理)


1.如果全庫匯入ASM磁碟管理的資料庫時會提示無法建立表空間,因為匯入表空間的建立語句中還使用原來的資料檔案路徑和名稱。測試結果如下:

[oracle@rac2 dmp]$ impdp \'/ as sysdba\' directory=my_dir  dumpfile=all.dmp logfile=all.log full=y

 

Import: Release 11.2.0.3.0 - Production on Wed Jul 2 22:20:16 2014

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

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

Data Mining and Real Application Testing options

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

Starting "SYS"."SYS_IMPORT_FULL_01":  "/******** AS SYSDBA" directory=my_dir dumpfile=all.dmp logfile=all.log full=y

Processing object type DATABASE_EXPORT/TABLESPACE

ORA-31684: Object type TABLESPACE:"UNDOTBS1" already exists

ORA-31684: Object type TABLESPACE:"TEMP" already exists

ORA-31684: Object type TABLESPACE:"USERS" already exists

ORA-39083: Object type TABLESPACE failed to create with error:

ORA-01119: error in creating database file '/u01/app/oracle/oradata/enmo/test01.dbf'

 

說明:全庫匯入不同環境的資料庫時需要使用remap_datafile引數重新指定資料檔案。

 

2.全庫匯入ASM磁碟管理資料庫時,使用remap_datafile引數

[oracle@rac2 dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=all.dmp logfile=test.log remap_datafile=\"\'/u01/app/oracle/oradata/enmo/test01.dbf\':\'+DATA/rac/datafile/test01\'\" full=y

 

3.使用者和表空間已經建立

SQL> select username,default_tablespace from dba_users;

USERNAME               DEFAULT_TABLESPACE

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

MGMT_VIEW              SYSTEM

SYS                SYSTEM

SYSTEM                 SYSTEM

DBSNMP                 SYSAUX

SYSMAN                 SYSAUX

TEST                   TEST_SPACE

4.資料檔案已經按指定路徑和檔名建立

SQL> select tablespace_name,file_name from dba_data_files;

TABLESPACE_NAME           FILE_NAME

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

SYSTEM                 +DATA/rac/datafile/system.261.850108223

SYSAUX                 +DATA/rac/datafile/sysaux.260.850108227

UNDOTBS1               +DATA/rac/datafile/undotbs1.259.850108229

UNDOTBS2               +DATA/rac/datafile/undotbs2.257.850108237

USERS                  +DATA/rac/datafile/users.256.850108239

TEST_SPACE             +DATA/rac/datafile/test01

 

3.remap_schema


1.用全庫匯出的dmp檔案匯入單個使用者

[oracle@ENMOEDU ~]$ impdp \'/ as sysdba\' directory=my_dir schemas=test remap_schema=test:test1 dumpfile=all.dmp logfile=test1.log

 

2.匯入完成後使用者被自動建立

SQL> select username,default_tablespace from dba_users;

USERNAME               DEFAULT_TABLESPACE

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

SYS                    SYSTEM

SYSTEM                 SYSTEM

TEST1                  TEST_SPACE

TEST                   TEST_SPACE

BIDPRO                 BIDPRO_SPACE

 

說明:remap_schema引數指定的目標使用者Test1會被自動建立了。test1所屬表空間預設使用源表表空間。

 

3.按使用者匯出一個dmp檔案

[oracle@ENMOEDU ~]$ expdp \'/ as sysdba\' directory=my_dir schemas=test dumpfile=test.dmp

4.匯入

[oracle@ENMOEDU dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp remap_schema=test:test2 logfile=re_sch.log

5.使用者已經建立

USERNAME               DEFAULT_TABLESPACE

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

SYS                SYSTEM

SYSTEM                 SYSTEM

TEST2                  TEST_SPACE

TEST1                  TEST_SPACE

TEST                   TEST_SPACE

 

說明:與是否全庫匯出的dmp檔案無關,remap_schema指定的目標使用者都會自動被建立。

 

 

4. remap_table

 

注:格式:Remap_table=舊錶名:新表名

 

1.使用remap_table引數執行匯入

[oracle@ENMOEDU dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp  tables=t_source remap_table=t_source:t_source3

Import: Release 11.2.0.3.0 - Production on Thu Jul 10 14:52:51 2014

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

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

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

ORA-39002: invalid operation

ORA-39166: Object SYS.T_SOURCE was not found.

 

說明:因為是用sysdba使用者來操作的,所以未找到t_source表。

 

2.在引數tables中指定表的所屬使用者,重新匯入

impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp  tables=test.t_source remap_table=t_source:t_source3

3.匯入完成

SQL> select count(*) from test.t_source3;

  COUNT(*)

----------

     2

 

4.刪除使用者(驗證一下按使用者匯入時,使用schemas引數指定使用者,並指定remap_table重新命名錶名,源表是否同樣被匯入。)

SQL> drop user test cascade;

User dropped.

5.匯入時同時使用schemasremap_table引數

[oracle@ENMOEDU dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp  schemas=test remap_table=t_source:t_source5

6.匯入完成後只有t_source5表,沒有源表t_source。說明remap_table只是將源表重新命名後匯入目標庫。

SQL> select table_name from dba_tables where owner='TEST';

TABLE_NAME

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

PRO_BDG_ALLOCATION_TBL

T_SOURCE2

T_TASKDONE

T_BASEITEM

T_TARGET

T_SOURCE5

TEST.T_TARGET

PRO_APP_PROJECT_BASEINFO_TBL

PRO_APP_INVEST_BUDGET_TBL

PRO_BDG_APPBDG_CTRL_TBL

PRO_ATH_PROORBDG_CTRL_TBL


 

5. remap_tablespace

 

注:如果引數中使用table_exists_action,並且值為,skip,truncate,append,那麼目標庫中的資料將不會受到任務影響。

 

1.   驗證是否會自動建立新的表空間


1.如果目標資料庫中未建立remap_tablespace引數指定表空間,執行匯入

[oracle@ENMOEDU dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp  remap_schema=test:test1 remap_tablespace=test_space:test_space2  table_exists_action=replace

 

執行後出現錯誤資訊:ORA-00959: tablespace 'TEST_SPACE2' does not exist說明使用remap_tablespace時表空間不會自動建立,必須手動建立。(可能是因為建立表空間時要先建立資料檔案。)

 

 

2.驗證remap_tablespace


1.建立一個表空間

SQL> create tablespace test_space2 datafile '/u01/app/oracle/oradata/enmo/test_space2.dbf' size 20M autoextend on next 5M;

Tablespace created.

 

2.匯入時不指定table_exists_action,預設skip

[oracle@ENMOEDU dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp  remap_schema=test:test1 remap_tablespace=test_space:test_space2  

 

3.匯入完成,資料已經匯入到指定表空間

SQL> select OWNER,TABLE_NAME,TABLESPACE_NAME from dba_tables where table_name =upper('t_source');

OWNER                  TABLE_NAME            TABLESPACE_NAME

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

TEST1                  T_SOURCE              TEST_SPACE2

TEST2                  T_SOURCE              TEST_SPACE

 

 

3.驗證remap_tablespace已經存在的資料是否會移到指定表空間


1.新建立一個無資料的表空間

SQL> create tablespace test_space3 datafile '/u01/app/oracle/oradata/enmo/test_space3.dbf' size 20M autoextend on next 5M;

Tablespace created.

2.執行匯入(在目標資料庫中,要匯入的資料已經存在於test_space表空間中)

[oracle@ENMOEDU dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp  remap_tablespace=test_space:test_space3 

3.因為table_exists_action引數預設是skip所以test_space3表空間中沒有資料

SQL> select count(*) from dba_tables where tablespace_name=upper('test_space3');

  COUNT(*)

----------

     0

 

說明:因為這些表在目錄庫的表空間中都已經存在了。它們並不會移到remap_tablespace 新指定的表空間中,所以表空間test_space3無資料。

 

4. 使用remap_tablespace並設定table_exists_action=replace驗證已經存在的資料是否會移到新表空間

 

1.建立新表空間

SQL> create tablespace space01 datafile '/u01/app/oracle/oradata/enmo/space01.dbf' size 10M autoextend on;

Tablespace created.

2.執行匯入

[oracle@ENMOEDU ~]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp schemas=test remap_tablespace=TEST_SPACE:space01 table_exi

sts_action=replace

3.查詢資料是否移到新表空間

SQL> select owner,table_name ,tablespace_name from dba_tables where tablespace_name in ('SPACE01','TEST_SPACE');

OWNER                  TABLE_NAME            TABLESPACE_NAME

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

TEST                   T_BASEITEM            SPACE01

TEST                   T_TASKDONE            SPACE01

TEST                   PRO_BDG_ALLOCATION_TBL        SPACE01

TEST                   PRO_APP_INVEST_BUDGET_TBL      SPACE01

TEST                   PRO_APP_PROJECT_BASEINFO_TBL   SPACE01

TEST                   PRO_ATH_PROORBDG_CTRL_TBL      SPACE01

TEST                   PRO_BDG_APPBDG_CTRL_TBL       SPACE01

 

 

說明在設定table_exists_action=replace時會將源表空間中已經存在的表刪除,重新匯入到新表空間中。

 

6.reuse_datafile


使用已經存在的資料檔案來建立表空間。只有兩個引數值yes,no。指定引數yes,將重新初始化資料檔案,可能造成資料丟失。

 

1.刪除表空間和使用者,但未刪除資料檔案

SQL> drop tablespace TEST_SPACE;

Tablespace dropped.

SQL> drop user test cascade;

User dropped.

SQL> drop tablespace SPACE01;

Tablespace dropped.

 

 

SQL> select tablespace_name ,file_name from dba_data_files;

TABLESPACE_NAME      FILE_NAME

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

USERS            /u01/app/oracle/oradata/enmo/users01.dbf

UNDOTBS1         /u01/app/oracle/oradata/enmo/undotbs01.dbf

SYSAUX           /u01/app/oracle/oradata/enmo/sysaux01.dbf

SYSTEM           /u01/app/oracle/oradata/enmo/system01.dbf

BIDPRO_SPACE         /u01/app/oracle/oradata/enmo/bidpro01.dbf

 

2檢視資料檔案(未刪除)

[oracle@ENMOEDU enmo]$ ls -trl

total 6325148

-rw-r----- 1 oracle oinstall   52429312 Jul 11 00:13 redo02.log

-rw-r----- 1 oracle oinstall   30416896 Jul 11 00:13 temp01.dbf

-rw-r----- 1 oracle oinstall   52429312 Jul 11 00:30 redo03.log

-rw-r----- 1 oracle oinstall  828579840 Jul 11 00:31 test01.dbf

-rw-r----- 1 oracle oinstall    5251072 Jul 11 00:35 users01.dbf

-rw-r----- 1 oracle oinstall  828579840 Jul 11 00:35 space01.dbf

-rw-r----- 1 oracle oinstall 3221233664 Jul 11 00:35 bidpro01.dbf

-rw-r----- 1 oracle oinstall   78651392 Jul 11 00:35 undotbs01.dbf

-rw-r----- 1 oracle oinstall  754982912 Jul 11 00:35 system01.dbf

-rw-r----- 1 oracle oinstall  566239232 Jul 11 00:35 sysaux01.dbf

-rw-r----- 1 oracle oinstall   52429312 Jul 11 00:35 redo01.log

-rw-r----- 1 oracle oinstall   10043392 Jul 11 00:35 control01.ctl

 

3.執行按使用者匯入

[oracle@ENMOEDU enmo]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=test.dmp  schemas=test reuse_datafiles=y

 

Import: Release 11.2.0.3.0 - Production on Fri Jul 11 00:42:26 2014

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

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

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

ORA-39005: inconsistent arguments

ORA-39032: function REUSE_DATAFILES is not supported in SCHEMA jobs

Reuse_datafiles不支援指定schema操作,可能只適用全庫匯出的檔案(全庫匯出的dmp檔案中記錄資料檔案路徑和名稱)。

 

 

4.使用全庫匯出的dmp檔案執行匯入

[oracle@ENMOEDU dmp]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=all.dmp schemas=test reuse_datafiles=y

 

SQL> select tablespace_name ,file_name from dba_data_files;

TABLESPACE_NAME      FILE_NAME

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

USERS            /u01/app/oracle/oradata/enmo/users01.dbf

UNDOTBS1         /u01/app/oracle/oradata/enmo/undotbs01.dbf

SYSAUX           /u01/app/oracle/oradata/enmo/sysaux01.dbf

SYSTEM           /u01/app/oracle/oradata/enmo/system01.dbf

TEST_SPACE       /u01/app/oracle/oradata/enmo/test01.dbf

BIDPRO_SPACE         /u01/app/oracle/oradata/enmo/bidpro01.dbf

 

 

刪除資料檔案,驗證如果沒有dmp檔案中記錄的資料檔案。是重新生成資料檔案還是重用其它無用的資料檔案

SQL> drop user test cascade;

User dropped.

SQL> drop tablespace TEST_SPACE;

Tablespace dropped.

刪除test_space表空間所屬資料檔案

 [oracle@ENMOEDU enmo]$ rm test01.dbf

 

執行全庫匯入

[oracle@ENMOEDU enmo]$ impdp \'/ as sysdba\' directory=my_dir dumpfile=all.dmp  reuse_datafiles=y

只會重用空間指定檔名的資料檔案,如果找不到還是會重新建立資料檔案。

TABLESPACE_NAME      FILE_NAME

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

USERS            /u01/app/oracle/oradata/enmo/users01.dbf

UNDOTBS1         /u01/app/oracle/oradata/enmo/undotbs01.dbf

SYSAUX           /u01/app/oracle/oradata/enmo/sysaux01.dbf

SYSTEM           /u01/app/oracle/oradata/enmo/system01.dbf

TEST_SPACE       /u01/app/oracle/oradata/enmo/test01.dbf

BIDPRO_SPACE         /u01/app/oracle/oradata/enmo/bidpro01.dbf

 

無用的資料檔案space01.dbf並沒有重用,還是會按dmp檔案中記錄的檔案路徑和名稱生成新的資料檔案。

[oracle@ENMOEDU enmo]$ ls -trl

total 6381720

-rw-r----- 1 oracle oinstall  828579840 Jul 11 00:38 space01.dbf

-rw-r----- 1 oracle oinstall   52429312 Jul 11 01:16 redo02.log

-rw-r----- 1 oracle oinstall   30416896 Jul 11 01:16 temp01.dbf

-rw-r----- 1 oracle oinstall    5251072 Jul 11 01:16 users01.dbf

-rw-r----- 1 oracle oinstall   78651392 Jul 11 01:16 undotbs01.dbf

-rw-r----- 1 oracle oinstall  807411712 Jul 11 01:16 system01.dbf

-rw-r----- 1 oracle oinstall  566239232 Jul 11 01:16 sysaux01.dbf

-rw-r----- 1 oracle oinstall 3221233664 Jul 11 01:16 bidpro01.dbf

-rw-r----- 1 oracle oinstall   52429312 Jul 11 01:16 redo03.log

-rw-r----- 1 oracle oinstall   10043392 Jul 11 01:16 control01.ctl

-rw-r----- 1 oracle oinstall   52429312 Jul 11 01:16 redo01.log

-rw-r----- 1 oracle oinstall  829628416 Jul 11 01:16 test01.dbf




----------end----------
        
            DBA_建瑾
            2014.7.15
        


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

相關文章