Data Guard 環境のアーカイブログ出力状況を確認する（Oracle Database 19c）

# Data Guard 環境のアーカイブログ
　Data Guard はプライマリ・データベースで発生した更新情報（REDOログ）をスタンバイ・データベースに自動転送して適用することでデータベースの同期をとる技術です。REDOログはREDOログ・ファイルに出力され、アーカイブログ・ファイルとして出力されます。REDOログ・ファイルのコピーであるアーカイブログは、プライマリ・データベースだけでなく、スタンバイ・データベース上でも作成されます。
　本記事ではアーカイブログの出力状況を確認できる V$ARCHIVED_LOG ビューの内容が Data Guard 環境でどのように変化するのかを検証します。カスケード構成では動作が異なる場合があります。
  本記事ではプライマリ・データベースの名前（db_unique_name）を O19P、スタンバイ・データベースの名前を O19S としています。

# 管理スタンバイ実行時
 Data Guard が正常に動作している場合、アーカイブログはプライマリ・データベース、スタンバイ・データベース両方に出力されます。

V$ARCHIVED_LOG ビューの主な列のうち、プライマリ・データベースとスタンバイ・データベース共通の項目は以下の通りです。

|列名|値の説明|備考|
|:---|:---|:---|
|DEST_ID|転送した log_archive_dest_N の番号||
|THREAD#|アーカイブログが出力されたインスタンス番号|非RAC環境では1|
|SEQUENCE#|アーカイブログのシーケンス番号||
|COMPLETION_TIME|アーカイブログ作成・転送完了日時|||

## プライマリ・データベース
　プライマリ・データベースの V$ARCHIVED_LOG ビューには、単一のシーケンス番号（SEQUENCE# 列）に対して、ローカル環境（プライマリ・データベース）に出力されたアーカイブログとリモート環境（スタンバイ・データベース）に転送されたアーカイブログの両方の情報が出力されます。

|列名|値の説明|備考|
|:---|:---|:---|
|NAME|ファイル名または転送したアーカイブのリモート・サービス名||
|STANDBY_DEST|リモート転送の場合はYES、ローカル保存時 NO||
|ARCHIVED|アーカイブされた場合はYES||
|APPLIED|転送済アーカイブログがスタンバイに適用済の場合YES||
|STATUS|使用可能な場合 A||
|CREATOR|ローカル出力の場合 ARCH、リモート転送の場合 LGWR||
|REGISTRAR|ローカル出力の場合 FGRD、リモート転送の場合 LGWR||

下記の例ではシーケンス番号 145 のアーカイブログが出力された状況を示しています。NAME列にO19S が出力されたレコードはスタンバイ・データベースに転送されたアーカイブログを示しています。APPLIED列がYESのため、スタンバイ・データベースに適用済であることを示します。

```SQL: アーカイブログの出力状況を確認
SQL> SELECT name, archived, status, applied FROM v$archived_log WHERE sequence#=145;

NAME                                                                   ARC S APPLIED
---------------------------------------------------------------------- --- - ---------
/u01/app/oracle/admin/O19P/archive/1_145_1092062913.dbf                YES A NO
O19S                                                                   YES A YES
```

## スタンバイ・データベース
スタンバイ・データベースの V$ARCHIVED_LOG ビューには、リモート転送されたアーカイブログの状況は出力されません。

|列名|値の説明|備考|
|:---|:---|:---|
|NAME|ファイル名||
|STANDBY_DEST|ローカル保存なので NO||
|ARCHIVED|アーカイブされた場合は YES||
|APPLIED|スタンバイに適用済の場合 YES||
|STATUS|使用可能な場合 A||
|CREATOR|ローカル出力なので ARCH||
|REGISTRAR|リモートからの転送なので RFS||

```SQL: Data Guard リアルタイム適用を確認
SQL> SELECT status FROM v$managed_standby WHERE process LIKE 'MRP%';

STATUS
------------
APPLYING_LOG
```

APPLIED 列が YES であるためスタンバイ・データベースに適用済であることがわかります。

```SQL: アーカイブログの出力状況を確認
SQL> SELECT name, archived, status, applied FROM v$archived_log WHERE sequence#=145;

NAME                                                                   ARC S APPLIED
---------------------------------------------------------------------- --- - ---------
/u01/app/oracle/admin/O19S/archive/1_145_1092062913.dbf                YES A YES
```

# スタンバイ停止時
　スタンバイ・データベースを停止した場合にプライマリ・データベースでアーカイブログが出力された場合の動作を検証します。

## プライマリ・データベース
　プライマリ・データベースの V$ARCHIVED_LOG ビューにはスタンバイ・データベースに転送するはずのアーカイブログの情報は出力されません。

