1. 程式人生 > >ORACLE11g匯入匯出資料

ORACLE11g匯入匯出資料

匯出:exp 使用者名稱/密碼@ip:埠號/例項名 file=路徑

匯入:imp user/[email protected]/orcl fromuser=sinoep touser=sinoep file=e:\sinoepdata.dmp

一、EXP: 有三種主要的方式(完全、使用者、表)
1、完全:
EXP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
如果要執行完全匯出,必須具有特殊的許可權
2、使用者模式:
EXP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC
這樣使用者SONIC的所有物件被輸出到檔案中。
3、表模式:
EXP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC)
這樣使用者SONIC的表SONIC就被匯出
二、IMP: 具有三種模式(完全、使用者、表)
1、完全:
IMP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
2、使用者模式:
IMP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP FROMUSER=SONIC TOUSER=SONIC
這樣使用者SONIC的所有物件被匯入到檔案中。必須指定FROMUSER、TOUSER引數,這樣才能匯入資料。
3、表模式:
EXP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC)
這樣使用者SONIC的表SONIC就被匯入。

三、Oracle 11G在用EXP 匯出時,空表不能匯出解決

11G中有個新特性,當表無資料時,不分配segment,以節省空間
解決方法:
1、insert一行,再rollback就產生segment了。
該方法是在在空表中插入資料,再刪除,則產生segment。匯出時則可匯出空表。
2、設定deferred_segment_creation 引數
show parameter deferred_segment_creation

NAME TYPE VALUE

deferred_segment_creation boolean TRUE
SQL> alter system set deferred_segment_creation=false;

系統已更改。

SQL> show parameter deferred_segment_creation

NAME TYPE VALUE

deferred_segment_creation boolean FALSE

該引數值預設是TRUE,當改為FALSE時,無論是空表還是非空表,都分配segment。
需注意的是:該值設定後對以前匯入的空表不產生作用,仍不能匯出,只能對後面新增的表產生作用。如需匯出之前的空表,只能用第一種方法。
搞了我好久,最後查到這個方法。
先查詢一下當前使用者下的所有空表
select table_name from user_tables where NUM_ROWS=0;
用以下這句查詢空表
select ‘alter table ‘||table_name||’ allocate extent;’ from user_tables where num_rows=0
把查詢結果匯出,執行匯出的語句
’ALTERTABLE’||TABLE_NAME||’ALLOCATEEXTENT;’

alter table AQAQ_MEM_MC_H allocate extent;
alter table AQAQ_MEM_MC_G allocate extent;
alter table AQAQ_MEM_MC_I allocate extent;
alter table AQAQPROPTABLETallocateextent;altertableAQ_AQ_PROP_TABLE_H allocate extent;
alter table AQAQPROPTABLEGallocateextent;altertableAQ_AQ_PROP_TABLE_I allocate extent;
alter table AQKUPCDATAPUMP_QUETAB_T allocate extent;
alter table AQKUPCDATAPUMP_QUETAB_H allocate extent;
alter table AQKUPCDATAPUMP_QUETAB_G allocate extent;
alter table AQKUPCDATAPUMP_QUETAB_I allocate extent;
‘ALTERTABLE’||TABLE_NAME||’ALLOCATEEXTENT;’

alter table AQSYSSERVICE_METRICS_TAB_T allocate extent;
alter table AQSYSSERVICE_METRICS_TAB_H allocate extent;
alter table AQSYSSERVICE_METRICS_TAB_G allocate extent;
alter table AQSYSSERVICE_METRICS_TAB_I allocate extent;
然後再執行
exp 使用者名稱/密碼@資料庫名 file=/home/oracle/exp.dmp log=/home/oracle/exp_smsrun.log

成功!