Oracle expdp/impdp匯出匯入命令及資料庫備份

shilei1發表於2017-11-12
使用EXPDP和IMPDP時應該注意的事項:

EXP和IMP是客戶端工具程式,它們既可以在客戶端使用,也可以在服務端使用。

EXPDP和IMPDP是服務端的工具程式,他們只能在ORACLE服務端使用,不能在客戶端使用。

IMP只適用於EXP匯出的檔案,不適用於EXPDP匯出檔案;IMPDP只適用於EXPDP匯出的檔案,而不適用於EXP匯出檔案。

expdp或impdp命令時,可暫不指出使用者名稱/密碼@例項名 as 身份,然後根據提示再輸入,如:

expdp schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1;

一、建立邏輯目錄,該命令不會在作業系統建立真正的目錄,最好以system等管理員建立。

create directory dpdata1 as 'd:\test\dump';

二、檢視管理理員目錄(同時檢視作業系統是否存在,因為Oracle並不關心該目錄是否存在,如果不存在,則出錯)

select * from dba_directories;

三、給scott使用者賦予在指定目錄的操作許可權,最好以system等管理員賦予。

grant read,write on directory dpdata1 to scott;

四、匯出資料

1)按使用者導

expdp  schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1;

2)並行程式parallel

expdp  directory=dpdata1 dumpfile=scott3.dmp parallel=40 job_name=scott3

3)按表名導

expdp  TABLES=emp,dept dumpfile=expdp.dmp DIRECTORY=dpdata1;

4)按查詢條件導

expdp  directory=dpdata1 dumpfile=expdp.dmp Tables=emp query='WHERE deptno=20';

5)按表空間導

expdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=temp,example;

6)導整個資料庫

expdp system/manager DIRECTORY=dpdata1 DUMPFILE=full.dmp FULL=y;

五、還原資料

1)導到指定使用者下

impdp scott/tiger DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=scott;

2)改變表的owner

impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp TABLES=scott.dept REMAP_SCHEMA=scott:system;

3)匯入表空間

impdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=example;

4)匯入資料庫

impdb system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=y;

5)追加資料

impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION



資料泵impdp引數:

    1.REMAP_DATAFILE
        該選項用於將源資料檔名轉變為目標資料檔名,在不同平臺之間搬移表空間時需要該選項.
        REMAP_DATAFILE=source_datafie:target_datafile 

    2.REMAP_SCHEMA
        該選項用於將源方案的所有物件裝載到目標方案中.
        REMAP_SCHEMA=source_schema:target_schema

    3.REMAP_TABLESPACE
        將源表空間的所有物件匯入到目標表空間中
        REMAP_TABLESPACE=source_tablespace:target:tablespace 

    4.REUSE_DATAFILES
        該選項指定建立表空間時是否覆蓋已存在的資料檔案.預設為N
        REUSE_DATAFIELS={Y | N} 

    5.SKIP_UNUSABLE_INDEXES
        指定匯入是是否跳過不可使用的索引,預設為N
 
    6,sqlfile  引數允許建立DDL 指令碼檔案
        impdp scott/tiger directory=dump_scott dumpfile=a1.dmp sqlfile=c.sql
        預設放在directory下,因此不要指定絕對路徑
 
    7.STREAMS_CONFIGURATION
        指定是否匯入流後設資料(Stream Matadata),預設值為Y. 

    8.TABLE_EXISTS_ACTION
        該選項用於指定當表已經存在時匯入作業要執行的操作,預設為SKIP
        TABBLE_EXISTS_ACTION={SKIP | APPEND | TRUNCATE | REPLACE } 
        當設定該選項為SKIP時,匯入作業會跳過已存在表處理下一個物件;
        當設定為APPEND時,會追加資料;
        當設定為TRUNCATE時,匯入作業會截斷表,然後為其追加新資料;
        當設定為REPLACE時,匯入作業會刪除已存在表,重建表並追加資料;

        注意,TRUNCATE選項不適用與簇表和NETWORK_LINK選項

從一個使用者的一個表空間匯入到另一個使用者的另一個表空間
impdp username/passwd directory=expdptemp dumpfile=2015.11.24.dmp remap_schema=training_zj:hagen.zj REMAP_TABLESPACE=training:zhejiang.jianli

關於空表exp不會匯出的問題

1、Oracle11g預設對空表不分配segment,故使用exp匯出Oracle11g資料庫時,空表不會匯出。


2、設定deferred_segment_creation 引數為FALSE後,無論是空表還是非空表,都分配segment。

   在sqlplus中,執行如下命令:

   SQL>alter system set deferred_segment_creation=false;

   檢視:
   SQL>show parameter deferred_segment_creation;


   該值設定後只對後面新增的表產生作用,對之前建立的空表不起作用。


3、可以使用手工為空表分配Extent的方式,來解決匯出之前建立的空表的問題。說明如下:


3.1 使用ALLOCATE EXTENT的說明


   使用ALLOCATE EXTENT可以為資料庫物件分配Extent。其語法如下:

   -----------
   ALLOCATE EXTENT { SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer }
   -----------

   可以針對資料表、索引、物化檢視等手工分配Extent。

   ALLOCATE EXTENT使用樣例:
 
    ALLOCATE EXTENT 
    ALLOCATE EXTENT(SIZE integer [K | M]) 
    ALLOCATE EXTENT(DATAFILE 'filename') 
    ALLOCATE EXTENT(INSTANCE integer) 
    ALLOCATE EXTENT(SIZE integer [K | M]   DATAFILE 'filename') 
    ALLOCATE EXTENT(SIZE integer [K | M]   INSTANCE integer) 
   

    針對資料表操作的完整語法如下:

   -----------
    ALTER TABLE [schema.]table_name ALLOCATE EXTENT [({ SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer})]
   -----------


    故,需要構建如下樣子簡單的SQL命令:

   -----------
   alter table aTabelName allocate extent
   -----------

 

3.2 構建對空表分配空間的SQL命令,


    查詢當前使用者下的所有空表(一個使用者最好對應一個預設表空間)。命令如下:

   -----------
   SQL>select table_name from user_tables where NUM_ROWS=0;
   -----------


   根據上述查詢,可以構建針對空表分配空間的命令語句,如下:

   -----------
   SQL>Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
   -----------


   批次輸出上述生成的SQL語句,建立C:\createsql.sql,其內容如下:

   -----------
   set heading off;
   set echo off;
   set feedback off;
   set termout on;
   spool C:\allocate.sql;
   Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
   spool off;
   -----------


   執行C:\createsql.sql,命令如下:
   -----------
   SQL>@ C:\createsql.sql;
   -----------

   執行完畢後,得到C:\allocate.sql檔案。

   開啟該檔案會看到,已經得到對所有空表分配空間的命令SQL語句。


3.4 執行SQL命令,對空表分配空間:

   執行C:\allocate.sql,命令如下:
   -----------
   SQL>@ C:\allocate.sql;
   -----------
  
   執行完畢,表已更改。


3.4 此時執行exp命令,即可把包括空表在內的所有表,正常匯出。

 

另外:Oracle11g中,對密碼是大小寫敏感的,即密碼中的字母是區分大小寫的。

      在Oracle10g中及以前,密碼中的字母大小寫無所謂

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

相關文章