Oracleシステム構造のSCN、インスタンス回復


SCN:System Change Number
SCNは、Oracleデータベースの論理の内部タイムスタンプであり、データベースがある適切な時刻に提出されたバージョンを識別するために使用される。事務の提出またはロールバックにおいて、データベースの整合性を保証するために、唯一の識別情報であるSCNが付与されている。
SQL> select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;
GET_SYSTEM_CHANGE_NUMBER SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)
------------------------ -------------------------------------------------------
                 1819076 06-JUL-13 11.40.12.000000000 PM
SQL>select  current_scn from v$database;
CURRENT_SCN
-----------
    1819065
SCNはデータベースにどこにでもあります。よくある制御ファイル、データファイルヘッダ、ログファイルなどはSCNを記録しています。
コントロールファイル中
  • システムチェックポイントSCN(System Checkpoint SCN)
  • SQL> select checkpoint_change# from v$database;
    CHECKPOINT_CHANGE#
    ------------------
               1809219
  • ファイルチェックポイントSCN(Datafile Checkpoint SCN)
  • ファイル終了SCN(Stop SCN)
  • SQL> select name,checkpoint_change#,last_change# from v$datafile;
    NAME                                          CHECKPOINT_CHANGE# LAST_CHANGE#
    --------------------------------------------- ------------------ ------------
    +DATA/orcl/datafile/system.256.817343229                 1809219
    +DATA/orcl/datafile/sysaux.257.817343231                 1809219
    +DATA/orcl/datafile/undotbs1.258.817343231               1809219
    +DATA/orcl/datafile/users.259.817343231                  1809219
    +DATA/orcl/datafile/example.265.817343543                1809219
    データファイルヘッダ
  • からSCN(Start SCN)
  • SQL> select checkpoint_change# from v$datafile_header;
    CHECKPOINT_CHANGE#
    ------------------
               1809219
               1809219
               1809219
               1809219
               1809219
    ログファイルで
  • FIRST SCN:redo log fileにおける最初のログのSCN
  • NEXT SCN:redo logs fileの最後のログSCN(つまり次のredo logs fileの第一のログのSCN)
  • 通常は、現在のリフォームログファイル群がいっぱいになってからログ切り替えが発生しますが、設定パラメータARCHIVE_LOG_TARGETはログ切り替えの時間間隔を制御し、必要に応じて手動で強制的にログ切り替えを行うことができます。
    redo log fileのセットがいっぱいになると、自動的に次のグループのredo logfileに切り替わります。前のグループのredo logsのHigh SCNは次のグループredo logsのLow SCNであり、CurrentログファイルのHigh SCNは無限大である。
    SQL> select group#,sequence#,status,first_change#,next_change# from v$log;
        GROUP#  SEQUENCE# STATUS           FIRST_CHANGE#       NEXT_CHANGE#
    ---------- ---------- ---------------- ------------- ------------------
             1         34 INACTIVE               1746572            1770739
             2         35 INACTIVE               1770739            1808596
             3         36 CURRENT                1808596    281474976710655
    インスタンスクラッシュの回復:
    OracleはOracleデータベースで制御ファイルにより以下の検証を行いました。
  • は、データファイルのヘッダに記録されているStart SCNと制御ファイルに記録されているSystem Checkpoint SCNが一致しているかどうかを確認し、異なる場合は、メディア回復
  • を行う必要がある。
  • は、データファイルヘッダに記録されているStart SCNと制御ファイルに記録されているStop SCNが一致しているかどうかを確認し、異なる場合はインスタンス回復が必要である。
  • 両方が一致したら、修正されたデータブロックはすべてデータファイルに書き込まれていることを説明します。正常にオープンできます。
    データベースのOPENが正常に動作している間、システムSCN、ファイルSCNとデータファイルヘッダの開始SCNは同じであり、かつ(大きいかまたは)ACTIVE/CURRENTログファイルの最小FIRST SCNに等しいが、ファイル終了SCNはNULL(無限大)である。
    データベースが正常にクローズされている場合、Oracleは、完全チェックポイントによって、ブザーcacheのすべてのキャッシュをディスクに書き込み、同時にデータベースを閉じる時点によって制御ファイルのシステムSCN、ファイルSCN、SCNを終了し、データファイルのヘッダの開始SCNを更新し、SCNは全部一致しています。LRBAポインタはon disk RBAを指しています。
    データベースが正常にクローズされていない(崩壊/電源がオフされている)場合、Oracleは制御ファイルに検出されたシステムSCN、ファイルSCN、およびデータファイルヘッダの開始SCNを一致させるが、SCNがNULLで終了すると、制御ファイルに記録されたLRBAアドレス(前転開始点)とon disk RBA(前転端点)に従って、インスタンス崩壊回復に参加する必要がある。アドレスは、対応するログ項目を探して、インスタンスのクラッシュを回復して、最終的には、データベースのオープンを行うことができます。
    インスタンス回復の詳細プロセス:
  • 前のロールオフフェーズ(前ロールはredoによって、またバッファエリアと呼ばれてcache recoveryを回復します。つまり、メモリの中にありますが、まだデータファイルに書き込んでいない内容を回復します。)
  •      Oracleはredo logs fileの記録によって前に転がっています。(comitがあるかどうかに関わらず)、前に転がって完成したら、data fileに提出されたデータがあるかもしれません。
         また、undoの生成もRedo logsを記録するため、Redoによって、バックバックバックバックする際に必要なundo情報が再生成されます。
  • データベースopen段階
  •      前にロールアップした後、データベース内のすべての変更されたデータブロックはすでにデータファイルに書き込まれています。正常にオープンできます。
  • ロールバックフェーズ(undoをロールバックして、またトラストレーカーと呼ばれる。つまり、インスタンスが崩壊する前に提出されていないトランザクションをリターンすることを担当する)
  • データベースを正常に閉じている場合:
    システムSCN、ファイルSCN、終了SCN、およびデータファイルヘッダの開始SCNは等しく、かつ(以上または)ACTIVE/CURRENTログファイルの最小FIRST SCNに等しい。
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup mount
    ORACLE instance started.
    Total System Global Area  459304960 bytes
    Fixed Size                  2214336 bytes
    Variable Size             289408576 bytes
    Database Buffers          159383552 bytes
    Redo Buffers                8298496 bytes
    Database mounted.
    SQL>  select checkpoint_change# from v$database;
    CHECKPOINT_CHANGE#
    ------------------
               1822573
    SQL>  select name,checkpoint_change#,last_change# from v$datafile;
    NAME                                          CHECKPOINT_CHANGE# LAST_CHANGE#
    --------------------------------------------- ------------------ ------------
    +DATA/orcl/datafile/system.256.817343229                 1822573      1822573
    +DATA/orcl/datafile/sysaux.257.817343231                 1822573      1822573
    +DATA/orcl/datafile/undotbs1.258.817343231               1822573      1822573
    +DATA/orcl/datafile/users.259.817343231                  1822573      1822573
    +DATA/orcl/datafile/example.265.817343543                1822573      1822573
    SQL> select name,checkpoint_change# from v$datafile_header;
    NAME                                          CHECKPOINT_CHANGE#
    --------------------------------------------- ------------------
    +DATA/orcl/datafile/system.256.817343229                 1822573
    +DATA/orcl/datafile/sysaux.257.817343231                 1822573
    +DATA/orcl/datafile/undotbs1.258.817343231               1822573
    +DATA/orcl/datafile/users.259.817343231                  1822573
    +DATA/orcl/datafile/example.265.817343543                1822573
    SQL> select group#,sequence#,status,first_change#,next_change# from v$log;
        GROUP#  SEQUENCE# STATUS           FIRST_CHANGE#       NEXT_CHANGE#
    ---------- ---------- ---------------- ------------- ------------------
             1         37 CURRENT                1822207    281474976710655
             3         36 INACTIVE               1808596            1822207
             2         35 INACTIVE               1770739            1808596
    通常のオープンデータベースの場合:
    ファイル終了SCNはNULLです(無限大)
    SQL> alter database open;
    Database altered.
    SQL> select name,checkpoint_change#,last_change# from v$datafile;
    NAME                                          CHECKPOINT_CHANGE# LAST_CHANGE#
    --------------------------------------------- ------------------ ------------
    +DATA/orcl/datafile/system.256.817343229                 1822576
    +DATA/orcl/datafile/sysaux.257.817343231                 1822576
    +DATA/orcl/datafile/undotbs1.258.817343231               1822576
    +DATA/orcl/datafile/users.259.817343231                  1822576
    +DATA/orcl/datafile/example.265.817343543                1822576
    異常シャットダウン(例クラッシュ)の場合:
    ファイル終了SCNはまだNULLです(無限大)
    SQL> shutdown abort
    ORACLE instance shut down.
    SQL> startup mount
    ORACLE instance started.
    Total System Global Area  459304960 bytes
    Fixed Size                  2214336 bytes
    Variable Size             289408576 bytes
    Database Buffers          159383552 bytes
    Redo Buffers                8298496 bytes
    Database mounted.
    SQL> select name,checkpoint_change#,last_change# from v$datafile;
    NAME                                          CHECKPOINT_CHANGE# LAST_CHANGE#
    --------------------------------------------- ------------------ ------------
    +DATA/orcl/datafile/system.256.817343229                 1822576
    +DATA/orcl/datafile/sysaux.257.817343231                 1822576
    +DATA/orcl/datafile/undotbs1.258.817343231               1822576
    +DATA/orcl/datafile/users.259.817343231                  1822576
    +DATA/orcl/datafile/example.265.817343543                1822576
    起動例はインスタンスの回復を行います。
    SQL> alter database open;
    Database altered.
    $ tailf /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
    Sun Jul 07 00:10:07 2013
    alter database open
    Beginning crash recovery of 1 threads
     parallel recovery started with 3 processes
    Started redo scan
    Completed redo scan
     read 192 KB redo, 87 data blocks need recovery
    Started redo application at
     Thread 1: logseq 37, block 533
    Recovery of Online Redo Log: Thread 1 Group 1 Seq 37 Reading mem 0
      Mem# 0: +DATA/orcl/onlinelog/group_1.261.817343457
      Mem# 1: +FRA/orcl/onlinelog/group_1.257.817343463
    Completed redo application of 0.15MB
    Completed crash recovery at
     Thread 1: logseq 37, block 918, scn 1843004
     87 data blocks read, 87 data blocks written, 192 redo k-bytes read
    Sun Jul 07 00:10:13 2013
    Thread 1 advanced to log sequence 38 (thread open)
    Thread 1 opened at log sequence 38
      Current log# 2 seq# 38 mem# 0: +DATA/orcl/onlinelog/group_2.262.817343467
      Current log# 2 seq# 38 mem# 1: +FRA/orcl/onlinelog/group_2.258.817343473
    Successful open of redo thread 1
    Sun Jul 07 00:10:14 2013
    SMON: enabling cache recovery
    Successfully onlined Undo Tablespace 2.
    Verifying file header compatibility for 11g tablespace encryption..
    Verifying 11g file header compatibility for tablespace encryption completed
    SMON: enabling tx recovery
    Database Characterset is AL32UTF8
    No Resource Manager plan active
    Sun Jul 07 00:10:17 2013
    replication_dependency_tracking turned off (no async multimaster replication found)
    Starting background process QMNC
    Sun Jul 07 00:10:21 2013
    QMNC started with pid=28, OS id=7140
    Sun Jul 07 00:10:31 2013
    Completed: alter database open