データベース
 Computer >> コンピューター >  >> プログラミング >> データベース

Oracleデータベースのブロック破損を修復する

この投稿では、Oracle®データベース内のシステムデータファイルを含むデータファイルの複数または単一ブロックの破損を修復する方法について説明します。ブロックの破損は、データベースの停止の一般的な原因です。

データベースブロックは、その内容がOracleデータベースが検出するものと異なる場合に破損します。ブロックの破損が防止または修復されない場合、破損によってデータベースがダウンし、主要なビジネスデータが失われる可能性があります。

これは、本番データベースで直面して修正する必要のあるリアルタイムの問題の1つです。

ブロックの破損を見つけて修正する

次の画像は、ブロックが破損している可能性を示しています。

Oracleデータベースのブロック破損を修復する

画像ソース :https://blog.toadworld.com/2017/12/01/block-corruption-in-an-oracle-database

破損を見つける

破損を見つけるには、次のコマンドを実行します。

SQL> select * from V$DATABASE_BLOCK_CORRUPTION;

FILE#    BLOCK#    BLOCKS    CORRUPTION_CHANGE#  CORRUPTION
----- ---------- ----------  ------------------  ----------
 352     173191      9               0            ALL ZERO

SQL> SELECT FILE_ID,RELATIVE_FNO,FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES WHERE FILE_ID=352;

 FILE_ID   RELATIVE_FNO   FILE_NAME                                          TABLESPACE_NAME
---------- ------------ -------------------------------------------------- ------------------
    352        352      /u01/apps_st/samusxxxxxxxx_data2/system09.dbf              SYSTEM

SQL> SELECT owner, segment_name, segment_type FROM dba_extents WHERE RELATIVE_FNO = 352 AND Block_id BETWEEN 173191 AND 173191 + blocks - 1;

OWNER      SEGMENT_NAME    SEGMENT_TYPE
-------- ---------------  ------------------
SYS         I_COL3          INDEX
SYS         C_OBJ#          CLUSTER

:この場合、SYSオブジェクトセグメントI_COL3のブロックが破損しています。 dbvによって報告された破損したブロック コマンドは、dba_free_spaceで無料として表示されます ビュー。

ブロックを解放する

ファイル352のブロックを解放するには、次のコマンドを実行します。

SQL> select * from V$DATABASE_BLOCK_CORRUPTION;

FILE#    BLOCK#    BLOCKS    CORRUPTION_CHANGE#  CORRUPTION
----- ---------- ----------  ------------------  ----------
 352     173191      9               0            ALL ZERO

SQL> Select * from dba_free_space where file_id =352 and 173191 between block_id and block_id + blocks -1;

TABLESPACE_NAME   FILE_ID  BLOCK_ID  BYTES    BLOCKS   RELATIVE_FNO
---------------   -------  --------  -----  ---------- ------------
   SYSTEM           352     173191   73728       9        352
ブロックを強制的にクリア

ブロックが解放されたら、次のコマンドを使用して、破損したブロックを強制的にクリアできます。これは、セグメントの一部ではない破損したブロックのフォーマットとも呼ばれます。

1。ユーザーを作成し、ユーザーにデータベースへのアクセスを許可します。
create user Scott identified by password default tablespace SYSTEM;
grant resource, connect, create table, create trigger to Scott;
2。データファイルに対して破損したブロックを特定します
[Thu Nov 17 11:59:19 orbdev@samusxxxxxxxx:~ ] $ dbv file='/mnt/apps_st/samusxxxxxxxx_data2/system09.dbf' userid=sys/xxxxx

DBVERIFY: Release 11.2.0.4.0 - Production on Thu Nov 17 11:59:21 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting: FILE = /mnt/apps_st/samusxxxxxxxx_data2/system09.dbf
Page 173191 is marked corrupt
Corrupt block relative dba: 0x5802a487 (file 352, block 173191)
Completely zero block found during dbv:

Page 173192 is marked corrupt
Corrupt block relative dba: 0x5802a488 (file 352, block 173192)
Completely zero block found during dbv:

Page 173193 is marked corrupt
Corrupt block relative dba: 0x5802a489 (file 352, block 173193)
Completely zero block found during dbv:

Page 173194 is marked corrupt
Corrupt block relative dba: 0x5802a48a (file 352, block 173194)
Completely zero block found during dbv:

Page 173195 is marked corrupt
Corrupt block relative dba: 0x5802a48b (file 352, block 173195)
Completely zero block found during dbv:

Page 173196 is marked corrupt
Corrupt block relative dba: 0x5802a48c (file 352, block 173196)
Completely zero block found during dbv:

Page 173197 is marked corrupt
Corrupt block relative dba: 0x5802a48d (file 352, block 173197)
Completely zero block found during dbv:

Page 173198 is marked corrupt
Corrupt block relative dba: 0x5802a48e (file 352, block 173198)
Completely zero block found during dbv:

Page 173199 is marked corrupt
Corrupt block relative dba: 0x5802a48f (file 352, block 173199)
Completely zero block found during dbv:

DBVERIFY - Verification complete

Total Pages Examined         : 917504
Total Pages Processed (Data): 253735
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 335744
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 375
Total Pages Processed (Seg)  : 17
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 327624
Total Pages Marked Corrupt   : 9
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 3412538527 (1421.3412538527)

[Thu Nov 17 12:00:13 orbdev@samusxxxxxxxx:~ ] $
3。空き容量を探す
Select * from dba_free_space where file_id= <Absolute file number> and <corrupted block number> between block_id and block_id + blocks -1;