```SQL: アーカイブログ出力確認
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

システムが変更されました。

SQL> SELECT MAX(sequence#) FROM v$archived_log;

MAX(SEQUENCE#)
--------------
           146

SQL> SELECT name, archived, status, applied FROM v$archived_log WHERE sequence#=146;

NAME                                                                   ARC S APPLIED
---------------------------------------------------------------------- --- - ---------
/u01/app/oracle/admin/O19P/archive/1_146_1092062913.dbf                YES A NO
```

# スタンバイ起動時
スタンバイ・インスタンスが起動し、管理リカバリモード（MANAGED STANDBY）が実行されていない場合の動作を検証します。この場合でもスタンバイ・インスタンスではリアルタイム適用のためのREDO ログやアーカイブログは受信されています。

## プライマリ・データベース
スタンバイ・インスタンスは起動しているため、V$ARCHIVED_LOG ビューにはリモート転送されたアーカイブログの情報が出力されています。しかし APPLIED 列の値は NO であり、適用はされていないことがわかります。

```SQL: アーカイブログの確認
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

システムが変更されました。

SQL> SELECT MAX(sequence#) FROM v$archived_log;

MAX(SEQUENCE#)
--------------
           147

SQL> SELECT name, archived, status, applied FROM v$archived_log WHERE sequence#=147;

NAME                                                                   ARC S APPLIED
---------------------------------------------------------------------- --- - ---------
/u01/app/oracle/admin/O19P/archive/1_147_1092062913.dbf                YES A NO
O19S                                                                   YES A NO
```

## スタンバイ・データベース
　スタンバイ・インスタンスでもアーカイブログが出力されています。しかし APPLIED 列は NO であり、適用はされていないことがわかります。

```SQL:
SQL> SELECT name, archived, status, applied FROM v$archived_log WHERE sequence#=147;

NAME                                                                   ARC S APPLIED
---------------------------------------------------------------------- --- - ---------
/u01/app/oracle/admin/O19S/archive/1_147_1092062913.dbf                YES A NO
```

# アーカイブログ削除対象設定
RMAN から削除されたアーカイブログの情報は NAME 列が NULL になり、DELETED 列が YES になります。V$ARCHIVED_LOG ビューの保存期間は初期化パラメーター control_file_record_keep_time（デフォルト値 7）で指定された日数になります。

```SQL: 削除されたアーカイブログの情報
SQL> SET NULL NULL
SQL> SELECT DISTINCT name, deleted FROM v$archived_log WHERE name IS NULL;

NAME                                                                   DEL
---------------------------------------------------------------------- ---
NULL                                                                   YES
```

RMAN でアーカイブログを削除可能とみなすための条件は CONFIGURE コマンドで指定します。この設定は Data Guard のプライマリ・データベースとスタンバイ・データベースで別々の値に指定できます。削除ポリシーは ARCHIVELOG DELETION POLICY 属性で変更できます。

``` SQL: RMAN 設定のデフォルト値確認
RMAN> SHOW ARCHIVELOG DELETION POLICY;

db_unique_name O19PのデータベースにおけるRMAN構成パラメータ:
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
```

スタンバイ・データベースに「適用済」であるアーカイブログを削除う可能とみなす設定は ARCHIVELOG DELETION POLICY を APPLIED ON ALL STANDBY に指定します。

```SQL: 削除条件をスタンバイ・データベースに「適用済」に設定
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;

新しいRMAN構成パラメータ:
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
新しいRMAN構成パラメータが格納できました
```

スタンバイ・データベースに「転送済」であるアーカイブログを削除う可能とみなす設定は ARCHIVELOG DELETION POLICY を SHIPPED TO ALL STANDBY に指定します。

```SQL: 削除条件をスタンバイ・データベースに「転送済」に設定
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO SHIPPED TO ALL STANDBY;

新しいRMAN構成パラメータ:
CONFIGURE ARCHIVELOG DELETION POLICY TO SHIPPED TO ALL STANDBY;
新しいRMAN構成パラメータが格納できました
```

[「Oracle Database バックアップおよびリカバリ・リファレンス」マニュアル](
https://docs.oracle.com/cd/F32587_01/rcmrf/CONFIGURE.html#GUID-B5094E73-C26C-4FED-AE39-8C2E9540050A) には ALL を省略する構文が記載されていますが、不具合のため省略できません。値は保存されますが RMAN-08591 エラーが発生します。

```SQL: 不具合が発生する構文
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO SHIPPED TO STANDBY;

新しいRMAN構成パラメータ:
CONFIGURE ARCHIVELOG DELETION POLICY TO SHIPPED TO STANDBY;
新しいRMAN構成パラメータが格納できました
RMAN-08591: 警告: アーカイブ・ログ削除ポリシーが無効です
```

Author: Noriyoshi Shinoda / Date: February 22, 2024