7 x 24 在线支持!
dbms_rowidパッケージを使用して、破損しているブロックのデータを読み飛ばす方法(R8.0以降)
ORACLEデータベース によくあるエラ の解決策
プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:[email protected]
[概要]
dbms_rowidパッケージを使用して、破損ブロックのデータを読み飛ばす方法
[対象リリース]
Oracle8 Database Release(8.0) 以降のバージョン
[対象プラットフォーム]
すべてのプラットフォーム
[詳細]
破損ブロックを含む表において、破損ブロックのデータをrowid指定で
読み飛ばし、正常なブロックのデータのみを取り出す手順を、以下に
記述します。
SQL> select count(*) from test;
select count(*) from test
*
1行でエラーが発生しました。
ORA-01578: ファイル番号 5,ブロック番号
73156でOracleデータ・ブロックに障害が発生しました。
ORA-01110: データ・ファイル 5 :
/home2/ora8174/app/oracle/oradata/ora8174/users01.dbf
例: file=5 blocknum=73156 をSKIPしたい場合
1. 破損しているオブジェクトを特定して下さい。
** file_idは、ORA-1110と共に出力されている番号(絶対ファイル番号)を
使用してください。
例)
SQL> SELECT tablespace_name, relative_fno,
segment_type, owner, segment_name, partition_name
FROM dba_extents
WHERE file_id = 5
AND 73156 between block_id and block_id + blocks -1 ;
TABLESPACE_NAME RELATIVE_FNO SEGMENT_TYPE
------------------------------ ------------ ------------------
OWNER
------------------------------
SEGMENT_NAME
---------------------------------------------------------------
PARTITION_NAME
------------------------------
USERS 5 TABLE
SCOTT
TEST
2. data_object_idを特定して下さい。
例)
SQL> SELECT data_object_id
FROM dba_objects
WHERE object_name = 'TEST'
AND owner = 'SCOTT';
** 1の結果が、パーティションに属するブロックであった場合には、
以下のSELECT文をご使用下さい。
例) SCOTT.TEST表のパーティション SALES_Q3のブロックであった場合
SQL> SELECT data_object_id
FROM dba_objects
WHERE object_name = 'TEST'
AND owner = 'SCOTT'
AND subobject_name = 'SALES_Q3';
DATA_OBJECT_ID
--------------
173599
3. 破損ブロック内の先頭のrowidを、以下のプロシージャで確認します。
dbms_rowid.rowid_create(1, data_object_id,relative_fno,block_id,0)
例)
SQL> select dbms_rowid.rowid_create(1,173599,5,73156,0) from dual;
DBMS_ROWID.ROWID_C
------------------
AAAqYfAAFAAAR3EAAA
** 第3引数 relative_fnoには、手順1で確認した相対ファイル番号(relative_fno)
を使用してください。
4. 破損ブロックの次のブロックに格納された 先頭のrowidを、以下の
プロシージャで 確認します。
dbms_rowid.rowid_create(1, data_object_id, relative_fno, block_id + 1, 0)
例)
SQL> select dbms_rowid.rowid_create(1,173599,5,73157,0) from dual;
DBMS_ROWID.ROWID_C
------------------
AAAqYfAAFAAAR3FAAA
** 第3引数 relative_fnoには、手順1で確認した相対ファイル番号(relative_fno)
を使用してください。
5. 破損ブロックの先頭rowidよりも 前のrowidを保持するデータを
一時的な表に格納します。
例)
SQL> CREATE TABLE TEST_TEMP AS
SELECT /*+ ROWID(A) */ * FROM SCOTT.TEST A
WHERE rowid < 'AAAqYfAAFAAAR3EAAA';
** 1の結果が、パーティションに属するブロックで、かつ 問題の
パーティションのデータから、破損ブロック以外のデータを
抽出されたい場合には 以下のSQL文を実行して下さい。
SQL> CREATE TABLE TEST_TEMP AS
SELECT /*+ ROWID(A) */ *
FROM SCOTT.TEST PARTITION (SALES_Q3) A
WHERE rowid < 'AAAqYfAAFAAAR3EAAA';
6. 破損ブロックの最後のrowidよりも 後のrowid(破損ブロックの次の
ブロックの先頭rowid)を保持するデータを、一時的な表に格納します。
例)
SQL> INSERT INTO TEST_TEMP
SELECT /*+ ROWID(A) */ * FROM SCOTT.TEST A
WHERE rowid >= 'AAAqYfAAFAAAR3FAAA';
SQL> commit;
** 1の結果が、パーティションに属するブロックで、かつ 問題の
パーティションのデータのみから、破損ブロック以外のデータを
抽出されたい場合には 以下のSQL文を実行して下さい。
SQL> INSERT INTO TEST_TEMP
SELECT /*+ ROWID(A) */ *
FROM SCOTT.TEST PARTITION (SALES_Q3) A
WHERE rowid >= 'AAAqYfAAFAAAR3FAAA';

沪公网安备 31010802001377号