UJP - 技術情報

Life is fun and easy!

不正IP報告数

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

     

ORA-01555 snapshot too old 〜ロールバックセグメントの管理〜

ORA-01555 snapshot too old

〜ロールバックセグメントの管理〜


0.更新履歴

  • 2001.12.14 新規作成

1.エラー内容

  • データベース全体をexportしていたら,次のようなエラーが表示されて停止した.

. 表         DOWNLOADEDをエクスポートしています     864387行エクスポートされました。
. 表         MESSAGEをエクスポートしています
EXP-00056: Oracleエラー 1555が発生しました。
ORA-01555: snapshot too old: rollback segment number 3 with name "RBS2" too small
EXP-00008: Oracleエラー 1555が発生しました。
ORA-01555: snapshot too old: rollback segment number 3 with name "RBS2" too small
EXP-00000: エラーが発生したためエクスポートを終了します。
    

2.原因

  • Oracleでは,「読み取り一貫性」のを保とうとするが,Rollbackセグメントに対して変更が多い場合,それが保証されないため,このエラーが発生する.
  • よって,ロールバックセグメントを拡張する.

3.対処

3.1.現状分析

  • 現在の表領域を確認する.

select tablespace_name,sum(bytes)
from dba_data_files group by tablespace_name;

SQL> select tablespace_name,sum(bytes)
  2  from dba_data_files group by tablespace_name;

TABLESPACE_NAME                                              SUM(BYTES)
------------------------------------------------------------ ----------
DRSYS                                                          20971520
INDX                                                           20971520
RBS                                                           131072000
SYSTEM                                                        350879744
TEMP                                                           20971520
TOOLS                                                          10485760
USERS                                                          20971520

10行が選択されました。

SQL> 

  • ロールバックセグメント用の表領域(RBS)が,約125MB作成されている.
  • 次に,RBSの空き領域を調べる.

select sum(bytes) from dba_free_space
where tablespace_name = 'RBS';

SQL> select sum(bytes) from dba_free_space
  2    where tablespace_name = 'RBS';

SUM(BYTES)
----------
 101703680

SQL> 

  • 約96.9MBの空き領域があることが確認できる.

set pagesize 50
select segment_name,initial_extent,next_extent,bytes
from dba_segments
where segment_type = 'ROLLBACK';

SQL> set pagesize 50
SQL> select segment_name,initial_extent,next_extent,bytes
  2  from dba_segments
  3  where segment_type = 'ROLLBACK';

SEGMENT_NAME
-----------------------------------------------------------
INITIAL_EXTENT NEXT_EXTENT      BYTES
-------------- ----------- ----------
SYSTEM
         57344       57344     589824
RBS0
        524288      524288    4194304
RBS1
        524288      524288    4194304
RBS2
        524288      524288    4194304
RBS3
        524288      524288    4194304
RBS4
        524288      524288    4194304
RBS5
        524288      524288    4194304
RBS6
        524288      524288    4194304

8行が選択されました。

SQL> 

  • RBS0〜RBS6までの7つのセグメントが存在する.
  • 1つのセグメントに,4194304Byte(4096KB=4MB)存在している.
  • つまり,ロールバックセグメントで,4MB×7=28MBのディスク容量を表領域RBS上に取得しているので,

125MB(RBS表領域)-4MB(1ロールバックセグメント)×7個=空き容量97MB

  • の計算で一致する.

3.2.対策

  • 表領域RBSに空きがあるため,ロールバックセグメントを増やす事で対処する.
    • ロールバックセグメントを,表領域RBS上に作成する.
    • 作成したロールバックセグメントを,オンラインにする.
    • init.oraを書き換えて,再起動後も自動的にオンラインになるように設定する.
  • RBS8〜RBS15セグメントを作成する.

SQL> CREATE ROLLBACK SEGMENT "RBS8" TABLESPACE "RBS" 
  2   STORAGE ( INITIAL 512K NEXT 512K OPTIMAL 4096K MAXEXTENTS 4096);

ロールバック・セグメントが作成されました。

SQL> CREATE ROLLBACK SEGMENT "RBS9" TABLESPACE "RBS"
  2   STORAGE ( INITIAL 512K NEXT 512K OPTIMAL 4096K MAXEXTENTS 4096);

ロールバック・セグメントが作成されました。

SQL> CREATE ROLLBACK SEGMENT "RBS10" TABLESPACE "RBS"
  2   STORAGE ( INITIAL 512K NEXT 512K OPTIMAL 4096K MAXEXTENTS 4096);

ロールバック・セグメントが作成されました。

SQL> CREATE ROLLBACK SEGMENT "RBS11" TABLESPACE "RBS"
  2   STORAGE ( INITIAL 512K NEXT 512K OPTIMAL 4096K MAXEXTENTS 4096);

ロールバック・セグメントが作成されました。

SQL> CREATE ROLLBACK SEGMENT "RBS12" TABLESPACE "RBS"
  2   STORAGE ( INITIAL 512K NEXT 512K OPTIMAL 4096K MAXEXTENTS 4096);

ロールバック・セグメントが作成されました。

SQL> CREATE ROLLBACK SEGMENT "RBS13" TABLESPACE "RBS"
  2   STORAGE ( INITIAL 512K NEXT 512K OPTIMAL 4096K MAXEXTENTS 4096);

