TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-12 |
제목 | rollback segment의 status가 FULL로 되는 경우와 조치 사항 | ||
---|---|---|---|
rollback segment의 status가 FULL로 되는 경우와 조치 사항 (ORA-1552)
----------------------------------------------------------------- 때때로 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를 확장하고 임시로 새로운 rollback segment생성 가장 간단하게는 RBS tablespace의 크기를 늘려 rollback segment가 충분히 extend할 수 있도록 하는 것이다. RBS의 datafile을 늘리거나 (7.2 이상), 새로운 datafile을 하나 더 추가할 수 있다. 이렇게 RBS를 확보한다 하더라도 rollback segment들이 status가 FULL인 상태에서는 새로운 트랜잭션이 그 rollback segment들을 사용하지 못하므로, FULL이 해제가 될동안 사용할 rollback segment를 임시로 추가하여야 한다. 이후 FULL이 해제된후 이 rollback segment는 다시 drop해도 되고, 혹은 그냥 계속 사용해도 된다. - 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; - rollback segment추가방법 create rollback segment r11 tablespace rbs storage (initial 1m next 1m); (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; Technical Bulletin (Korean) |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |