Email: [email protected] 7 x 24 online support!
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

沪公网安备 31010802001377号