ロールバック・セグメントが作成されました。

SQL> CREATE ROLLBACK SEGMENT "RBS14" TABLESPACE "RBS"
  2   STORAGE ( INITIAL 512K NEXT 512K OPTIMAL 4096K MAXEXTENTS 4096);

ロールバック・セグメントが作成されました。

SQL> CREATE ROLLBACK SEGMENT "RBS15" TABLESPACE "RBS"
  2   STORAGE ( INITIAL 512K NEXT 512K OPTIMAL 4096K MAXEXTENTS 4096);
ロールバック・セグメントが作成されました。

SQL>

  • 作成されたセグメントを確認する.

SQL> set pagesize 60
SQL> select segment_name,initial_extent,next_extent,byte
  2  from dba_segments
  3  where segment_type = 'ROLLBACK';

SEGMENT_NAME
--------------------------------------------------------
INITIAL_EXTENT NEXT_EXTENT      BYTES
-------------- ----------- ----------
SYSTEM
         57344       57344     589824
RBS0
        524288      524288    4194304
RBS1
        524288      524288    4194304
RBS2
        524288      524288    4194304
RBS3
        524288      524288    4194304
RBS4
        524288      524288    4194304
RBS5
        524288      524288    4194304
RBS6
        524288      524288    4194304
RBS8
        524288      524288    4194304
RBS9
        524288      524288    4194304
RBS10
        524288      524288    4194304
RBS11
        524288      524288    4194304
RBS12
        524288      524288    4194304
RBS13
        524288      524288    4194304
RBS14
        524288      524288    4194304
RBS15
        524288      524288    4194304

16行が選択されました。

SQL> 

  • 表領域RBSの空き容量も確認する.
  • 8個×4MB=32MB分減っているはず.

SQL> select sum(bytes) from dba_free_space
  2  where tablespace_name = 'RBS';

SUM(BYTES)
----------
  68149248

SQL> 

  • 約65MBなので計算に一致する.
  • 作成したロールバックセグメントの状態を確認する.

select segment_name,status
from dba_rollback_segs;

SQL> select segment_name,status
  2  from dba_rollback_segs;

SEGMENT_NAME
-----------------------------------
STATUS
--------------------------------
SYSTEM
ONLINE
RBS0
ONLINE
RBS1
ONLINE
RBS2
ONLINE
RBS3
ONLINE
RBS4
ONLINE
RBS5
ONLINE
RBS6
ONLINE
RBS8
OFFLINE
RBS9
OFFLINE
RBS10
OFFLINE
RBS11
OFFLINE
RBS12
OFFLINE
RBS13
OFFLINE
RBS14
OFFLINE
RBS15
OFFLINE

16行が選択されました。
SQL> 

  • OFFLINEになって使われていないことがわかる.
  • よって,ロールバックセグメントを利用できるように,オンラインにする.

SQL> alter rollback segment rbs8 online;

ロールバック・セグメントが変更されました。

SQL> alter rollback segment rbs9 online;

ロールバック・セグメントが変更されました。

SQL> alter rollback segment rbs10 online;

ロールバック・セグメントが変更されました。

SQL> alter rollback segment rbs11 online;

ロールバック・セグメントが変更されました。

SQL> alter rollback segment rbs12 online;

ロールバック・セグメントが変更されました。

SQL> alter rollback segment rbs13 online;

ロールバック・セグメントが変更されました。

SQL> alter rollback segment rbs14 online;

ロールバック・セグメントが変更されました。

SQL> alter rollback segment rbs15 online;

ロールバック・セグメントが変更されました。

SQL> 

  • 再度状態を確認する.

SQL> select segment_name,status
  2  from dba_rollback_segs;

SEGMENT_NAME
---------------------------------
STATUS
--------------------------------
SYSTEM
ONLINE
RBS0
ONLINE
RBS1
ONLINE
RBS2
ONLINE
RBS3
ONLINE
RBS4
ONLINE
RBS5
ONLINE
RBS6
ONLINE
RBS8
ONLINE
RBS9
ONLINE
RBS10
ONLINE
RBS11
ONLINE
RBS12
ONLINE
RBS13
ONLINE
RBS14
ONLINE
RBS15
ONLINE

16行が選択されました。

SQL> 

  • 再起動後に自動的にロールバックセグメントが有効になるよう,init.oraファイルを編集する.
  • まず,現在の設定を確認する.

# If using private rollback segments, place lines of the following
# form in each of your instance-specific init.ora files:
#rollback_segments = ( RBS0, RBS1, RBS2, RBS3, RBS4, RBS5, RBS6 )

  • コメントアウトされているので,標準の動作しかしていないようである.
  • 以下のように書き換えて,RBS15番までを有効にする.

# form in each of your instance-specific init.ora files:
rollback_segments = (
RBS0, RBS1, RBS2, RBS3, RBS4, RBS5, RBS6, RBS7, RBS8, RBS9, 
RBS10, RBS11, RBS12, RBS13, RBS14, RBS15 )

  • 以上.

参考資料

  • Oracleのサポートページ
  • Oracle8i DBAハンドブック CHAPTER7 ロールバックセグメントの管理



広告スペース
Google