Oracleデータベースの代替アーカイブ先の設定方法――ディスク満杯時に備えたフェイルオーバーとフェイルバック
Oracle®データベースのアーカイブ運用では、データを長期にわたって保持・保管できます。しかし、アーカイブ先のディスク容量が枯渇してしまったらどうなるでしょうか。
はじめに
アーカイブ先がいっぱいになると、Oracleデータベースがハングアップ(応答停止)したり、処理が固まってしまうことがあります。このような状況では、次のようなエラーが発生する可能性があります。
- ORA-00257: アーカイバ・エラー。領域が解放されるまでinternalユーザーのみ接続可能
- ORA-16014: ログ2(順序番号1934)がアーカイブされていません。使用可能な宛先がありません
こうした事態に備えるには、プライマリのアーカイブ先に障害が発生した際に切り替えられる「代替(Alternate)アーカイブ先」を事前に用意しておく必要があります。容量不足やハードウェア障害など、プライマリ・アーカイブ先で何らかの問題が起きた場合に、代替アーカイブ先を活用できます。
それでは、実際のデモを通してこの仕組みを確認していきましょう。
デモ その1: プライマリ・アーカイブ先の確認
まず、プライマリのアーカイブ先として/u03/primary_destを設定します。このロケーションは現時点で使用率99%の状態です。テストとして同じ環境を再現できます。
以下のコマンドを実行して状態を確認します。
SQL> select version from v$instance;
VERSION
-----------------
12.1.0.2.0
SQL> select DEST_NAME,TARGET,DESTINATION,VALID_ROLE,STATUS
from v$archive_dest where status!='INACTIVE';
DEST_NAME TARGET DESTINATION VALID_ROLE STATUS
--------------------- ---------- -------------------- ------------ ---------
LOG_ARCHIVE_DEST_1 PRIMARY /u03/primary_dest ALL_ROLES VALID
デモ その2: 代替アーカイブ先の追加
次に、プライマリが利用できなくなった場合にシステムが自動的に使用できる、代替アーカイブ先/u04/alternate_destを追加します。
SQL> !df -h /u04/alternate_dest
Filesystem Size Used Avail Use% Mounted on
/dev/ddg2 1004M 18M 936M 2% /u04
SQL> alter system set log_archive_dest_2='LOCATION=/u04/alternate_dest' scope=both;
System altered.
SQL> alter system set log_archive_dest_state_2=ALTERNATE scope=both;
System altered.
SQL> select DEST_NAME,TARGET,DESTINATION,VALID_ROLE,STATUS,ALTERNATE from v$archive_dest where status!='INACTIVE';
DEST_NAME TARGET DESTINATION VALID_ROLE STATUS ALTERNATE
------------------- ----------- ------------------- ------------ ----------- ---------
LOG_ARCHIVE_DEST_1 PRIMARY /u03/primary_dest ALL_ROLES VALID NONE
LOG_ARCHIVE_DEST_2 PRIMARY /u04/alternate_dest ALL_ROLES ALTERNATE NONE
デモ その3: フェイルオーバーとフェイルバックのための相互リンク設定
プライマリと代替のアーカイブ先を相互に紐付けることで、プライマリの使用率が100%に達した時点で、Oracleは代替アーカイブ先へフェイルオーバーできるようになります。ただし、初期状態のままでは、プライマリが再び利用可能になっても自動的には元に戻りません(フェイルバックしません)。
フェイルバックを有効にするには、代替アーカイブ先LOG_ARCHIVE_DEST_2に対して、プライマリ・アーカイブ先LOG_ARCHIVE_DEST_1をALTERNATEとして指定する必要があります。以下の例をご覧ください。
SQL> alter system set log_archive_dest_2='LOCATION=/u04/alternate_dest
NOREOPEN ALTERNATE=LOG_ARCHIVE_DEST_1' scope=both;
System altered.
SQL> alter system set log_archive_dest_1='LOCATION=/u03/primary_dest
NOREOPEN ALTERNATE=LOG_ARCHIVE_DEST_2' scope=both;
System altered.
SQL> select DEST_NAME,TARGET,DESTINATION,VALID_ROLE,STATUS,ALTERNATE
from v$archive_dest where status!='INACTIVE';
DEST_NAME TARGET DESTINATION VALID_ROLE STATUS ALTERNATE
-------------------- ----------- -------------------- ------------ ---------- ------------------
LOG_ARCHIVE_DEST_1 PRIMARY /u03/primary_dest ALL_ROLES VALID LOG_ARCHIVE_DEST_2
LOG_ARCHIVE_DEST_2 PRIMARY /u04/alternate_dest ALL_ROLES ALTERNATE LOG_ARCHIVE_DEST_1
これで、アーカイブ先1と2が相互に紐付いたことが確認できます。この設定により、プライマリに空き容量が確保された後、Oracleは自動的にプライマリ宛先へフェイルバックできるようになります。
デモ その4: 容量満杯時の動作確認
続いて、DMLを実行してアーカイブ先の使用率を100%まで引き上げました。アラート・ログには次のような出力が記録されます。
Thread 1 is advanced to log sequence 20 (LGWR switch)
Current log# 2 seq# 20 mem# 0: /u01/app/oracle/oradata/MODI/redo02.log
2020-12-05T04:44:29.216275+05:30
ARC0: Encountered disk I/O error 19502
2020-12-05T04:44:29.216575+05:30
ARC0: Closing local archive destination LOG_ARCHIVE_DEST_1 '/u03/primary_dest/1_19_1058325294.dbf' (error 19502) (MODI)
2020-12-05T04:44:29.217417+05:30
Errors in file /u01/app/oracle/diag/rdbms/modi/MODI/trace/MODI_arc0_23015.trc:
ORA-27072: File I/O error
Additional information: 4
Additional information: 350208
Additional information: 446464
ORA-19502: write error on file "/u03/primary_dest/1_19_1058325294.dbf", block number 350208 (block size=512)
2020-12-05T04:44:32.583182+05:30
MODIP(3):Resize operation completed for file# 11, old size 1172480K, new size 1182720K
2020-12-05T04:44:33.183355+05:30
Errors in file /u01/app/oracle/diag/rdbms/modi/MODI/trace/MODI_arc0_23015.trc:
ORA-19502: write error on file "/u03/primary_dest/1_19_1058325294.dbf", block number 350208 (block size=512)
ORA-27072: File I/O error
Additional information: 4
Additional information: 350208
Additional information: 446464
ORA-19502: write error on file "/u03/primary_dest/1_19_1058325294.dbf", block number 350208 (block size=512)
ステップ5: 自動フェイルバックの確認
Oracleは常にプライマリ宛先へのアーカイブを試みており、12cではプライマリへの自動フェイルバックが機能します。プライマリ側の領域を整理してアーカイブ可能な状態に戻すと、Oracleはアラート・ログにエラーやフェイルバック関連のメッセージを出力することなく、引き続きREDOログをプライマリ宛先へアーカイブします。v$archived_logを問い合わせた結果が以下の例です。
SQL> select thread#,sequence#,name from v$archived_log;
THREAD# SEQUENCE# NAME
-------- ---------- -----------------------------------------------
1 2 /u03/primary_dest/1_2_1058325294.dbf
1 3 /u03/primary_dest/1_3_1058325294.dbf
1 4 /u03/primary_dest/1_4_1058325294.dbf
1 5 /u03/primary_dest/1_5_1058325294.dbf
1 6 /u04/alternate_dest/1_6_1058325294.dbf
1 7 /u04/alternate_dest/1_7_1058325294.dbf
1 8 /u04/alternate_dest/1_8_1058325294.dbf
1 9 /u04/alternate_dest/1_9_1058325294.dbf
1 10 /u04/alternate_dest/1_10_1058325294.dbf
1 11 /u04/alternate_dest/1_11_1058325294.dbf
1 12 /u04/alternate_dest/1_12_1058325294.dbf
1 13 /u04/alternate_dest/1_13_1058325294.dbf
1 14 /u04/alternate_dest/1_14_1058325294.dbf
1 15 /u04/alternate_dest/1_15_1058325294.dbf
1 16 /u04/alternate_dest/1_16_1058325294.dbf
1 17 /u04/alternate_dest/1_17_1058325294.dbf
1 18 /u04/alternate_dest/1_18_1058325294.dbf
1 19 /u04/alternate_dest/1_19_1058325294.dbf
1 20 /u04/alternate_dest/1_20_1058325294.dbf
1 21 /u04/alternate_dest/1_21_1058325294.dbf
1 22 /u04/alternate_dest/1_22_1058325294.dbf
1 23 /u04/alternate_dest/1_23_1058325294.dbf
1 24 /u04/alternate_dest/1_24_1058325294.dbf
1 25 /u04/alternate_dest/1_25_1058325294.dbf
1 26 /u04/alternate_dest/1_26_1058325294.dbf
1 27 /u04/alternate_dest/1_27_1058325294.dbf
1 28 /u04/alternate_dest/1_28_1058325294.dbf
1 29 /u03/primary_dest/1_29_1058325294.dbf
1 30 /u03/primary_dest/1_30_1058325294.dbf
1 31 /u03/primary_dest/1_31_1058325294.dbf
1 32 /u03/primary_dest/1_32_1058325294.dbf
31行が選択されました。
この結果から、順序番号6〜28のアーカイブログは代替宛先(/u04/alternate_dest)に書き込まれ、プライマリの空き容量確保後は順序番号29以降が再びプライマリ宛先(/u03/primary_dest)にアーカイブされていることが分かります。
まとめ
Oracleは、プライマリと代替のアーカイブ先を自動的に切り替える管理機能において大幅な改善を実現しています。本記事のデモ手順を参考に、ぜひこの機能を活用してみてください。
代替アーカイブ先を用意しておけば安心ですが、プライマリのアーカイブ先が復旧するまでの間、プライマリ宛先の障害に関するエラー・メッセージが断続的にアラート・ログへ出力され続ける点には注意が必要です。
当社のデータサービスについて詳しくは、こちらをご覧ください。
ご意見やご質問がございましたら、フィードバックタブをご利用ください。私たちとの対話も歓迎いたします。
-
Oracle繰延売上原価(DCOGS)会計の仕組みと設定方法
本記事では、Oracle® Cost Management リリース12.0.0以降で利用できる「繰延売上原価(Deferred Cost of Goods Sold:DCOGS)」勘定機能について解説します。この拡張機能により、売上原価(COGS)を収益に直接対応させることが可能となり、従来は実現できなかった収益と費用の正確なマッチングが実現します。 はじめに 以前のバージョンでは、在庫から出荷された商品の価値は、その出荷がまだ収益を計上していなくても、売上原価(COGS)として即時に費用処理されていました。この拡張機能の導入により、在庫から出荷された商品の価値は、まずDCOGS勘定に一時的
-
Oracle 19cのDBCAコマンドでデータベースをクローンする方法【サイレントモード完全ガイド】
本記事では、Oracle Database 19cの新機能であるDatabase Configuration Assistant(DBCA)を使用して、ソースデータベースのバックアップを作成することなく、リモートのプラガブル・データベース(PDB)をコンテナ・データベース(CDB)へクローンする手順をご紹介します。 DBCAによるクローンの最大の特長は、ソースからターゲットへの複製にかかる時間が最小限に抑えられる点です。 ソースDBの構成 CDB:LCONCDB PDB:LCON 以下は、ソース側の各コンテナ(CDBおよびPDB)に存在するDBFファイルの総数です。クローン作成後は、ター