UJP - UNDO領域のメンテナンス ORA-03297もでたし

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

  • カテゴリ ハウツー の最新配信
  • RSS
  • RDF
  • ATOM

ブログ - UNDO領域のメンテナンス ORA-03297もでたし

UNDO領域のメンテナンス ORA-03297もでたし

カテゴリ : 
ハウツー
ブロガー : 
ujpblog 2019/4/4 23:26
 Oracle 9i以降では,トランザクションログがUNDO表領域という所に保存されるのだけれど,Oracle 11g XEだとUNDO領域は自動拡張autoextentするので,ほっといたら容量が大変大きくなっていたりした.
 今回は,それを小さくする手順を確認する.

現在の状態を確認

 表領域用のファイルとファイルサイズを確認.
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>
 200MBの領域が確保されている.そのうちの,実際のデータ使用量を確認.
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>
 表領域のファイルがファイルが200MBで利用量が39MBとなっていることが確認できた.

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>
 エラーORA-03297がでた.これは「ファイルに、要求されたRESIZE値を超える使用済みデータが含まれています」というエラー.今回の場合、200MBの表領域の中で、データが散らばって保管されているので、100MBにできない模様.

表領域を切り替える

 断片化したUNDO表領域を小さくすることができなかったので、UNDO表領域を新たに作成して、切り替える.
 UNDO領域を確認する.
SQL> show parameter undo_🆑

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1🈁
SQL>
 現在のUNDO表領域はUNDOTBS1という名前だとわかる.新しい表領域を作成する.
SQL> create undo tablespace UNDOTBS2 datafile '/u01/app/oracle/oradata/XE/undotbs2.dbf' size 50M;🆑

Tablespace created.

SQL>
 UNDOTBS2という名前で新しく作成した.
 新しい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>
 UNDO表領域を削除する.
SQL> drop tablespace undotbs1 including contents and datafiles cascade constraints;🆑

Tablespace dropped.

SQL>
 cascadeすることでファイルも消える.
 表領域のファイルを確認.
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>
autoextensibleがNOになっているので、自動拡張されない.
 自動拡張を有効にする場合は、次のようにAUTOEXTENDをONにする.
SQL> alter database datafile '/u01/app/oracle/oradata/XE/undotbs3.db' autoextend on;🆑

Database altered.

SQL>

UNDO表領域の解放

alter rollback segment undotbs1 shrink;🆑

トラックバック


広告スペース
Google