때때로 v$rollstat view에서 rollback segment의 status가 FULL로 나타나는
경우를 볼 수 있다. rollback segment가 FULL인 동안은 그 rollback segment를
사용할 수 없게 된다. 여기에서는 이렇게 rollback segment가 FULL이 되는
원인과 조치방법을 간단히 살펴본다.
1. STATUS가 FULL이 되는 경우
rollback segment가 FULL 이 되는 경우는 해당 rollback segment가 extent를
확장하려고 시도하는데 남은 공간이 없어서 ORA-1562(failed to extend rollback
segment number)를 만난 경우이다.
트랜잭션이 rollback segment를 사용하다 ORA-1562를 만난다는 것은 해당
rollback segment의 active한 트랜잭션이 사용하지 않는 공간은 이미 모두
사용하고도 추가적인 확장이 필요한 경우이기 때문에, 이렇게 FULL인 동안은
다른 transaction이 이 rollback segment를 사용할 수가 없게 된다. 실제로
FULL로 mark하는 이유도 사용하는 user에게 FULL인 것을 알리려는 것이 아니라
오라클이 내부적으로 이 rollback segment가 새로운 transaction에 할당되는
것을 막기 위한 것이다.
이렇게 ORA-1562가 발생하고 일부의 rollback segment가 FULL인 경우라도
transaction을 다시 수행시키면 다른 rollback segment를 잡고 사용할 수는 있다.
그러나 transaction이 batch성 작업이어서 다른 rollback segment를 이용하여
작업하다가 마찬가지로 space가 부족한 경우를 만나서 모든 rollback segment가
FULL이 되면 ORA-1552(cannot use system rollback segment for non-system
tablespace '%s)가 발생하게 된다.
2. FULL이 해제되는 경우
(1) FULL status를 가진 rollback segment 내의 모든 transaction들이
commit되는 경우
예를 들어, sqlplus 상에서 ORA-1562를 만난 sql문 수행 문 위에
commit 문장을 수행하거나, 오류를 만난 program을 완전히 종료하는 경우들이
해당된다.
이렇게 되면 v$rollstat의 xacts (active transactions)값이 0이 된다.
(2) 해당 rollback segment를 OFFLINE혹은 ONLINE으로 변경하는 경우
v$rollstat의 xacts값이 1이상일 때 OFFLINE하게 되면 status가 OFFLINE
PENDING상태가 되고, 모든 transaction이 완전히 rollback이 되거나
commit되어 clear되어 xacts가 0가 되면 OFFLINE PENDING이 OFFLINE 상태로
변경된다.
XACTS가 1이상일 때 OFFLINE시켜 OFFLINE PENDING이 된상태에서 다시
alter rollback segment문장을 이용해 ONLINE시키면 이제는 FULL이 아닌
ONLINE상태로 status가 변경된다. 그러나 여전히 이 rollback segment를
차지한 모든 transaction들이 commit이 되지 않았다면 이 rollback
segment를 사용하려는 시도는 실패하고 다른 rollback segment를
사용하게 된다.
rollback segment (예를 들어 r01) 를 online이나 offline으로 변경시키는
명령은 다음과 같다.
alter rollback segment r01 offline;
alter rollback segment r01 online;
(3) set transaction use rollback segment ;
문장을 사용하는 경우 STATUS가 FULL이더라도 지정된 rollback segment를
사용하려고 시도한다. 일단 rollback segment가 FULL이 된 후에 일부
transaction이 rollback되거나 commit이 종료된다면 일부분의 extents가
inactive가 되어 다른 transaction이 사용할 수 있는 공간을 확보하는
경우도 있을 수 있다.
단, 이 문장을 수행한다고 해서 FULL status가 변경되지는 않는다.
3. ORA-1562를 만난 transaction을 성공적으로 수행하기 위한 방법
rollback segment가 FULL이 되었다는 것은 이 rollback segment를 사용한
transaction이 문제의 rollback segment를 사용하다가 추가적인 extent를
발생 시 오류가 발생하였다는 것을 나타내므로, 일단 RBS tablespace에 free
space가 전혀 없다는 것을 나타낸다.
이러한 경우 ORA-1562를 만나 실패한 transaction이 성공적으로 재수행
되기 위해서 다음과 같은 방법이 가능하다.
(1) RBS를 확장하는 방법
가장 간단하게는 RBS tablespace의 크기를 늘려 rollback segment가
충분히 extend할 수 있도록 하는 것이다. RBS의 datafile을 늘리거나 (7.2 이상),
새로운 datafile을 하나 더 추가할 수 있다.
- size를 50m에서 100m로 증가시키는 경우
alter database datafile '/mnt3/rctest73/server/oradata/rbs01.dbf'
resize 100m;
- 50m 짜리 datafile을 하나 더 추가하는 경우
alter tablespace rbs add datafile '/mnt3/rctest73/server/oradata/rbs02.dbf' size 50m;
(2) RBS tablespace를 확장하지 않고 해결하는 방법
다음 문장을 수행하여 보아 FULL이 아닌 충분한 크기가 확보된 rollback
segment가 존재한다면 그 rollback segment를 지정하여 오류가 발생한
transaction을 재수행할 수 있다.
select usn, rssize from v$rollstat;
select * from v$rollstat;
여기에서 나타난 rssize값이 확보된 rollback segment의 영역이다.
첫번째로는 이 중 일부분의 rollback segment를 drop 후 다시 create하거나
shrink시켜 free space를 확보하여 다른 rollback segment가 extend
가능하도록 할 수 있으며, 두번째 방법으로는 이 중 rssize가 FULL된
rollback segment보다 충분히 큰 rollback segment를 지정하여
transaction을 수행시킬 수 있다.
각각의 syntax는 다음과 같다(예를 들어 r01).
- rollback segment drop 방법
alter rollback segment r01 offline;
drop rollback segment r01;
- rollback segment shrink 방법
alter rollback segment r01
- rollback segment를 지정하여 사용하는 방법
(r02의 rssize가 충분히 크고 FULL이 아니라면)
set transaction use rollback segment r02;
좀 더 자세한 자료는 Bulletin:10823(ORA-1562 분석 및 해결 방법)을 참조하도 록 한다.
|