Email: service@parnassusdata.com 7 x 24 online support!

    You are here

    • You are here:
    • Home > Blogs > PDSERVICE's blog > TRANSPORTABLE TABLESPACEの使用がDATA DICTIONARYを破壊する(KROWN:11611)

TRANSPORTABLE TABLESPACEの使用がDATA DICTIONARYを破壊する(KROWN:11611)

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