Pluggable Database の UNDO 表領域切り替えを試す（Oracle Database 19c)

Pluggable Database 環境では、UNDO 表領域を CDB で一括管理する方法と、各 PDB で独自に保持する方法を選択できます。本記事ではこれらの切り替え方法を試しました。

# データベース作成時の設定
Database Configuration Assistant (DBCA) でデータベースを作成する場合は「Use Local Undo tablespace for PDBs」項目で選択を行います。CREATE DATABASE 文の[デフォルト](https://docs.oracle.com/cd/F19136_01/sqlrf/CREATE-DATABASE.html#GUID-ECE717DF-F116-4151-927C-2E51BB9DD39C)は LOCAL UNDO OFF ですが、DBCA のデフォルトはチェックされてます（＝LOCAL UNDO ON）。

![DBCA](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/e24b3b35-d6e3-91a3-e8e7-9a395b0a3d91.png)

DBCA で生成された SQL 文を確認すると、LOCAL UNDO 句が指定されていることがわかります。

```
CREATE DATABASE "O19A"
MAXINSTANCES 8
... 途中省略 ...
USER SYS IDENTIFIED BY "&&sysPassword" USER SYSTEM IDENTIFIED BY "&&systemPassword"
enable pluggable database
seed file_name_convert=('/u01/app/oracle/oradata/O19A/system01.dbf','/u01/app/oracle/oradata/O19A/pdbseed/system01.dbf','/u01/app/oracle/oradata/O19A/sysaux01.dbf','/u01/app/oracle/oradata/O19A/pdbseed/sysaux01.dbf','/u01/app/oracle/oradata/O19A/temp01.dbf','/u01/app/oracle/oradata/O19A/pdbseed/temp01.dbf','/u01/app/oracle/oradata/O19A/undotbs01.dbf','/u01/app/oracle/oradata/O19A/pdbseed/undotbs01.dbf') 
LOCAL UNDO ON;
```

# 確認方法
現状を確認するには、DATABASE_PROPERTIES ビューを検索します。下記の例では現在 Local Undo モードが有効になっていることがわかります。

```
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
    FROM   DATABASE_PROPERTIES
    WHERE  PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
LOCAL_UNDO_ENABLED             TRUE
```

下記の例では CDB と PDB1 はそれぞれ別の名前の UNDO 表領域を指定しています。

```
SQL> ALTER SESSION SET CONTAINER=cdb$root;

セッションが変更されました。 

SQL> SHOW PARAMETER undo_tablespace

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBSC

SQL> ALTER SESSION SET CONTAINER=pdb1;

セッションが変更されました。

SQL> SHOW PARAMETER undo_tablespace;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1
```

# 切り替え方法
Local Undo モードの切り替えは ALTER DATABASE LOCAL UNDO 文を実行します。ただし、インスタンスを UPGRADE モードに変更する必要があるため再起動が必要です。通常モードで ALTER DATABASE 文を実行するとエラーが発生します。

```
SQL> ALTER DATABASE LOCAL UNDO OFF;
ALTER DATABASE LOCAL UNDO OFF
*
行1でエラーが発生しました。:
ORA-65192: この操作ではデータベースがUPGRADEモードである必要があります
```

インスタンスを停止し、UPGRADE モードで再実行します。その後もう一度インスタンスの再起動を行います。

```
SQL> SHUTDOWN IMMEDIATE
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。

SQL> STARTUP UPGRADE
ORACLEインスタンスが起動しました。

Total System Global Area 1660941712 bytes
Fixed Size                  9135504 bytes
Variable Size             956301312 bytes
Database Buffers          687865856 bytes
Redo Buffers                7639040 bytes
データベースがマウントされました。
データベースがオープンされました。

SQL> ALTER DATABASE LOCAL UNDO OFF;

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

SQL> SHUTDOWN IMMEDIATE
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。

SQL> STARTUP
ORACLEインスタンスが起動しました。

Total System Global Area 1660941712 bytes
Fixed Size                  9135504 bytes
Variable Size             956301312 bytes
Database Buffers          687865856 bytes
Redo Buffers                7639040 bytes
データベースがマウントされました。
データベースがオープンされました。
```

# モード変更後の確認
Local Undo モードが変わっていることを確認します。

```
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
      FROM   DATABASE_PROPERTIES
      WHERE  PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
LOCAL_UNDO_ENABLED             FALSE
```

Local Undo モードをオンからオフに変更しても、PDB の初期化パラメーター undo_tablespace は変更されません。

```
SQL> ALTER SESSION SET CONTAINER=pdb1;

セッションが変更されました。

SQL> SHOW PARAMETER undo_tablespace;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1
```

しかし初期化パラメーターの変更は許可されません。

```
SQL> ALTER SYSTEM SET undo_tablespace=undotbs2;
ALTER SYSTEM SET undo_tablespace=undotbs2
*
行1でエラーが発生しました。:
ORA-65040: プラガブル・データベース内からの操作は許可されていません
```

これは Local Undo モードの変更に伴い、初期化パラメーターの属性 ispdb_modifiable が変更されることによります。Local Undo モードをオンにした場合は ispdb_modifieable = TRUE の状態です。

```
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id FROM V$system_parameter
       WHERE name = 'undo_tablespace';

NAME                           VALUE                          ISPDB ISSYS_MOD     CON_ID
------------------------------ ------------------------------ ----- --------- ----------
undo_tablespace                UNDOTBSC                       TRUE  IMMEDIATE          0
undo_tablespace                                               TRUE  IMMEDIATE          2
undo_tablespace                UNDOTBS1                       TRUE  IMMEDIATE          3
```

しかし Local Undo モードをオフに変更した場合は ispdb_modifieable = FALSE になります。

```
SQL> SELECT name, value, ispdb_modifiable, issys_modifiable, con_id FROM V$system_parameter
     WHERE name = 'undo_tablespace';

NAME                           VALUE                          ISPDB ISSYS_MOD     CON_ID
------------------------------ ------------------------------ ----- --------- ----------
undo_tablespace                UNDOTBSC                       FALSE IMMEDIATE          0
undo_tablespace                                               FALSE IMMEDIATE          2
undo_tablespace                UNDOTBS1                       FALSE IMMEDIATE          3
```