7 x 24 在线支持!
TRANSPORTABLE TABLESPACEの使用がDATA DICTIONARYを破壊する(KROWN:11611)
[Problem] TRANSPORTABLE TABLESPACEの使用により以下の問題が発生する可能性があります。 プラグイン後、数週間でORA-600[15260]発生 プラグイン時、ORA-600[kkdlson2]発生 EXPORTがEXP-8,ORA-1455にて失敗 [Cause] TRANSPORTABLE TABLESPACE OPTIONでEXPORTされたメタデータが不正なオブジェクト番号を 格納している場合があります。そのようなメタデータをIMPORTすると、TARGET DATABASEに 格納されている、"next object number"が不正な値に設定されてしまう為に発生します。 [Action] 申し訳ありませんが、この問題は8.1.5で発生する不具合に相当します。 TRANSPORTABLE TABLESPACEをご使用になられる場合には以下の確認をお願いいたします。 <EXPORT実行前後のDATABASEのチェック> 元データベース上にてメタデータのEXPORT直前・直後に次のSQL文を実行してください SELECT decode(trunc(dataobj#/65536), 0, 'Export should be OK', decode( mod(trunc(dataobj#/65536),2) , 0, '**BAD EXPORT (1)', '**BAD EXPORT (2)' ) ) "CanITransport" FROM SYS.OBJ$ where NAME='_NEXT_OBJECT' ; "**BAD EXPORT (1)" NG:表領域が負数のオブジェクト番号付きでEXPORTされます。 "**BAD EXPORT (2)" NG:表領域が小さすぎるオブジェクト番号付きでEXPORTされます。 "Export should be OK" OK:適正なオブジェクト番号付きでEXPORTされます。 <EXPORTファイルのチェック> IMPORT SHOW=Y にて確認 例)imp show=Y log=CHECKBUG.LOG file=EXPFILE.DMP transport_tablespace=y CHECKBUG.LOGを確認して、beginImportを含む行を探し出し、6番目の引数(MAXIMUM-OBJECT-ID)が 負数でないことを確認してください。 例) "BEGIN sys.dbms_plugts.beginImport ( '8.1.5.0.0',1,NULL,NULL,'NULL',-16417,1839632,1); END;" 第6引数が負数。ゆえに、このEXPORTファイルは他データベースにIMPORTされてはなりません。 第6引数が正数であっても、さらにOBJNO_REUSEもMAXIMUM-OBJECT-ID未満でなければなりません。 例) "BEGIN sys.dbms_plugts.beginImport ( '8.1.5.0.0',1,NULL,NULL,'NULL',12345,1839632,1); END;" かつ、"STORAGE(SEG_FILE 8 SEG_BLOCK 2 OBJNO_REUSE 65537 INITIAL 1024" OBJNO_REUSE=65537 > MAXIMUM-OBJECT-ID=12345、ゆえにEXPORTファイルは不正となります。 <TRANSPORTABLE TABLESPACE OPTIONでEXPORTしたFILEを既にIMPORTしてしまった場合> 次のスクリプトをINTERNAL/SYSDBAユーザにて実行して下さい。 "Database object IDs look OK"と出力されれば問題ございません。 "** Corrective action is required by Oracle Support"と出力された場合、 カスタマーサポートセンターまでご連絡ください。 =========================================================================== REM - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - - - REM CHECKTARGET.SQL REM REM This script should be used in conjunction with Document 76670.1 REM to check a target database for the side effects of Bug 970640 REM REM For Oracle 8.1 ONLY REM To be run connected INTERNAL or as a SYSDBA user REM REM SPOOL THE OUTPUT OF THIS SCRIPT REM SET SERVEROUTPUT ON REM DECLARE -- LIMIT number:=2147483648; /* Highest sensible object id */ MAXOBJ number:=4294950911; /* Max ever object id */ next_id number; /* Current NEXT object_id */ high_id number; /* Current Highest object_id */ best_id number; /* Current Highest Object_id below LIMIT */ badcnt number:=0; /* Number of objects with ID above LIMIT */ dups boolean:=false; /* True if duplicate dataobj# */ -- -- Cursor to get information on OBJECTs with ID above LIMIT -- CURSOR bad_objects IS SELECT greatest(object_id, data_object_id) ID, OBJECT_TYPE,OWNER, OBJECT_NAME, SUBOBJECT_NAME FROM dba_objects WHERE object_id>=LIMIT OR data_object_id>=LIMIT ORDER BY 3,4,5 ; -- -- Cursor to check for DUPLICATE dataobj# which are not in a cluster -- CURSOR Duplicates IS select obj# from obj$ o where o.dataobj# in ( select dataobj# from obj$ g group by dataobj# having count(*) >1) and not exists (select 1 from clu$ c where c.dataobj#=o.dataobj#) ; CURSOR ObjDesc(ID number) IS select * from dba_objects where object_id=id; -- BEGIN dbms_output.enable(100000); -- dbms_output.put_line('Checking target database for effects of Bug 970640'); -- -- First check for DUPLICATE dataobj# -- FOR D in Duplicates LOOP IF not dups THEN dbms_output.put_line('.'); dbms_output.put_line('** Warning: Objects exist with duplicate DATAOBJ#'); dbms_output.put_line('** These objects should be checked'|| ' to ensure they are NOT in the same tablespace'); dbms_output.put_line('.'); dups:=true; END IF; FOR O in ObjDesc(D.obj#) LOOP dbms_output.put('. '||O.data_object_id||' '); dbms_output.put(O.owner||'.'||O.object_name||' '||O.subobject_name); dbms_output.put_line(' ('||O.object_type||')'); END LOOP; END LOOP; -- -- Get the NEXT OBJECT ID from the dictionary -- SELECT dataobj# INTO next_id FROM obj$ WHERE name='_NEXT_OBJECT'; -- -- Get the highest OBJECT ID that looks sensible (below 2Gb) -- SELECT max(id) INTO best_id FROM (SELECT max(dataobj#) ID FROM obj$ WHERE dataobj#<LIMIT and name!='_NEXT_OBJECT' UNION ALL SELECT max(obj#) ID FROM obj$ WHERE obj#<LIMIT and name!='_NEXT_OBJECT' ) ; -- -- Get the actual highest object ID, whether good or bad -- SELECT max(greatest(obj#,dataobj#)) INTO high_id FROM obj$ WHERE name!='_NEXT_OBJECT'; -- -- Output findings -- dbms_output.put_line('.'); dbms_output.put_line('Base data:'); dbms_output.put_line('. NEXT OBJECT Id: '||next_id); dbms_output.put_line('. HIGHEST OBJECT Id: '||high_id); dbms_output.put_line('. BEST OBJECT Id: '||best_id); -- -- Comment on findings -- IF next_id>=LIMIT THEN dbms_output.put_line('.'); dbms_output.put_line('NEXT OBJECT Id much too high'); END IF; -- IF high_id>=LIMIT THEN dbms_output.put_line('.'); dbms_output.put_line('The objects listed below have very high object ids.'); dbms_output.put_line('Determine if they can be dropped/rebuilt:'); FOR R in bad_objects LOOP dbms_output.put('. '||R.owner||'.'||R.object_name||' '||R.subobject_name); dbms_output.put_line(' ('||R.object_type||')'); badcnt:=badcnt+1; END LOOP; END IF; -- IF high_id>=next_id THEN dbms_output.put_line('.'); dbms_output.put_line('Some objects have IDs above "NEXT OBJECT"'); END IF; -- IF high_id>=LIMIT OR high_id>=next_id OR next_id>=LIMIT THEN dbms_output.put_line('.'); dbms_output.put_line('** Corrective action is required by Oracle Support'); dbms_output.put_line('** Information below for SUPPORT only'); dbms_output.put_line('** Best option:'); dbms_output.put('. '); if badcnt>0 then dbms_output.put('DROP the above '||badcnt||' object/s and '); end if; dbms_output.put_line('RESET to '||(best_id+1)); if high_id>=LIMIT THEN dbms_output.put_line('** Second option:'); dbms_output.put_line('. RESET to '||(high_id+1)||' leaving only '|| (maxobj-high_id-2)||' objects before DB is in trouble'); end if; dbms_output.put_line('.'); dbms_output.put('** Remember to RE-RUN this script IMMEDIATELY '); dbms_output.put_line('prior to any corrective action'); ELSE IF not dups THEN dbms_output.put_line('** Database object IDs look OK'); END IF; END IF; IF dups THEN dbms_output.put_line('.'); dbms_output.put_line('** Remember to check the DUPLICATES above'); END IF; END; / REM REM - - - - - - - - - - - - - cut here - - - - - - - - - - - - - - - - - - REM =========================================================================== [Workaround] EXPORT FILEが不正と判断された場合は、通常のEXPORT/IMPORTにてデータの移行を行なって 下さい。@SNL_DATE=0002