今天在嘗試用9204的EXP匯出10203資料的時候,出現了EXP-3錯誤:EXP-00003: no storage definition found for segment(41, 6024)
查詢了一下METALINK,發現9205版本之前的EXP用戶端,匯出9205以上版本的資料時,如果表中包含LOB欄位,或者表中的EXTENT超過一個,則會導致EXP-00003錯誤。
造成問題的原因是由於Oracle在9205及以上版本中,解決了一個查詢DBA_SEGMENTS的BYTES/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 9205的RAC上遇見過,直接修改的ext9tune的view解決了問題,呵呵!