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命令,即可把包括空表在內的所有表,正常匯出。
Linux平台下的Oracle自動備份案例(使用exp工具)
exp/IMP遷移資料庫的時候注釋亂碼解決方案
Linux下匯出資料庫dmp檔案時exp-00091錯誤
淺談Oracle的exp備份問題
EXP/IMP遷移資料