ブログ - UNDO領域のメンテナンス ORA-03297もでたし
 Oracle 9i以降では,トランザクションログがUNDO表領域という所に保存されるのだけれど,Oracle 11g XEだとUNDO領域は自動拡張autoextentするので,ほっといたら容量が大変大きくなっていたりした.
今回は,それを小さくする手順を確認する.
現在の状態を確認
表領域用のファイルとファイルサイズを確認.
 200MBの領域が確保されている.そのうちの,実際のデータ使用量を確認.
 表領域のファイルがファイルが200MBで利用量が39MBとなっていることが確認できた.
UNDO表領域を小さくする
200MB中の40MB弱程度しか使ってないので,UNDO表領域を50MBに変更する.
 エラーORA-03297がでた.これは「ファイルに、要求されたRESIZE値を超える使用済みデータが含まれています」というエラー.今回の場合、200MBの表領域の中で、データが散らばって保管されているので、100MBにできない模様.
表領域を切り替える
断片化したUNDO表領域を小さくすることができなかったので、UNDO表領域を新たに作成して、切り替える.
UNDO領域を確認する.
 現在のUNDO表領域はUNDOTBS1という名前だとわかる.新しい表領域を作成する.
 UNDOTBS2という名前で新しく作成した.
新しいUNDO表領域に切り替える.
 切り替わったか確認する.
 切り替わりました.
不要となったUNDO表領域を削除する
表領域のファイルを確認.
 UNDO表領域を削除する.
 cascadeすることでファイルも消える.
表領域のファイルを確認.
 切り替え後の状態を確認.
 これで、古い表領域を消して、新しい小さな表領域に切り替わった.
自動拡張を停止する
長期間のUNDO領域を必要としてない場合、拡張されない様にしておきたい.
現在の設定を確認する.
 autoextensibleがNOになっているので、自動拡張されない.
自動拡張を有効にする場合は、次のようにAUTOEXTENDをONにする.
UNDO表領域の解放
今回は,それを小さくする手順を確認する.
現在の状態を確認
表領域用のファイルとファイルサイズを確認.
SQL> col name for a50🆑
SQL> select name,bytes / 1024 / 1024 as SIZE_MB  from v$datafile order by name;🆑
NAME                                                  SIZE_MB
-------------------------------------------------- ----------
/u01/app/oracle/oradata/XE/app_idx_tbs.dbf                 10
/u01/app/oracle/oradata/XE/app_tbs.dbf               8204.375
/u01/app/oracle/oradata/XE/sysaux.dbf                     770
/u01/app/oracle/oradata/XE/system.dbf                     370
/u01/app/oracle/oradata/XE/undotbs1.dbf                   200🈁
/u01/app/oracle/oradata/XE/users.dbf                      100
7 rows selected.
SQL>
SQL> col tablespace_name for a15🆑
SQL> col MB format 9999.99🆑
SQL> select tablespace_name,sum(bytes)/1024/1024 as MB from dba_segments group by tablespace_name🆑
  2  order by tablespace_name;🆑
TABLESPACE_NAME       MB
--------------- --------
app_TBS          7811.88
SYSAUX            721.13
SYSTEM            366.94
UNDOTBS1           39.56🈁
USERS               1.56
6 rows selected.
SQL>
UNDO表領域を小さくする
200MB中の40MB弱程度しか使ってないので,UNDO表領域を50MBに変更する.
SQL> alter database datafile '/u01/app/oracle/oradata/XE/undotbs1.dbf' resize 50m;🆑
alter database datafile '/u01/app/oracle/oradata/XE/undotbs1.dbf' resize 50m
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value🈁
SQL>
表領域を切り替える
断片化したUNDO表領域を小さくすることができなかったので、UNDO表領域を新たに作成して、切り替える.
UNDO領域を確認する.
SQL> show parameter undo_🆑
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1🈁
SQL>
SQL> create undo tablespace UNDOTBS2 datafile '/u01/app/oracle/oradata/XE/undotbs2.dbf' size 50M;🆑
Tablespace created.
SQL>
新しいUNDO表領域に切り替える.
SQL> alter system set undo_tablespace = 'UNDOTBS2';🆑
System altered.
SQL>
SQL> show parameter undo;🆑
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS2🈁
SQL>
不要となったUNDO表領域を削除する
表領域のファイルを確認.
SQL> col name for a50🆑
SQL> select name,bytes / 1024 / 1024 as SIZE_MB  from v$datafile order by name;🆑
NAME                                                  SIZE_MB
-------------------------------------------------- ----------
/u01/app/oracle/oradata/XE/app_idx_tbs.dbf                 10
/u01/app/oracle/oradata/XE/app_tbs.dbf               8204.375
/u01/app/oracle/oradata/XE/sysaux.dbf                     770
/u01/app/oracle/oradata/XE/system.dbf                     370
/u01/app/oracle/oradata/XE/undotbs1.dbf                   200🈁
/u01/app/oracle/oradata/XE/undotbs2.dbf                    50
/u01/app/oracle/oradata/XE/users.dbf                      100
8 rows selected.
SQL>
SQL> drop tablespace undotbs1 including contents and datafiles cascade constraints;🆑
Tablespace dropped.
SQL>
表領域のファイルを確認.
SQL> select name,bytes / 1024 / 1024 as SIZE_MB  from v$datafile order by name;🆑
NAME                                                  SIZE_MB
-------------------------------------------------- ----------
/u01/app/oracle/oradata/XE/app_idx_tbs.dbf                 10
/u01/app/oracle/oradata/XE/app_tbs.dbf               8204.375
/u01/app/oracle/oradata/XE/sysaux.dbf                     770
/u01/app/oracle/oradata/XE/system.dbf                     370
/u01/app/oracle/oradata/XE/undotbs2.dbf                    50🈁
/u01/app/oracle/oradata/XE/users.dbf                      100
6 rows selected.
SQL>
SQL> select tablespace_name,sum(bytes)/1024/1024 as MB from dba_segments group by tablespace_name🆑
  2  order by tablespace_name;🆑
TABLESPACE_NAME       MB
--------------- --------
app_TBS          7811.88
SYSAUX            721.19
SYSTEM            366.94
UNDOTBS2            1.25🈁
USERS               1.56
SQL>
自動拡張を停止する
長期間のUNDO領域を必要としてない場合、拡張されない様にしておきたい.
現在の設定を確認する.
SQL> col file_name for a50🆑
SQL> col autoextensible for a3🆑
SQL> select file_name,autoextensible from dba_data_files;🆑
FILE_NAME                                          AUT
-------------------------------------------------- ---
/u01/app/oracle/oradata/XE/users.dbf               YES
/u01/app/oracle/oradata/XE/sysaux.dbf              YES
/u01/app/oracle/oradata/XE/system.dbf              YES
/u01/app/oracle/oradata/XE/app_tbs.dbf             YES
/u01/app/oracle/oradata/XE/app_idx_tbs.dbf         YES
/u01/app/oracle/oradata/XE/undotbs2.dbf             NO🈁
6 rows selected.
SQL>
自動拡張を有効にする場合は、次のようにAUTOEXTENDをONにする.
SQL> alter database datafile '/u01/app/oracle/oradata/XE/undotbs3.db' autoextend on;🆑
Database altered.
SQL>
UNDO表領域の解放
alter rollback segment undotbs1 shrink;🆑

