Pluggable Database 環境では、UNDO 表領域を CDB で一括管理する方法と、各 PDB で独自に保持する方法を選択できます。本記事ではこれらの切り替え方法を試しました。
データベース作成時の設定
Database Configuration Assistant (DBCA) でデータベースを作成する場合は「Use Local Undo tablespace for PDBs」項目で選択を行います。CREATE DATABASE 文のデフォルトは LOCAL UNDO OFF ですが、DBCA のデフォルトはチェックされてます(=LOCAL UNDO ON)。
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