oracle11g 資料庫匯出報“ EXP-00003: 未找到段 (0,0) 的儲存定義”錯誤的解決方案

skyin_1603發表於2017-07-14

匯出oracle11.2.0.2的伺服器的資料時,報“EXP-00003: 未找到段 (0,0) 的儲存定義”錯誤。初步分析是由於資料表是空表導致該問題。

Oracle 11G在用EXPORT匯出時,空表不能匯出11GR2中有個新特性,當表無資料時,不分配segment,以節省空間
----解決方法:
一、 insert一行,再rollback就產生segment了:
#該方法是在在空表中插入資料,再刪除,則產生segment。匯出時則可匯出空表。

二、 設定deferred_segment_creation 引數:
--該引數值預設是TRUE,當改為FALSE時,無論是空表還是非空表,都分配segment。修改SQL語句:
alter system setdeferred_segment_creation=false scope=both;
 
#需注意的是:該值設定後對以前匯入的空表不產生作用,仍不能匯出,只能對後面新增的表產生作用。如需匯出之前的空表,只能用第一種方法。

三、 用以下這句查詢空表:
select'alter table '||table_name||' allocate extent;' from user_tables wherenum_rows=0;
#把查詢結果匯出,執行匯出的語句,強行修改segment值,然後再匯出即可匯出空表

--可以透過以下方式生成資料庫更新的sql語句:
在pl/sql的命令視窗中執行
set heading off;
   set echo off;
   set feedback off;
   set termout on;
   spool C:\alterTableSql.sql;
   Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
   spool off;
#自動將空表更新sql生成到C盤根目錄的alterTableSql.sql檔案中。然後執行該sql檔案更新資料庫。
 

Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
也可以換成:
Select 'alter table '||table_name||' allocate extent;' from user_tables where segment_created= 'NO' ;  

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

相關文章