この記事では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表領域名の変更作業は完了です。