通常使用pl/sql對數據庫表進行導入導出的時候會分3中方法, 網上也有相關的導入導入方式,但小弟實在不會用,只會用一種,眼下就和各位童鞋分享一下;web
導出表結構:sql
這種方式使用pl/sql的tools下的「導出對象功能」,能夠單表打出,也能夠多表導出。但只能導出表結構,不能導出表中已有的數據。且在導入時,要是用pl/sql的命令符進行導入。數據庫
若是是不一樣用戶的表結構移植,就須要對導出的對象文件中的用戶進行修改(改爲要導入的用戶)才能使用,不然會報不存在的視圖異常。oracle
導出表內數據:spa
可使用查詢數據表中的相似餅狀圖的一個圖標,‘導出查詢結果’ 該功能能夠導出單表的數據內容,,導入時要使用命令提示符才能夠。orm
另:若是使用dmp的文件導出方式,則可以導出表的結構和原表的內容, 是一個很是好的方式,但它不能導出存儲過程。對象
若是你的表是空的, 從未添加過數據那麼使用dmp方式導出時,這種表就會包錯,不會導出,解決辦法有:it
11G中有個新特性,當表無數據時,不分配segment,以節省空間io
解決方法:table
一、insert一行,再rollback就產生segment了。
該方法是在在空表中插入數據,再刪除,則產生segment。導出時則可導出空表。
二、設置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 AQ$_AQ$_MEM_MC_H allocate extent;
alter table AQ$_AQ$_MEM_MC_G allocate extent;
alter table AQ$_AQ$_MEM_MC_I allocate extent;
alter table AQ$_AQ_PROP_TABLE_T allocate extent;
alter table AQ$_AQ_PROP_TABLE_H allocate extent;
alter table AQ$_AQ_PROP_TABLE_G allocate extent;
alter table AQ$_AQ_PROP_TABLE_I allocate extent;
alter table AQ$_KUPC$DATAPUMP_QUETAB_T allocate extent;
alter table AQ$_KUPC$DATAPUMP_QUETAB_H allocate extent;
alter table AQ$_KUPC$DATAPUMP_QUETAB_G allocate extent;
alter table AQ$_KUPC$DATAPUMP_QUETAB_I allocate extent;
'ALTERTABLE'||TABLE_NAME||'ALLOCATEEXTENT;'
-----------------------------------------------------------
alter table AQ$_SYS$SERVICE_METRICS_TAB_T allocate extent;
alter table AQ$_SYS$SERVICE_METRICS_TAB_H allocate extent;
alter table AQ$_SYS$SERVICE_METRICS_TAB_G allocate extent;
alter table AQ$_SYS$SERVICE_METRICS_TAB_I allocate extent;
而後再執行
exp 用戶名/密碼@數據庫名 file=/home/oracle/exp.dmp log=/home/oracle/exp_smsrun.log
成功!