Active Data Guard スタンバイ・インスタンスで PDB の操作を試す（Oracle Database 21c)


本文書は [JPOUG Advent Calendar 2022](https://adventar.org/calendars/7680) 12日目の記事です。Oracle Database 21c の Active Data Guard スタンバイ・インスタンスで PDB の操作を試しました。

# PDB の状態
　Data Guard のスタンバイ・インスタンスでは PDB の状態はプライマリ・インスタンスとは別に管理されます。このため、プライマリ・インスタンスでオープンされた PDB はスタンバイ側では MOUNTED 状態となります。

プライマリ・インスタンスで PDB をオープンすると、プラガブル・データベース O21APDB1 は READ WRITE 状態（OPEN 状態）に移行します。

```SQL:
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;

DATABASE_ROLE
----------------
PRIMARY

SQL> ALTER PLUGGABLE DATABASE O21APDB1 OPEN;

プラガブル・データベースが変更されました。

SQL> SHOW pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 O21APDB1                       READ WRITE NO
         4 O21APDB2                       MOUNTED
```

一方で、スタンバイ・インスタンス上で確認すると、PDB は MOUNTED 状態のままです。PDB の状態は Data Guard プライマリとスタンバイ間では同期されていないことがわかります。

```SQL:
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;

DATABASE_ROLE
----------------
PHYSICAL STANDBY

SQL> SHOW pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 O21APDB1                       MOUNTED
         4 O21APDB2                       MOUNTED
```

# スタンバイ・インスタンスでの PDB 操作

CDB インスタンスが OPEN 状態ではなく MOUNT 状態でリカバリ実行中の場合、プラガブル・データベースの操作は失敗します。PDB を利用する場合はスタンバイ・インスタンスを OPEN READ ONLY 状態に変更してから ALTER PLUGGABLE DATABASE OPEN 文を実行します。

```SQL:
SQL> SELECT STATUS FROM V$INSTANCE;

STATUS
------------
MOUNTED

SQL> ALTER PLUGGABLE DATABASE o21apdb1 OPEN;
ALTER PLUGGABLE DATABASE o21apdb1 OPEN
*
行1でエラーが発生しました。:
ORA-01109: データベースがオープンされていません。

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

データベースが変更されました。

SQL> ALTER DATABASE OPEN READ ONLY;

データベースが変更されました。

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

データベースが変更されました。

SQL> ALTER PLUGGABLE DATABASE o21apdb1 OPEN;

プラガブル・データベースが変更されました。

```

# インスタンスの再起動と PDB の状態
次回インスタンスが起動したときに PLUGGABLE DATABASE の状態を維持するためには、ALTER PLUGGABLE DATABASE SAVE STATE 文を実行します。

```SQL:
SQL> ALTER PLUGGABLE DATABASE O21APDB1 SAVE STATE;

プラガブル・データベースが変更されました。
```

インスタンス再起動後に PDB の状態を確認すると自動的にオープン状態になります。状態を維持する設定は DBA_PDB_SAVED_STATES ビューで確認できます。

```SQL:
SQL> SELECT con_name, state FROM DBA_PDB_SAVED_STATES;

CON_NAME             STATE
-------------------- --------------
O21APDB1             OPEN
```

上記の状態でスタンバイ・インスタンスを再起動して状態を確認しました。DBA_PDB_SAVED_STATES ビューでは OPEN 状態になるように見えますが、実際の PDB は MOUNTED 状態のままでした。このため Data Guard スタンバイ・インスタンスでは ALTER PLUGGABLE DATABASE SAVE STATE 文は利用できないことがわかります。


```SQL:
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;

DATABASE_ROLE
----------------
PHYSICAL STANDBY

SQL> SELECT name, open_mode FROM v$pdbs;

NAME                           OPEN_MODE
------------------------------ ----------
PDB$SEED                       READ ONLY
O21APDB1                       MOUNTED
O21APDB2                       MOUNTED
```

明日の Advent Calendar は ts_carp さんによる 「[Enterprise Mangaer,Diag,Tuning,RATを活用したOracle Databaseの性能チューニング方法の自己学習に最適なOracle LiveLabsのワークショップご紹介
](https://qiita.com/ts_carp/items/d9e47fccb78df967ed1e)」です。