SQL> Select * from dba_free_space where file_id=352 and 173191 between block_id and block_id + blocks -1;

TABLESPACE_NAME   FILE_ID   BLOCK_ID     BYTES    BLOCKS   RELATIVE_FNO
--------------- ---------- ---------- ---------- --------- ------------
SYSTEM              352     173196      73728        9          352
4。最初に破損したブロックを再フォーマットします

破損したすべてのブロックが再フォーマットされるまで、手順4を繰り返します。

create table scott.s (n number,c varchar2(4000)) nologging tablespace SYSTEM;

select owner,table_name,tablespace_name from dba_tables where table_name='S';

SQL> CREATE OR REPLACE TRIGGER corrupt_trigger
   AFTER INSERT ON scott.s
   REFERENCING OLD AS p_old NEW AS new_p
   FOR EACH ROW
   DECLARE
   corrupt EXCEPTION;
   BEGIN
   IF (dbms_rowid.rowid_block_number(:new_p.rowid)=&blocknumber)
     and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=&filenumber) THEN
     RAISE corrupt;
   END IF;
   EXCEPTION
   WHEN corrupt THEN
     RAISE_APPLICATION_ERROR(-20000, 'Corrupt block has been formatted');
   END;
 /

Enter value for blocknumber: 173191
old   8:   IF (dbms_rowid.rowid_block_number(:new_p.rowid)=&blocknumber)
new   8:   IF (dbms_rowid.rowid_block_number(:new_p.rowid)=173191)

Enter value for filenumber: 352
old   9:  and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=&filenumber) THEN
new   9:  and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=352) THEN

Trigger created.

Select BYTES/1024/1024 from dba_free_space where file_id=352 and 173191 between block_id and block_id + blocks -1;

72K

SQL> BEGIN
   FOR i IN 1..100000 LOOP
      EXECUTE IMMEDIATE 'alter table scott.s allocate extent (DATAFILE '||'''/mnt/apps_st/samusxxxxxxxx_data2/system09.dbf''' ||'SIZE 72K)';
   END LOOP;
END;
/

SQL> BEGIN
  FOR i IN 1..1000000 LOOP
     INSERT /*+ APPEND */ INTO scott.s select i, lpad('REFORMAT',3092, 'R') from dual;
  commit ;
  END LOOP;
END;
/

SQL> Select * from v$database_block_corruption;

no rows selected

DROP TABLE scott.s;

Alter system switch logfile;

Alter system checkpoint;

DROP trigger corrupt_trigger;
5。破損したブロックが修正されていることを確認します
SQL> select * from V$DATABASE_BLOCK_CORRUPTION;

no rows selected

[Wed Nov 16 08:12:37 orbdev@samusxxxxxx:~ ] $ dbv file='/mnt/apps_st/samusxxxxxx_data2/system09.dbf' userid=sys/****

DBVERIFY: Release 11.2.0.4.0 - Production on Wed Nov 16 08:12:41 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.

DBVERIFY - Verification starting : FILE = /mnt/apps_st/samusxxxxxx_data2/system09.dbf

DBVERIFY - Verification complete

Total Pages Examined     : 655359
Total Pages Processed (Data) : 260868
Total Pages Failing  (Data) : 0
Total Pages Processed (Index): 340482
Total Pages Failing  (Index): 0
Total Pages Processed (Other): 278
Total Pages Processed (Seg): 15
Total Pages Failing (Seg): 0
Total Pages Empty     : 53716
Total Pages Marked Corrupt : 0
Total Pages Influx     : 0
Total Pages Encrypted   : 0
Highest block SCN     : 136830000 (1422.136830000)

[Wed Nov 16 08:14:50 orbldev2@samusxxxxxx:~ ] $
結論

データの破損を検出して防止するには、次のMaximumAvailability Architecture(MAA)のベストプラクティスを実行します。

  • OracleDataGuardを使用します。
  • OracleDatabaseブロックの破損検出パラメータを設定します。
  • Recovery Manager(RMAN)を使用してバックアップとリカバリの戦略を実装します。

これらの高可用性ソリューションはOracleDatabaseと統合されており、基盤となるデータ構造を利用します。したがって、これらのツールは、新しいクラスのインテリジェントなデータ保護とディザスタリカバリを提供します。

[フィードバック]タブを使用して、コメントを書き込んだり、質問したりします。

データベースサービスとRackspaceアプリケーションサービスの詳細をご覧ください。


  1. Windows Update データベース破損エラー [解決済み]

    Windows Update データベース破損エラーを修正: Windows 10 の更新中に、Windows Update データベース破損エラーが原因で、更新が停止するか、Windows を更新できなくなる可能性があります。 Window Update Troubleshooter を実行している場合にのみ、このエラーを見つけることができます。場合によっては、トラブルシューティング ツールで Windows Update に関連するすべての問題を修正できますが、この特定のケースでは、潜在的な Windows Update データベース エラーが検出されたとして原因が示されますが、 [修正の

  2. Windows 10 で破損したプログラムを修復またはアンインストールする方法

    Windows 10 の環境は、プログラムとアプリケーションでいっぱいです。 Windows 10 にはたくさんのアプリやプログラムがロードされており、私たちの体験をとても楽しいものにしています。しかし、特定のアプリが突然クラッシュし、その理由がわからない場合が数回あります。もちろん、アプリやプログラムがクラッシュしたり応答を停止したりすると、Windows は即座に修復プログラム ウィンドウを開きます。しかし、この解決策はほとんどの場合効果的ではありません。 そのため、何らかの理由で特定のアプリが Windows でクラッシュした場合は、明らかにすぐに修正する必要があります。 Wind