RAC環境におけるREDO構成の概要と再構成手順
RAC環境におけるREDO構成の概要と再構成手順
REDOの構成概要と再構成手順について説明します。
REDO構成の概要
データベースがシングルノードである場合、障害対応として考えておかなければならないREDO構成は冗長化のみでした。片方のディスクがI/O不能となっても、ミラーリングされている別のREDOが生きていればサービスを継続できるという構成です。
シングルノードの場合はこれだけでよかったのですが、RAC構成になると冗長化に加えてノード毎のREDO書き込み先を考慮する必要があります。
まずはREDOを構成する要素を説明します。
- Group-ID
- Thread
- REDO配置領域
- REDOファイル名
Group-IDとはREDOファイルをグルーピングした構成に割り当てるID番号です。
ThreadはどのノードからのREDO書き込みであるかを指定する番号です。
REDO配置領域とは、REDOファイルをどこのディスク、またはディスクグループに配置するかの指定です。
REDOファイル名はREDOファイルに割り当てるファイル名です。
RAC構成におけるノード毎のREDO書き込み先を決定する構成要素ですが、それは「Thread」です。
Threadの書き込み先を冗長化することでRAC構成における冗長化を実現できることになります。
この図のRAC構成では、server01のREDO書き込みが「Thread 1」で、server02のREDO書き込みが「Thread 2」となります。
REDO配置領域としては、ASMディスクグループである「DG_REDO_1」と「DG_REDO_2」で冗長化されています。
server01が「Thread 1」で書き込む為に用意されているREDOはredo01.logからredo04.logですが、冗長化構成を実現サせるために更にグループによって分けられています。
「Group 1」には「redo01.log」と「redo02.log」が含まれ、「Group 2」には「redo03.log」と「redo04.log」が含まれています。Thread 1 によるREDOは「redo01.log」と「redo02.log」に同時に書き込まれていきます。
「Group 1」のREDOがログスイッチすると、その後のREDO書き込みは「Group 2」に切り替わります。
「Thread 2」も同様の構成です。
REDO再構成手順
以下のREDO構成を作ることにします。
- REDO書き込み先DGは「DG_REDO_1」と「DG_REDO_2」で冗長化構成
- Thread 1 用のREDOグループは「1,2,3」、Thread 2 用のREDOグループは「4,5,6」
- Group 1 に割り当てるREDOファイルはredo01.log~redo06.log
- Group 2 に割り当てるREDOファイルはredo07.log~redo12.log
- REDOファイルのサイズは全て512Kb
構成変更前のREDO確認
REDOの構成を次のSQLで確認します。
SQL> select log.thread#,log.group#,log.bytes/1024/1024 as mbytes, log.status,log.archived,logfile.group# from v$log log,v$logfile logfile where log.group# = logfile.group# order by log.thread#,log.group#; THREAD# GROUP# MBYTES STATUS ARC GROUP# ---------- ---------- ---------- ---------------- --- ---------- 1 1 50 CURRENT NO 1 1 2 50 INACTIVE NO 2 2 3 50 CURRENT NO 3 2 4 50 INACTIVE NO 4 SQL>
Thread 1 が書き込むREDOグループが「1,2」があり、Thread 2 が書き込みREDOグループが「3,4」となっており、書き込み中で状態がアクティブになっているグループが「1,3」であることがわかります。
REDO再構成作業の流れ
REDOファイルがACTIVE状態のときは、削除することができません。
しかし強制的にログスイッチさせることで、ACTIVE状態のREDOを切り替えることができます。
この条件から、作業の流れは以下となります。
- REDOグループ「5,6」を新規作成
- 既存REDOでINACTIVE状態のREDOグループを削除
- 削除したREDOグループを作成
- 強制的にログスイッチさせ、ACTIVE状態であったREDOグループ「1,3」をINACTIVE状態にする
- INACTIVE状態となったREDOグループ「1,3」を削除
- REDOグループ「1,3」を新規作成
これで全てのREDOログが再作成&再配置できます。
REDOグループ「5,6」追加
REDOグループ「1,2,3,4」が既に使われているので、「5,6」を新規作成します。
SQL> alter database add logfile thread 2 group 6 ('+DG_REDO_1/DB01/redo09.log','+DG_REDO_2/DB01/redo10.log') size 512000K; データベースが変更されました。 SQL> alter database add logfile thread 2 group 7 ('+DG_REDO_1/DB01/redo11.log','+DG_REDO_2/DB01/redo12.log') size 512000K; データベースが変更されました。 SQL>
グループ「5,6」が追加されていることを確認します。
SQL> select log.thread#,log.group#,log.bytes/1024/1024 as mbytes, log.status,log.archived,logfile.group# from v$log log,v$logfile logfile where log.group# = logfile.group# order by log.thread#,log.group#; THREAD# GROUP# MBYTES STATUS ARC GROUP# ---------- ---------- ---------- ---------------- --- ---------- 1 1 50 CURRENT NO 1 1 2 50 INACTIVE NO 2 2 3 50 CURRENT NO 3 2 4 50 INACTIVE NO 4 2 5 500 UNUSED YES 11 2 5 500 UNUSED YES 11 2 6 500 UNUSED YES 11 2 6 500 UNUSED YES 11 SQL>
INACTIVE状態であるREDOグループ「2,4」を削除
SQL> alter database drop logfile group 2; データベースが変更されました。 SQL> alter database drop logfile group 4; データベースが変更されました。 SQL>
REDOグループ「2,4」を作成
SQL> alter database add logfile thread 1 group 2 ('+DG_REDO_1/DB01/redo03.log','+DG_REDO_2/DB01/redo04.log') size 512M; データベースが変更されました。 SQL> alter database add logfile thread 1 group 4 ('+DG_REDO_1/DB01/redo07.log','+DG_REDO_2/DB01/redo08.log') size 512M; データベースが変更されました。 SQL>
補足
REDOログ削除する際に、残りが1つしか残らない場合はエラーになります。その時は仮のREDOファイルを作成して対応して下さい。
SQL> alter database drop logfile group 4; alter database drop logfile group 4 * 行1でエラーが発生しました。: ORA-01567: ログ4を削除すると、インスタンスdb012(スレッド2)内の残りログ・ファイルが1つ以下になります ORA-00312: オンライン・ログ4 スレッド2: '+DATA/db01/onlinelog/group_4.266.829070529' SQL>
強制ログスイッチ
SQL> alter system switch logfile; システムが変更されました。 SQL>
ACTIVEだったREDOグループがINACTIVEになることを確認します。
(※チェックポイント処理によりINACTIVEになるまでに時間がかかる場合があります。)
SQL> select log.thread#,log.group#,log.bytes/1024/1024 as mbytes, log.status,log.archived,logfile.group# from v$log log,v$logfile logfile where log.group# = logfile.group# order by log.thread#,log.group#; THREAD# GROUP# MBYTES STATUS ARC GROUP# ---------- ---------- ---------- ---------------- --- ---------- 1 1 50 INACTIVE NO 1 1 2 50 CURRENT NO 2 2 3 50 INACTIVE NO 3 2 4 50 CURRENT NO 4 2 5 500 INACTIVE YES 11 2 5 500 INACTIVE YES 11 2 6 500 INACTIVE YES 11 2 6 500 INACTIVE YES 11 SQL>
INACTIVE状態であるREDOグループ「1,3」を削除
SQL> alter database drop logfile group 1; データベースが変更されました。 SQL> alter database drop logfile group 3; データベースが変更されました。 SQL>
REDOグループ「1,3」を作成
SQL> alter database add logfile thread 1 group 1 ('+DG_REDO_1/DB01/redo01.log','+DG_REDO_2/DB01/redo02.log') size 512M; データベースが変更されました。 SQL> alter database add logfile thread 1 group 3 ('+DG_REDO_1/DB01/redo05.log','+DG_REDO_2/DB01/redo06.log') size 512M; データベースが変更されました。 SQL>
これでREDO再構成は完了です。
REDOグループ、REDOファイル数、は必要に応じて変更して下さい。