|
ORA-01555 snapshot too old 〜ロールバックセグメントの管理〜
ORA-01555 snapshot too old
〜ロールバックセグメントの管理〜
0.更新履歴
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>
|
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 ロールバックセグメントの管理
|
|