UNDOに関する検証 その1

投稿日: 2003年1月15日

<UNDOに関する検証その1>
ペンネーム:クレイジーボーダー

初めてメルマガを書く。胸が痛い。緊張ではない。ただ、スノーボード中、
レールから落下したケガが3週間たっても直らない・・・まあ、そんなことは
いいとして、2003年がんばるぞー。

これから行なう検証はすべて OS Solaris8 Oracle 9.2.0.1.0の環境で行なう。

1.イントロダクション
Oracle9i以前は、”UNDO”の代わりに”ロールバック”という言葉を使用していた。
データベース管理者(DBA)は、UNDOデータを扱うために、UNDO領域ではなくロー
ルバック・セグメントを管理する必要があった。

ロールバック・セグメントは管理が複雑な機能の1つである。エラーメッセージ
(ORA-1555 スナップショットが古すぎます)は、(見慣れた?)メッセージである。
Oracle9iからは、UNDO領域を使用することによりUNDOデータの管理が改善された。

さて、「UNDOってそもそも何?」っていったビギナーレベルから、自動UNDO管
理機能モードのメリット・デメリットを検証していきたい。

2.概要
UNDO領域とは、UNDOデータを格納する領域である。Oracle9iでは、起動時に2
つのモードを選択できる。Oracle9i以前のようなロールバック・セグメントを
利用する手動UNDO管理モード(manual)とOracle9i新機能のUNDO領域を利用する
自動UNDO管理モード(auto)である。

2つのモードは、初期化パラメータundo_managementで設定できる。ただし、
2つのモードを同時に、同じインスタンス内で使用することはできない。
UNDO管理モードを切り替えるには、初期化パラメータを変更後、再起動する
必要がある。

Oracle9iでは自動UNDO管理機能モードを利用し、UNDOデータを上書きするまで
の保存期間を制御することができる。便利そうな機能である。
この保存期間についても、次回以降に検証していきたい。

UNDOデータ管理の目的は、モード問わず以下の3つである。

(1)読み込み一貫性の提供
(2)ROLLBACK文を発行した時のトランザクションのロールバック
(3)データベースのリカバリ

読み取り一貫性とは、あるユーザが変更しているコミットされていない情報を、
他のユーザがアクセスした時に、更新処理中の情報を取得するのではなく、
変更前の情報を提供する機能である。

ロールバックについては、コミットされていない変更処理を取り消します。

リカバリ機能は、データベースリカバリ時に、ロールフォワードを行なった後
に、コミットされていない変更が取り消される。

3.使用方法
自動UNDO管理機能を使用するには、2つの方法がある。
(a) データベース作成の際のcreate database文を実行

SQL> STARTUP NOMOUNT PFILE=/EXPORT/HOME/MAG920/DBS/INITMAG920.ORA

INITMAG920.ORAの一部抜粋
INSTANCE_NAME='MAG920'
UNDO_MANAGEMENT='AUTO'
UNDO_RETENTION=10800
UNDO_TABLESPACE='UNDOTBL_01'
...

SQL> @CREATEDB.SQL
CREATEDB.SQLの内容:

CREATE DATABASE MAG920
  CONTROLFILE REUSE
  MAXLOGFILES 4
  MAXLOGMEMBERS 2
  MAXDATAFILES 100
  MAXLOGHISTORY 1
  MAXINSTANCES 1
LOGFILE
  GROUP 1 ('/EXPORT/HOME/MAG920/ORADATA/MAG920/LOG1A.RDO',
           '/EXPORT/HOME/MAG920/ORADATA/MAG920/LOG1B.RDO') SIZE 100M,
  GROUP 2 ('/EXPORT/HOME/MAG920/ORADATA/MAG920/LOG2A.RDO',
           '/EXPORT/HOME/MAG920/ORADATA/MAG920/LOG2B.RDO') SIZE 100M,
  GROUP 3 ('/EXPORT/HOME/MAG920/ORADATA/MAG920/LOG3A.RDO',
           '/EXPORT/HOME/MAG920/ORADATA/MAG920/LOG3B.RDO') SIZE 100M
DATAFILE
  '/EXPORT/HOME/MAG920/ORADATA/MAG920/DATA01.DBF' SIZE 50M AUTOEXTEND ON,
  '/EXPORT/HOME/MAG920/ORADATA/MAG920/DATA02.DBF' SIZE 50M AUTOEXTEND ON,
  '/EXPORT/HOME/MAG920/ORADATA/MAG920/DATA03.DBF' SIZE 50M AUTOEXTEND ON
UNDO TABLESPACE UNDOTBS_01
  DATAFILE '/EXPORT/HOME/MAG920/ORADATA/MAG920/UNDO01.DBF'
  SIZE 100M REUSE AUTOEXTEND ON;

(b) 既存のデータベースに、create undo tablespace文を実行

SQL> CREATE UNDO TABLESPACE UNDOTBS_02
    DATAFILE '/HOME/MAG920/ORADATA/MAG920/UNDO02.DBF'
    SIZE 100M REUSE AUTOEXTEND ON;

4.初期化パラメータについて
ここで登場する、UNDO_MANAGEMENT、UNDO_RETENTION、UNDO_TABLESPACE、また、
UNDO_SUPPRESS_ERRORSについては、「フラッシュバッククエリーに関する検証
その2」を参照して欲しい。
そこでは、初期化パラメータの追加・優先順位について説明している。

5.ロールバック・セグメントについて
詳細については、以前のメルマガ「ロールバック・セグメントに関する検証」を
参照して欲しい。役立つ情報が満載である。

さて、来週以降、この作成したUNDO領域を使っていろいろ検証していく。例えば、
UNDO領域の変更、その他のパラメータ変更、UNDOデータ統計、QUOTAについて
である。楽しみである。

以上、海が近いのに、山が私を呼んでいる茅ヶ崎にて