7 x 24 在线支持!
Oracle 自動 UNDO 管理を使用している UNDO 表領域の変更、再作成方法
ORACLEデータベース によくあるエラ の解決策
プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:service@parnassusdata.com
適用範囲:
Oracle Database - Enterprise Edition - バージョン 9.0.1.0 以降
この文書の内容はすべてのプラットフォームに適用されます。
目的
本文書では、自動 UNDO 管理を使用している環境で、新しい UNDO 表領域を作成
し、現行の UNDO 表領域から変更する方法について説明します。
本文書で紹介している手順は、UNDO 表領域の縮小にも使用可能です。UNDO 表領
域が大きくなってしまった場合などに、本文書で紹介している手順で新しく小さ
な UNDO 表領域を作成することで、大きくなった UNDO 表領域を削除することが
できます。
解決策
[詳細]
UNDO 表領域を変更する手順は以下の通りです。
UNDO 表領域を現行の UNDO 表領域名と同じ名前で再作成を行いたい場合は、以
下の手順を 2 回実行します。その際、1 回目は仮の UNDO 表領域名、2 回目は
現行の UNDO 表領域名を指定してください。
なお、CREATE 文、ALTER 文などの詳細なオプション等については、ご使用のリ
リースの SQL リファレンスをご参照ください。
UNDO 表領域の変更手順
========================================================================
0. 現行の UNDO 表領域の定義を確認したい場合は、以下の SQL で確認します。
* この手順は必須ではありません。必要な場合のみ実施してください。
また、リリース 9.0.1 では、DBMS_METADATA を使用して、表領域の定義
を取得することはできません。DBA_DATA_FILES, DBA_TABLESPACES から、
現在の設定をご確認ください。
SQL> set long 3000
SQL> select dbms_metadata.get_ddl('TABLESPACE','<現行UNDO表領域名>')
from dual;
(実行例)
----------------------------------------------------------------------
SQL> set long 3000
SQL> select dbms_metadata.get_ddl('TABLESPACE','UNDOTBS1') from dual;
DBMS_METADATA.GET_DDL('TABLESPACE','UNDOTBS1')
------------------------------------------------------------------
CREATE UNDO TABLESPACE "UNDOTBS1" DATAFILE
'/app/oracle/oradata/ora102/undotbs01.dbf' SIZE 26214400
AUTOEXTEND ON NEXT 5242880 MAXSIZE 32767M
BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
ALTER DATABASE DATAFILE
'/app/oracle/oradata/ora10204/undotbs01.dbf' RESIZE 2039480320
----------------------------------------------------------------------
1. UNDO 表領域を新たに作成し、ONLINE にします。
SQL> create undo tablespace <新規UNDO表領域名>
datafile '<データファイル・パス>' size <データファイル・サイズ>;
SQL> alter tablespace <新規UNDO表領域名> online;
(実行例)
----------------------------------------------------------------------
SQL> create undo tablespace undotbs2 datafile
2 '/app/oracle/oradata/ora102/undotbs02.dbf' size 100m;
Tablespace created.
SQL> alter tablespace undotbs2 online;
Tablespace altered.
----------------------------------------------------------------------
2. 新規の UNDO 表領域が作成され、STATUS が AVAILABLE になっていることを
確認します。
SQL> set lines 200
SQL> set pages 200
SQL> col file_name for a100
SQL> select tablespace_name, status, file_name from dba_data_files;
(実行例)
----------------------------------------------------------------------
SQL> select tablespace_name, status, file_name from dba_data_files;
TABLESPACE_NAME STATUS FILE_NAME
--------------- --------- --------------------------------------------
USERS AVAILABLE /app/oracle/oradata/ora102/users01.dbf
SYSAUX AVAILABLE /app/oracle/oradata/ora102/sysaux01.dbf
SYSTEM AVAILABLE /app/oracle/oradata/ora102/system01.dbf
EXAMPLE AVAILABLE /app/oracle/oradata/ora102/example01.dbf
UNDOTBS1 AVAILABLE /app/oracle/oradata/ora102/undotbs01.dbf
UNDOTBS2 AVAILABLE /app/oracle/oradata/ora102/undotbs02.dbf <--
----------------------------------------------------------------------
* STATUS が AVAILABLE となっていても、3. の手順で UNDO 表領域の切り
替えを行うまでは、新しく作成した UNDO 表領域は使用されません。
3. UNDO 表領域を切替えます。
- サーバ・パラメータ・ファイル(SPFILE) を使用している場合
SPFILE をご使用の場合は、ALTER SYSTEM 文で変更します。
SQL> alter system set undo_tablespace=<新規UNDO表領域名> scope=both;
(実行例)
--------------------------------------------------------------------
SQL> alter system set undo_tablespace='undotbs2' scope=both;
System altered.
--------------------------------------------------------------------
- 初期化パラメータ・ファイル(PFILE) を使用している場合
PFILE をご使用の場合は、ALTER SYSTEM 文での変更に加え、初期化パラ
メータファイルの UNDO_TABLESPACE の設定値を変更します。
SQL> alter system set undo_tablespace='<新規UNDO表領域名>';
初期化パラメータファイル
UNDO_TABLESPACE=<新規UNDO表領域名>
(実行例)
--------------------------------------------------------------------
SQL> alter system set undo_tablespace='undotbs2';
System altered.
初期化パラメータファイル 変更前: UNDO_TABLESPACE=UNDOTBS1
変更後: UNDO_TABLESPACE=UNDOTBS2
--------------------------------------------------------------------
*1 各ファイルのデフォルトの位置は以下の通りです。
UNIX : $ORACLE_HOME/dbs
Windows : %ORACLE_HOME%/database
*2 該当環境で SPFILE が使用されているかや、ファイル位置の確認方法は、
Document 1721854.1(KROWN:63897) を参照してください。
4. 今まで使用していた UNDO 表領域を以下の SQL で監視します。
SQL> select dr.tablespace_name, dr.segment_name, vr.status
from dba_rollback_segs dr, v$rollstat vr
where dr.segment_id=vr.usn;
STATUS が "PENDING OFFLINE" のセグメントが消えるまで監視してください。
完全に OFFLINE となると、現行 UNDO 表領域名のレコードはなくなります。
(実行例)
----------------------------------------------------------------------
SQL> select dr.tablespace_name, dr.segment_name, vr.status
2 from dba_rollback_segs dr, v$rollstat vr
3 where dr.segment_id=vr.usn;
TABLESPACE_NAME SEGMENT_NAME STATUS
--------------- ------------ ---------------
SYSTEM SYSTEM ONLINE
UNDOTBS1 _SYSSMU1$ PENDING OFFLINE <--
UNDOTBS1 _SYSSMU3$ PENDING OFFLINE <--
UNDOTBS2 _SYSSMU11$ ONLINE
UNDOTBS2 _SYSSMU12$ ONLINE
UNDOTBS2 _SYSSMU13$ ONLINE
UNDOTBS2 _SYSSMU14$ ONLINE
UNDOTBS2 _SYSSMU15$ ONLINE
UNDOTBS2 _SYSSMU16$ ONLINE
UNDOTBS2 _SYSSMU17$ ONLINE
UNDOTBS2 _SYSSMU18$ ONLINE
UNDOTBS2 _SYSSMU19$ ONLINE
UNDOTBS2 _SYSSMU20$ ONLINE
----------------------------------------------------------------------
*1 STATUS の "PENDING OFFLINE" は、該当の UNDO 表領域が使用中のため、
OFFLINE への切り替えを待機している状況を示します。
*2 SYSTEM 表領域の UNDO セグメントはデフォルトで作成されるものです。
この作業では無視してください。
*3 リリース 11.1 以降では SEGMENT_NAME のフォーマットが _SYSSMUn から
_SYSSMUn_nnnnnnnnnn$ に変更なっていますが、手順は同様です。
もし、"PENDING OFFLINE" の STATUS が変わらない場合や、実行中の処理より
UNDO 表領域の変更を優先する場合は、"shutdown immediate" でインスタンス
の再起動を行ってください。
[注意事項]
1) インスタンスの停止に "shutdown abort" は使用しないで下さい。
2) インスタンスを停止した場合も、5. の作業が完了するまで、UNDO 表領
域のデータファイルを OS 上で削除しないでください。
5. 今まで使用していた UNDO 表領域のセグメントが完全に OFFLINE になったら
UNDO 表領域を削除します。
SQL> drop tablespace <現行UNDO表領域名> including contents and
datafiles;
(実行例)
----------------------------------------------------------------------
SQL> drop tablespace undotbs1 including contents and datafiles;
Tablespace dropped.
----------------------------------------------------------------------
6. 今まで使用していた UNDO 表領域が削除されていることを確認します。
SQL> set lines 200
SQL> set pages 200
SQL> col file_name for a100
SQL> select tablespace_name, status, file_name from dba_data_files;
(実行例)
----------------------------------------------------------------------
SQL> select tablespace_name, status, file_name from dba_data_files;
TABLESPACE_NAME STATUS FILE_NAME
--------------- --------- --------------------------------------------
USERS AVAILABLE /app/oracle/oradata/ora102/users01.dbf
SYSAUX AVAILABLE /app/oracle/oradata/ora102/sysaux01.dbf
SYSTEM AVAILABLE /app/oracle/oradata/ora102/system01.dbf
EXAMPLE AVAILABLE /app/oracle/oradata/ora102/example01.dbf
UNDOTBS2 AVAILABLE /app/oracle/oradata/ora102/undotbs02.dbf
--> UNDOTBS1 が削除されていることが確認できます。
----------------------------------------------------------------------
========================================================================
[FAQ]
Q1. 4. の手順で "PENDING OFFLINE" が解消されないため、再起動も検討してい
ますが、どの処理が UNDO を使用しているか不明なため、再起動を行って良
いかの判断ができません。
UNDO を使用している処理を特定する方法はありますか。
A1. 以下のような SQL で UNDO を使用しているセッションの情報を確認するこ
とができます。
-----------------------------------------------------------------
select r.segment_name, t.xidusn, s.username, s.osuser, s.process,
s.machine, s.terminal, s.program
from dba_rollback_segs r,v$transaction t, v$session s
where r.segment_id = t.xidusn
and t.addr= s.taddr;
-----------------------------------------------------------------
Q2. 4. の手順で "PENDING OFFLINE" が解消されないため再起動を行います。再
起動を早く行うため "shutdown abort" で行っても良いでしょうか。
A2. "shutdown abort" では、起動時にトランザクションのリカバリ処理を行う
ため、再起動後に切り替え前の UNDO が必要となります。UNDO 表領域の切
り替えを行う場合は、UNDO を開放するため、"shutdown immediate" でイン
スタンスを停止してください。
Q3. 4. の手順でインスタンスを停止しました。切り替え前の UNDO 表領域の
データファイルを OS 上から削除しても良いでしょうか。
A3. データファイルの削除は、5. の "drop tablespace" コマンドで行ってくだ
さい。データベースの内部情報と整合性を取るため、"drop tablespace" コ
マンドを実行する前に、rm コマンドなどで OS 上からデータファイルを削
除しないでください。
[参照情報]
マニュアル『Oracle Database SQL リファレンス 11g リリース1(11.1)』
マニュアル『Oracle Database SQL リファレンス 10g リリース2(10.2)』
マニュアル『Oracle Database SQL リファレンス 10g リリース1(10.1)』
マニュアル『Oracle9i SQL リファレンス リリース2(9.2)』
マニュアル『Oracle9i SQL リファレンス リリース1(9.0.1)』