2012年4月25日 星期三

Oracle XP-00003: no storage definition found for segment


今天在嘗試用9204EXP匯出10203資料的時候,出現了EXP-3錯誤:EXP-00003: no storage definition found for segment(41, 6024)

查詢了一下METALINK,發現9205版本之前的EXP用戶端,匯出9205以上版本的資料時,如果表中包含LOB欄位,或者表中的EXTENT超過一個,則會導致EXP-00003錯誤。

造成問題的原因是由於Oracle9205及以上版本中,解決了一個查詢DBA_SEGMENTSBYTES/EXTENTS/BLOCKS列速度緩慢的錯誤。而解決這個bug的代價就是9204及以下版本在匯出高版本資料時會碰到EXP-3這個錯誤。

具體的相關資訊可以查詢METALINK

Bug 2948717 : Queries against DBA_SEGMENTS can be slow accessing BYTES/BLOCKS/EXTENTS columns

Bug 3593227 "EXP-3 WHEN EXPORTING A TABLE WITH MORE THAN 1 EXTENT USING EXP BELOW 9.2.0.5"

Bug 3784697 "EXPORT OF LOB FROM 9205 WITH PRE-9205 EXP GIVES EXP-3 (NO STORAGE DEF FOUND)"

解決問題的方法到是不算複雜:

如果匯出不包含LOB欄位,那麼可以將EXP語句中的COMPRESS參數設置為Y,重新執行匯出即可。

如果包含LOB欄位,或者上面的方法無效,那麼需要對匯出庫修改exu9tne視圖。在匯出完成後,再將該視圖恢復。
如果包含LOB,或者必須設置COMPRESS=Y,可以先用SYS修改exu9tne視圖,再匯出結束後,再將其恢復。
oracle$sqlplus

SQL> SET LONG 10000
SQL> select dbms_metadata.get_ddl('VIEW', 'EXU9TNE') FROM DUAL;

DBMS_METADATA.GET_DDL('VIEW','EXU9TNE')
------------------------------------------------------------------------------

CREATE OR REPLACE FORCE VIEW "SYS"."EXU9TNE" ("TSNO", "FILENO", "BLOCKNO", "LENGTH") AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$
WHERE ext# = 1


SQL> CREATE OR REPLACE VIEW EXU9TNE (TSNO, FILENO, BLOCKNO, LENGTH) AS
2 SELECT TS#, SEGFILE#, SEGBLOCK#, LENGTH
3 FROM SYS.UET$
4 WHERE EXT# = 1
5 UNION ALL
6 SELECT * FROM EXU9TNEB;

View created.

SQL> HOST
exp yangtk/yangtk@yangtk file=test10203.dmp buffer=20480000 compress=n
[oracle@demo2 oracle]$ exit
exit

SQL> CREATE OR REPLACE VIEW EXU9TNE (TSNO, FILENO, BLOCKNO, LENGTH) AS
2 SELECT TS#, SEGFILE#, SEGBLOCK#, LENGTH
3 FROM SYS.UET$
4 WHERE EXT# = 1
5 ;

View created.

SQL> exit


以前這個問題遇見在一個windows 9205RAC上遇見過,直接修改的ext9tuneview解決了問題,呵呵!