RAC構成でPDBを構築した際のローカルUNDO表領域

この記事ではRAC構成のPDBを構築した際に発生するローカルUNDO表領域の問題を解説します。

 RAC構成のPDBのローカルUNDO表領域

通常、RAC構成のDBを構築するとインスタンスごとに固有のUNDO表領域が作成されます。

2 node RACの場合はそれぞれ「UNDOTBS1」、「UNDOTBS2」という表領域がデフォルトで作成されます。

またマルチテナント環境の場合、ローカルUNDOモードを採用した場合、PDBごとにもUNDO表領域が存在します。

ここで2node RACでマルチテナント環境、ローカルUNDOモードでDBを構築した際のUNDO表領域を確認してみます。


まずはCDBのUNDO表領域を調べてみます。

SQL> select inst_id, con_id, name, value from gv$parameter where name= 'undo_tablespace' order by 1;
   INST_ID     CON_ID NAME                 VALUE
---------- ---------- -------------------- --------------------
         1          1 undo_tablespace      UNDOTBS1
         2          1 undo_tablespace      UNDOTBS2

CDBのUNDO表領域は「UNDOTBS1」、「UNDOTBS2」となっています

続いてPDBのUNDO表領域を調べてみます。

SQL> select inst_id, con_id, name, value from gv$parameter where name= 'undo_tablespace' order by 1;
   INST_ID     CON_ID NAME                 VALUE
---------- ---------- -------------------- --------------------
         1          3 undo_tablespace      UNDO_2
         2          3 undo_tablespace      UNDOTBS1

PDBのUNDO表領域は「UNDOTBS1」、「UNDO_2」となっています。

原因はわかりませんがこのような表領域名になってしまうのはOracleの仕様のようです。


 UNDO表領域名を変える方法

PDBのUNDO表領域名が奇妙な感じですが、動作上は問題はありません。

ただ、やはり少し気持ちが悪いのでUNDO表領域名を「UNDOTBS1」、「UNDOTBS2」に変更します。

UNDO表領域名を変更するには新しくUNDO表領域を作成し、初期化パラメータを変更する必要があります。


まずはPDBで「UNDOTBS2」を作成します。

SQL> create undo tablespace UNDOTBS2 datafile autoextend on;
表領域が作成されました。

次にインスタンスごとに初期化パラメータ「UNDO_TABLESPACE」を設定します。

SQL> alter system set undo_tablespace=UNDOTBS1 sid='XXXXCDB1' scope=spfile;
System altered.
SQL> alter system set undo_tablespace=UNDOTBS2 sid='XXXXCDB2' scope=spfile;
System altered.

DBを再起動後、PDBのUNDO表領域を再度確認します。

SQL> select inst_id, con_id, name, value from gv$parameter where name= 'undo_tablespace' order by 1;
   INST_ID     CON_ID NAME                 VALUE
---------- ---------- -------------------- --------------------
         1          3 undo_tablespace      UNDOTBS1
         2          3 undo_tablespace      UNDOTBS2

UNDO表領域名がきれいになりました。

最後にもともとあった「UNDO_2」表領域を削除します。

SQL> ALTER TABLESPACE UNDO_2 OFFLINE;
表領域が変更されました。
SQL> DROP TABLESPACE UNDO_2 INCLUDING CONTENTS AND DATAFILES;
表領域が削除されました。

以上で、UNDO表領域名の変更作業は完了です。