Convert from Rollback segment(RBS) to undotablespace
i have a database 9i and it using rollback segment and i would like to convert to undotablespace. question is there is anyway i can find it out what size undo i need to created base on the database right now i have it. the database is very critical i need to do it in one short and right.
thanks
Hi,
<doc>
As an example, if UNDO_RETENTION is set to 2 hours, and the transaction rate (UPS) is 200 undo blocks for each second, with a 4K block size, the required undo space is computed as follows:
(2 * 3600 * 200 * 4K) = 5.8GBs.
</doc>
I got this piece of information from the link
http://www.lc.leidenuniv.nl/awcourse/oracle/server.920/a96521/undo.htm
HTH
-Regards
Aditi
Similar Messages
-
Hi guys.
Am using oracle 8i and am having problems with rollbackup segment. My rbs tablespace is 35GB and will like to shrink it! Its a production db, so my question is shoudl I fire the below query?
alter rollback segment SYSTEM shrink;
alter rollback segment RBS__BIG shrink;
alter rollback segment RBS01 shrink;
alter rollback segment RBS02 shrink;
alter rollback segment RBS03 shrink;
alter rollback segment RBS04 shrink;
alter rollback segment RBS05 shrink;
alter rollback segment RBS06 shrink;
Is there any downside? Please advice.
Thanks.Hi Friend,
Production DBs are always having big transactions, These transactions obviously hold large memory in rollback segments. You will not face any issue after srinking it but if any transaction is failed and it has not been enrolled or flush out from your rollback segment. You will be not able to recover the data from rollback segment. I would suggest use share table space here instead of shrinking it. Atleast it will help to to recover current transaction in case of calamity.
Thanks,
Nitin joshi -
TRANSACTION을 ROLLBACK SEGMENT에 할당하는 방법(SET TRANSACTION USE)
제품 : ORACLE SERVER
작성날짜 : 2003-04-04
TRANSACTION을 ROLLBACK SEGMENT에 할당하는 방법
==============================================
(SET TRANSACTION USE ROLLBACK SEGMENT)
Purpose
Batch job 등을 사용할 때 특별히 크게 만든 rollback segment를 사용하도록
할 수가 있다. transaction에 특정한 rbs를 지정하는 방법을 알아보자.
Explanation
Oracle은 다음과 같은 규칙에 의해 각 Transaction이 사용하는 Rollback
segment를 결정한다.
1. Active Transaction의 수가 가장 작은 Rollback Segment에 할당한다.
2. 만약 1의 조건에 만족하는 Rollback segment가 하나 이상이면, 가장
마지막에 할당된 rbs 다음의 rbs를 할당한다. 이것은 undo 기능을 더
오래 지속시키도록 해 준다.
그러나, Application이 큰 rollback segment가 필요하다면 위와 같이
자동적인 rollback segment의 할당이 아닌 Manual하게 특정 rollback
segment를 할당 가능하다.
다음의 방법을 사용한다.
1) 큰 rollback segment를 만든다. 큰 rollback segment 를 만들기
위해서는 rbs tablespace에 영역이 충분히 커야 하므로 필요할 경우
tablespace를 확장하는 작업을 한다.
<tablespace 확장>
$ sqlplus system/manager
sql> alter tablespace rbs add datafile '?/rbs1SID.dbf' size 100m;
<rollback segment 생성>
sql> create rollback segment big_rbs storage(initial 10m next 10m)
tablespace rbs;
sql> alter rollback segment big_rbs online;
2) Transaction 를 assign 한다.
<sqlplus>
SQL> set transaction use rollback segment big_rbs;
<pro*c>
exec sql commit work;
exec sql set transaction use rollback segment big_rbs;
<forms>
dbms_transaction.use_rollback_segment('big_rbs');
이와 같이 지정하면 이후에 commit 또는 rollback이 일어날 때까지
한 transaction에만 해당된다. -
Oracle9i How to convert from undo tables to rollback segments
Hi,
Anyone try before converting from UNDO management to using rollback segment....What are the procedures for the conversion...
Thank You...Hi,
Follow these steps to convert from Auto UNDO to Rollback Segs....
1. With the database opened, create a rollback tablespace and then create some rollback segments and bring them online like this
CREATE ROLLBACK SEGMENT RBS1 TABLESPACE RBS;
ALTER ROLLBACK SEGMENT RBS1 ONLINE;
2. Then edit the PFILE and modify these parameters
Add: ROLLBACK_SEGMENTS=(RBS1,RBS2,RBS3....)
Comment: UNDO_MANAGEMENT=AUTO and UNDO_TABLESPACE=UNDOTBS or whatever name you have for your UNDO tablespace.
3. Shutdown the database gracefully(normal).
4. Startup pfile=<Pfile path>
5. Sync these new parameter changes to the SPFILE by recreating the SPFILE.
6. Take a full level 0 backup of your database as the structure has changed.
The next time you start the database, it will use the SPFILE which is same as the PFILE.
Regards. -
Forcing a specific rollback segment on a transaction does not seem to work
Hi!
We're using Oracle 9.2.0.5.0 on Sun Solaris and we're still configured to use Rollback Segments.
We have an issue with Snapshot too old due to RBS too small on a long query I attach below for reference:
set heading off
set pagesize 0
set feedback off
set linesize 200
<<<<< SET TRANSACTION USE ROLLBACK SEGMENT UMF_RBS_LARGE_TRAN; <<<<<
SELECT ucms_cards.msisdn
|| ';;' || to_char(to_date(substr(ucms_cards.notes,14+length(ucms_cards.msisdn),19),'MM-DD-YYYY.HH24-MI-SS'),'DD/MM/YYYY HH24:MI:SS')
|| ';;' || to_char(ucms_batches.expiry_date,'dd/mm/yyyy')
|| ';;' || ucms_cards.serial_no
|| ';;' || ucms_cards.serial_no
|| ';;' || ucms_cards.batch_serial_no
|| ';;' || ' '
|| ';;' || CASE ucms_cards.card_status
WHEN 'used' THEN '1'
ELSE '0'
END
|| ';;' || CASE WHEN date_booked_in is null THEN '01/01/1970 00:00:00' ELSE to_char(date_booked_in,'DD/MM/YYYY') || ' 00:00:00' END
|| ';;' || ' '
from ucms_batches,ucms_cards, UCMS_EVENT_LOG
WHERE ucms_cards.batch_serial_no = ucms_batches.serial_no
AND ucms_cards.serial_no = substr(UCMS_EVENT_LOG.ENTITY_ID,11,length(UCMS_EVENT_LOG.ENTITY_ID)-9)
AND UCMS_EVENT_LOG.PARTY_NO in (0)
AND UCMS_EVENT_LOG.TIMESTAMP>=TO_TIMESTAMP(TO_CHAR(SYSDATE-1, 'DD-MM-YYYY') || ' 00:00:01', 'DD-MM-YYYY HH24:MI:SS')
AND UCMS_EVENT_LOG.TIMESTAMP<=TO_TIMESTAMP(TO_CHAR(SYSDATE-1, 'DD-MM-YYYY') || ' 23:59:59', 'DD-MM-YYYY HH24:MI:SS')
AND UCMS_EVENT_LOG.USER_ID LIKE 'SCP-AGENT1%'
AND UCMS_EVENT_LOG.EVENT_TYPE_ID IN (1,2)
AND UCMS_EVENT_LOG.ENTITY_TYPE_ID LIKE 'ucms_cards%'
UNION
SELECT ucms_imported_cards.msisdn
|| ';;' || to_char(to_date(substr(ucms_imported_cards.notes,14+length(ucms_imported_cards.msisdn),19),'MM-DD-YYYY.HH24-MI-SS'),'DD/MM/YYYY H24:MI:SS')
|| ';;' || to_char(ucms_imported_cards.expiry_date,'dd/mm/yyyy')
|| ';;' || ucms_imported_cards.serial_no
|| ';;' || ucms_imported_cards.serial_no
|| ';;' || DBMS_UTILITY.GET_HASH_VALUE(ucms_imported_cards.card_type,1,65536)
|| ';;' || ' '
|| ';;' || CASE ucms_imported_cards.card_status
WHEN 'used' THEN '1'
ELSE '0'
END
|| ';;' || '01/01/1970 00:00:00'
|| ';;' || ' '
from ucms_imported_cards, UCMS_EVENT_LOG
where ucms_imported_cards.serial_no = substr(UCMS_EVENT_LOG.ENTITY_ID,11,length(UCMS_EVENT_LOG.ENTITY_ID)-9)
AND UCMS_EVENT_LOG.PARTY_NO in (0)
AND UCMS_EVENT_LOG.TIMESTAMP>=TO_TIMESTAMP(TO_CHAR(SYSDATE-1, 'DD-MM-YYYY') || ' 00:00:01', 'DD-MM-YYYY HH24:MI:SS')
AND UCMS_EVENT_LOG.TIMESTAMP<=TO_TIMESTAMP(TO_CHAR(SYSDATE-1, 'DD-MM-YYYY') || ' 23:59:59', 'DD-MM-YYYY HH24:MI:SS')
AND UCMS_EVENT_LOG.USER_ID LIKE 'SCP-AGENT1%'
AND UCMS_EVENT_LOG.EVENT_TYPE_ID LIKE '2%'
AND UCMS_EVENT_LOG.ENTITY_TYPE_ID LIKE 'ucms_imported_cards%';
As you see we forced the session to use a huge RBS created for the purpose, but strangely after a long while the query fails with a RBS too small failure due to another RBS, not the one specified.
Is there any chance the UNION or any other component of the query is implicitly opening a new transaction with a different RBS associated?
Any chance to force the same RBS specified explicitly?
Thanks!
Mikealbertone wrote:
but strangely after a long while the query fails with a RBS too small failure due to another RBS, not the one specified.You misunderstand snapshot too old. It can be caused by other sessions same as by your session. Assume AFTER your session issued select some other session modified one (or more) tables ucms_batches, ucms_cards, UCMS_EVENT_LOG and committed changes. By the time your select reaches to fetch rows modified by that other session rollback extents in rollback segment used by that other session were reused. You will get snapshot too old. Bottom line - all sessions modifying table(s) used by your select must use rollback segments large enough so they are not overwritten before corresponding rows are needed by your select.
SY. -
Big problem with ROLLBACK SEGMENT
I tried insert into DB Oracle 8i more than 23000 rows from .sql files.
This files contents:
-- START
delete from grls;
insert ..........
insert ..........
insert ..........
-- END
ORA-01562: failed to extend rollback segment ...
My configuration:
CREATE TABLESPACE rbs datafile '$ORACLE_BASE/oradata1/$ORACLE_SID/rbs01.dbf' SIZE 10M;
CREATE TABLESPACE rbs_02 datafile '$ORACLE_BASE/oradata1/$ORACLE_SID/rbs01_02.dbf' SIZE 300M;
CREATE ROLLBACK SEGMENT rbs01 storage (initial 20k next 20k minextents 3 maxextents 121) TABLESPACE rbs;
CREATE ROLLBACK SEGMENT rbs16 storage (initial 20k next 20k minextents 3 maxextents 121) TABLESPACE rbs;
CREATE ROLLBACK SEGMENT rbs_load01 storage (initial 30m next 30m minextents 3 maxextents 10) TABLESPACE rbs_02;
Please help me.1.)Did you place the rollback segments online
after creation?
Alter rollback segment RBS01 online;
Alter rollback segment RBS16 online;
Alter rollback segment RBS_LOAD01 online;
2.)Did you set your init[sid].ora parameter
ROLLBACK_SEGMENTS = (RBS01, RBS16, RBS_LOAD01) so that they will automatically come on line on istance startup?
3.) You have set up only 304Meg of space for them cumulatively. Is this enough for the 23thousand rows you want to insert?
If not you may want to enable the autoextend option on your datafiles. Of course you will want to change your maxextents. Leaving that value out will give you a default of 505 maxextents.
4.) And finally you could throw in a commit during the insert procedure. This will commit the transaction at that point and clear out the rollback segments for use again.
Tom -
Is "SET TRANSACTION USE ROLLBACK SEGMENT" only a hint
I have two users, one makes some inserts in a table.
The other makes a select which visits many rows.
I have a big rollback-segment.
To ensure, both users use this rollback-segment I created a logon-trigger:
CREATE OR REPLACE TRIGGER a_logon AFTER LOGON
ON DATABASE
WHEN ( USER IN ( 'SCOTT', 'BOB' ) )
BEGIN
SET TRANSACTION USE ROLLBACK SEGMENT rbs_big;
END;
But I still get "snapshot to old" messages from the select, which contains the name off an other rollback-segment in the message.
The trigger really fires, i tested it by adding an insert-statement to a log-table.
What`s wrong ?The set transaction use rollback segment lasts only until you commit or rollback first time and all other transactions in that session will not be forced to that rbs anymore. Other possible solution could be that other users are accessing same tables / updating them so those sessions can't keep the read consistent image available anymore for your sessions.
-
Rollback Segment: dedicate it to a given session ?
Dear Experts,
A job is performing nightly deletion on some data.
I created a "big" RBS for it and perform the following:
SET TRANSACTION USE ROLLBACK SEGMENT RBS01;
DELETE FROM TABLE1 WHERE (...);
COMMIT;
Is it possible that only this transaction uses RBS01 i.e. having RBS01 dedicated to my transaction untill the COMMIT is done ?
Thanks for any advice.
Best Regards,
Guillaume.I've got a complementary question.
As I don't want the clean-up job to "eat" all my CPU I'd need to limit the CPU allocated to this task. I can see in Profile a CPU_PER_SESSION parameter but I'm looking for a way to set a max % of the CPU usage and not a max in duration. Any trick ?
Thanks for your support.
BR,
Guillau -
Taking rollback segment and datafile offline caused application error
One of the DBA's added a large rollback segment which caused the rman backup to abort. The rollback segment was taking offline and it's datafile was taken offline, all went normally no errors. An Application started gettting errors the database and application were taking down and up, no errors on either but the problem was still there. The rbs datafile and RBS were placed back online and the application worked properly. It looks as if Oracle let us take the RBS and datafile offline with active segments in the RBS is this possible?? If so it means you can pull the rug out from under Oracle and it doesn't even complain
Pls check any transactions written in application level,
explicitly assigned to the RBs which was taken offline. -
ORA-1650: unable to extend rollback segment
Hi,
We have 20 RBS's and in our production instance we got very frequent alerts related to ORA-1650: unable to extend rollback segment continuously. When I looked for select STATUS from v$rollstat; I could see most of them are with FULL status. after couple of hours they disappeared and status became online.
How to avoid these type of alerts?
REgardsWhat version of Oracle?
If you are 9ir2 or later, you should be going to automatic undo management. Though it won't help your 'we cannot add space' restriction. That's not an Oracle problem, that's a corporate issue.
This problem may be caused by poor transaction design with too many processing doing too infrequent commits. That's not an Oracle problem either, that's a corporate/development issue.
So...you don't have an Oracle problem.
You can't stop the 1650s from occurring if you are unwilling to add space or address application issues. However, you can set up an email filter so that any emails containing ORA-01650 in the header or body get automatically sent to the trash.
<sarcasm>
If you can't solve a problem, then just ignore it!
</sarcasm> -
ORA-01555: snapshot too old: rollback segment number 8 with name
Hi,
Database version is Oracle8i Enterprise Edition Release 8.1.7.4.0
I am struggling to fix this error, since I have not worked on 8I DATABASE.
We getting this kind of error very frequently in one of the 8i database.
ORA-01555: snapshot too old: rollback segment number 8 with name "ROLLBACK08" too small
How do i fix this permantely.
I have verified the RBS configured in the db.
SEGMENT_NAME TABLESPACE_NAME OWNER STATUS
SYSTEM SYSTEM SYS ONLINE
ROLLBACK0 SYSTEM SYS OFFLINE
ROLLBACK02 RBS1 SYS ONLINE
ROLLBACK03 RBS1 SYS ONLINE
ROLLBACK04 RBS1 SYS ONLINE
ROLLBACK05 RBS1 SYS ONLINE
ROLLBACK06 RBS1 SYS ONLINE
ROLLBACK07 RBS1 SYS ONLINE
ROLLBACK08 RBS1 SYS ONLINE
ROLLBACK09 RBS1 SYS ONLINE
ROLLBACK10 RBS1 SYS ONLINE
ROLLBACK01 RBS1 SYS ONLINE
SQL> SELECT t1.name, t2.extents, t2.rssize, t2.optsize, t2.hwmsize, t2.xacts, t2.status FROM v$rollname t1, v$rollstat t2 WHERE t2.usn = t1.usn ;
NAME EXTENTS RSSIZE OPTSIZE HWMSIZE XACTS STATUS
SYSTEM 7 770048 770048 0 ONLINE
ROLLBACK02 2 41934848 262144000 41934848 0 ONLINE
ROLLBACK03 3 62906368 262144000 62906368 1 ONLINE
ROLLBACK04 3 62906368 262144000 62906368 0 ONLINE
ROLLBACK05 2 41934848 262144000 41934848 0 ONLINE
ROLLBACK06 3 62906368 262144000 62906368 1 ONLINE
ROLLBACK07 3 62906368 262144000 62906368 1 ONLINE
ROLLBACK08 3 62906368 300146688 62906368 0 ONLINE
ROLLBACK09 3 62906368 262144000 62906368 1 ONLINE
ROLLBACK10 3 62906368 262144000 62906368 1 ONLINE
ROLLBACK01 3 62906368 300146688 62906368 0 ONLINE
NAME0 USER0 RSSIZE Wraps Extents Shrinks OPTSIZE COMM0
ROLLBACK01 62906368 19 3 0 300146688 lookup
ROLLBACK02 41934848 0 2 0 262144000 lookup
ROLLBACK03 OPS$RTRADM 62906368 20 3 0 262144000 lookup 50
ROLLBACK04 62906368 34 3 0 262144000 lookup
ROLLBACK05 OPS$RTRADM 41934848 28 2 0 262144000 No Command
ROLLBACK06 OPS$RTRADM 62906368 21 3 0 262144000 lookup 50
ROLLBACK07 OPS$RTRADM 62906368 25 3 0 262144000 lookup 50
ROLLBACK08 62906368 32 3 0 300146688 lookup
ROLLBACK09 OPS$RTRADM 62906368 20 3 0 262144000 Select
ROLLBACK10 OPS$RTRADM 62906368 24 3 0 262144000 lookup 50
SYSTEM 770048 0 7 0 lookup
Can someone help ... who to set the RBS size here... i dont want this error happens here.. what i need to look or check.lm**** wrote:
Hi,
Database version is Oracle8i Enterprise Edition Release 8.1.7.4.0
I am struggling to fix this error, since I have not worked on 8I DATABASE.
We getting this kind of error very frequently in one of the 8i database.
ORA-01555: snapshot too old: rollback segment number 8 with name "ROLLBACK08" too small
How do i fix this permantely. upgrade to supported Oracle version since V8.1.7 has not been supported this Century. -
Want to decrease size for ROLLBACK Segments
my database is oracle8i. Previous DBA increased rollback size to 18GB. i need space on my unix box.
i want to reduce size of rollback segment and utilized this space for other purpose.
This is my stats
Tablespace Name FILE_NAME SIZE IN MB
ROLLBACK /u01/rbsdata/rbs01.dbf 5000
ROLLBACK /u01/rbsdata/rbs02.dbf 5000
ROLLBACK /u01/rbsdata/rbs03.dbf 6000
There are 12 rollback segments allocated to him
SEGMENT_NAME FILE_NAME SIZE
rbs0 /u01/rbsdata/rbs01.dbf 5000
rbs12 /u01/rbsdata/rbs01.dbf 5000
Now Could any one suggest to reduxe size with best performing and not affected my production database.
Thanks
ChetanHi Chetan,
You can adapt the following script as per your needs. It will search for all rollback segments other than 'SYSTEM' and construct the sql order to reduce the size of each rollback segment.
connect user/*******@test
SET SERVEROUTPUT ON size 50000
SET HEAD OFF FEEDBACK OFF VERIFY OFF
SPOOL D:\shrink.sql
BEGIN
-- RBS to be shrinked
FOR toto IN (select Segment_Name from DBA_SEGMENTS
where Segment_Type = 'ROLLBACK'
and segment_name not in 'SYSTEM')
LOOP
DBMS_OUTPUT.PUT_LINE('alter rollback segment '||toto.Segment_Name||' '||'shrink to 60M;');
END LOOP;
END;
SPOOL OFF
SET HEAD ON FEEDBACK ON VERIFY ON
spool d:\shrink.log
select to_char(sysdate, 'dd/mm/yyyy hh24:mi:ss') "Shrinked" from dual;
@D:\shrink.sql
spool off
Exit
R.Tirou -
GettingTransaction in a specific Rollback segment
Hi
I m using bea weblogic 6.0. as Application Server and Oracle 8.x as Database.
I get user transaction from weblogic server by looking up ("javax.transaction.UserTransaction")
Now my requirement is that i want to begin transaction with a particular rollback
segment. ( oracle
allows this ) but UserTransaction object that we get from weblogic has only one
method .begin()
In this case is it possible for me to get usertransaction and begin transaction
in a particular rollback
segment.
Thanks
Pranav
albertone wrote:
but strangely after a long while the query fails with a RBS too small failure due to another RBS, not the one specified.You misunderstand snapshot too old. It can be caused by other sessions same as by your session. Assume AFTER your session issued select some other session modified one (or more) tables ucms_batches, ucms_cards, UCMS_EVENT_LOG and committed changes. By the time your select reaches to fetch rows modified by that other session rollback extents in rollback segment used by that other session were reused. You will get snapshot too old. Bottom line - all sessions modifying table(s) used by your select must use rollback segments large enough so they are not overwritten before corresponding rows are needed by your select.
SY. -
ROLLBACK SEGMENT의 MINEXTENTS를 20 이상으로 하면 좋은 이유
제품 : ORACLE SERVER
작성날짜 : 2003-06-19
ROLLBACK SEGMENT의 MINEXTENTS를 20 이상으로 하면 좋은 이유
=========================================================
PURPOSE
이 자료는 다음과 같은 주제에 대하여 소개하는 자료이다.
이 문서는 database application의 요구 사항을 충족시키기 위해 고려되어
져야 할 rollback segment tablespace 구성에 관한 내용을 담고 있다.
Creating, Optimizing, and Understanding Rollback Segments
-Rollback Segment 구성과 기록 방식
-Transaction에 Rollback Segment를 할당하는 Oracle 내부 메커니즘
-Rollback Segment 크기와 갯수
-Rollback Segment의 크기와 갯수 결정을 위한 테스트
-Rollback Segment extent의 크기와 갯수
-Rollback Segment의 minextents를 20 이상으로 하면 좋은 이유?
-Rollback Segment의 Optimal storage parameter와 Shrink
Explanation
Rollback Segment 구성과 기록 방식
Rollback segment는 extent라 불리는 연속적인 여러 개의 block으로 구성된다.
Rollback segment는 ordered circular 방식으로 extent를 쓰게 되는데,
current extent가 full이 되면 next extent로 옮겨 가며 사용하게 된다.
Transaction은 rollback segment 내의 current location에 record를 쓴 다음,
record의 size 만큼 current pointer를 옮겨 간다.
Rollback segment에 현재 record가 쓰여지고 있는 위치를 "Head"라고 한다.
또한, "Tail"이란 용어는 rollback segment에서 가장 오래된 active
transaction record의 시작 위치가 되는 부분을 말한다.
Transaction에 Rollback Segment를 할당하는 Oracle 내부 메커니즘
새로운 transaction이 rollback segment 를 요청하면, 각 rollback segment
를 이용하고 있는 active transaction 갯수를 확인하여 가장 적은 갯수의
active transaction 을 가진 rollback segment를 할당하게 된다.
Rollback segment는 transaction load를 처리하기에 충분한 크기를 가져야
하고, 필요한 만큼의 rollback segment를 사용할 수 있도록 적당한 갯수의
rollback segment를 가져야 한다.
1. 한 transaction은 단 하나의 rollback segment만을 사용할 수 있다.
2. 같은 extent에 여러 transaction이 기록할 수 있다.
3. Rollback segment의 Head는 Tail에 의해 현재 사용 중인 extent를
침범하지 않는다.
4. 링 형태로 구성되어 있는 rollback segment의 extent들은 다음 extent를
찾을 때 절대 건너 뛰는 일이 없으며, 순서를 뒤바꾸어 사용하지도 않는다.
5. Head가 next extent를 찾지 못하면, 새로운 extent를 추가로 할당하고,
그 extent를 링 안에 포함시킨다.
위와 같은 원리를 감안할 때, transaction size 뿐만 아니라 transaction
time도 상당히 중요한 고려 사항이라는 것을 알 수 있다.
Rollback Segment 크기와 갯수
Rollback segment size가 충분한지 판단하는 기준은 transaction activity에
직접적으로 영향을 받는다. 주로 일어나는 transaction activity에 근거하여
rollback segment size를 결정하여야 하고, 잘 일어나지 않는 특수한 경우의
큰 transaction이 문제라면 별도의 rollback segment로 관리되어야 한다.
Transaction 발생 중 Head가 너무 빨리 wrap around 시켜서 tail을 catch하
지 않도록 하여야 하며, 자주 변경되는 data에 대해 long-running query가
수행되었을 경우 read-consistency가 유지될 수 있도록 rollback segment
가 wrap around되지 않아야 한다.
Rollback segment 갯수를 적당히 잡아야 하는 이유는 process들 간에
contention을 방지하기 위함이고, V$WAITSTAT, V$ROLLSTAT, V$ROLLNAME
view를 통해서 contention을 확인할 수 있으며, 조회문은 다음과 같다.
sqlplus system/manager
select rn.name, (rs.waits/rs.gets) rbs_header_wait_ratio
from v$rollstat rs, v$rollname rn
where rs.usn = rn.usn
order by 1;
위의 query에 의해 조회된 rbs_header_wait_ratio 가 0.01 보다 크면,
rollback segment 갯수를 추가한다.
Rollback Segment의 크기와 갯수 결정을 위한 테스트
1. Rollback segment tablespace 생성
2. 테스트하기 위해 생성할 Rollback segment 갯수 결정
3. 같은 크기의 extent로 rollback segment 생성
extent 갯수는 최대 확장 시 10 - 30 개 정도가 되도록 extent 크기를 결정
4. Rollback segment의 minextents는 2이다.
5. 테스트할 rollback segment와 system rollback segment만 online 상태로 한다.
6. Transaction을 수행하고, 필요하면 application을 load한다.
7. Rollback segment contention을 확인한다.
8. Rollback segment가 최대 얼마까지 확장하는지 모니터링한다.
Rollback Segment extent의 크기와 갯수
Rollback segment가 자라나는 최대 사이즈를 알 수 있는데, 이 수치를
"minimum coverage size"라 한다. 만약, contention이 발생한다면 rollback
segment 갯수를 늘려 가면 테스트를 반복한다. 또한, extent 갯수가 10개
미만이나 30개 이상이 될 필요가 있다면 extent 크기를 늘리거나 줄이면서
테스트를 반복해 나가면 된다.
Rollback segment의 extent 크기를 정할 때, 각 extent는 모두 같은 크기로
생성할 것을 recommend한다.
Rollback tablespace의 크기는 extent size의 배수로 지정한다.
최적의 성능을 위한 rollback segment의 minextents는 20 이상이어야 한다.
Rollback Segment의 minextents를 20 이상으로 하면 좋은 이유?
Rollback segment는 dynamic하게 allocate되고, 더 이상 필요 없게 되었을 때
(만약, Optimal parameter가 셋팅되어 있으면) 모두 commit된 extent에
대해서는 optimal size 만큼만 남기고 release(deallocate)된다.
Rollback segment가 적은 수의 extent를 가질 수록, space 할당/해제 시
extent 수가 많을 때보다 큰 사이즈의 space가 할당되고, 해제된다.
다음과 같은 예를 들어 보자.
200M 정도의 rollback segment가 있는데, 100M 짜리 2개의 extent로 이루어져
있다고 가정해보자. 이 rollback segment에 추가로 space를 할당해야 할 일이
생겼을 때, 모든 rollback segment extent는 같은 크기를 가져야 한다는 점을
감안할 때, 100M 짜리 extent를 하나 더 할당해야 할 것이다.
이 결과 직전의 rollback segment 크기에 비하여 50% 만큼의 크기 증가분이
생겨나게 된 것인데, 실제 필요로 하는 space보다 더 많은 space가 할당되었을
것이다.
이와 반대로, 10M 짜리 extent 20개로 구성된 200M 짜리 rollback segment를
생각해보자.
여기에 추가로 space를 할당해야 할 일이 생겼을 때, 10M 짜리 extent 하나만
추가되면 되는 것이다.
Rollback segment가 20개 또는 그 이상의 extent로 구성되어 있다면 extent가
하나 더 증가할 경우가 생겼을 때, rollback segment의 전체 크기가 5% 이상은
늘어나지 않는다는 것이다.
즉, space의 할당과 해제 작업이 보다 유연하고 쉽게 일어날 수 있다.
요약하면, rollback segment의 extent 갯수를 20 이상으로 잡으면 space
할당과 해제가 "보다" 수월해진다.
실제로 extent 갯수를 20 이상으로 잡았을 때, 처리 속도가 훨씬 빨라진다는
사실이 많은 테스트 결과 밝혀졌다.
한가지 확실한 사실은, space를 할당하고 해제하는 작업은 cost가 적게 드는
작업이 아니라는 사실이다.
실제로 extent가 할당/해제되는 작업이 일어날 때, performance가 저하되는
일이 발생한다는 것이다.
Extent 하나에 대한 cost는 별 문제가 안 된다고 할지라도, rollback segment
는 끊임없이 space를 할당하고 해제하는 작업을 반복하기 때문에 작은 크기의
extent를 갖는 것이 cost 측면에서 훨씬 효율적이라는 결론이다.
Rollback Segment의 Optimal storage parameter와 Shrink
Optimal은 deallocate 시에 rollback segment 내에 optimal size 만큼의
extents를 유지하기 위해 사용하는 rollback segment storage parameter이다.
다음과 같은 명령으로 사용한다.
alter rollback segment r01 storage (optimal 1m);Optimal size는 storage 절 안에서 기술되어야 한다.
Optimal size 이상이 되면, 모두 commit된 extent에 대해서는 optimal size
만큼만 남기고 release된다.
즉, optimal에서 지정한 크기 만큼만 rollback segment를 유지하겠다는
뜻이며, 일정한 크기로 늘어났다가 다음번 tx이 해당 rbs를 취할 경우
optimal size만큼 resize하는 option이다.
rbs의 가장 최근에 사용된 extent가 다 차서 다른 extent를 요구할 때
이 optimal size와 rbs size를 비교하게 되며, 만약 rbs size가 더 크다면
active tx에 관여하지 않는 tail extent에 대하여 deallocation이 이루어진다.
특정 rollback segment가 너무 큰 space를 차지해서 다른 rollback segment가
extent를 발생할 수 있는 여유 공간을 부족하게 만들기 때문에 이를 극복하기
위해서 optimal size를 지정할 필요가 있다.
즉, optimal parameter를 지정하면 space availability 측면에서 효율적이다.
다음과 같이 shrink 명령을 수행하는데, size를 지정하지 않으면 optimal
size 만큼 shrink된다.
alter rollback segment [rbs_name] shrink to [size];Shrink 명령 수행 후, 바로 줄어들지 않는 경우가 있는데,
transaction이 있는 경우는 줄어들지 않고, transaction이 종료되면 줄어든다.
Optimal이 적용되는 시간은 session이 빠져 나가고 약 5~10 분 정도 걸린다.
적당한 OPTIMAL SIZE?
=> 20 ~ 30 extents 정도가 적당한데, batch job의 성격에 따라 size는 달라
지며 각 optimal의 합이 datafile의 size를 넘어도 전혀 상관없다.
Optimal size를 initial, next와 같게 주면 extent가 발생하는 매번 shrink가
일어나므로 좋지 않다.
RBS들의 평균 크기를 구하여 이것을 optimal 크기로 지정하여 사용하는 것을
권한다.
다음의 query를 이용하여 peak time에 rollback segment들의 평균 크기를 구한다.
select initial_extent + next_extent * (extents-1) "Rollback_size", extents
from dba_segments
where segment_type ='ROLLBACK';
이 크기의 평균값(bytes)을 rollback segment들의 optimal size로 사용할 수
있다.
주의할 사항은 너무 자주 shrink된다거나 optimal 값을 너무 작게 주면
ora-1555 : snapshot too old error가 발생할 확률이 높아지므로,
사용하지 않는 것이 좋을 수도 있고, 되도록 큰 값으로 셋팅해야 한다.
Rollback segment의 optimal size를 확인할 수 있는 view는 V$ROLLSTAT
이라는 dynamic view로서 OPTSIZE column에서 확인이 가능하다.
Example
none
Reference Documents
<Note:69464.1> -
How to recovery rollback segment
I come into contact with a big problem about system RBS tablespace:
Because of abnormal shutdown of Oracle database server,when restart oracle server and it crashed,
following is the detail:
1. I got some error numbers:
ORA-27073 skgfcfi: async I/Os remaining to be dequeued for this file
ORA-01115 IO error reading block from file string (block #2 string)
ORA-01110 data file string: 'd:\oracle\oradata\swapp\RBS01.DBF'
2. I startup database with mount mode, then execute sql to get rollback segment detailed info,
I found that the status of all rollback segment of tablespace RBS is "NEED RECOVERY".
and I can not bring it offline or online and drop tablespace.that is mean I can not recover it.
additional, current database running under NOARCHIVELOG mode.
Would you give me a hand? thanks and best regard.
nullSorry this forum is for Oracle Repository, not database issues. Please contact Oracle SUpport for assistance with recovering your RBS.
DAvid
Maybe you are looking for
-
Hi All, Can anyone send sample programs in XI. jsp-> controller-> database how much scope of the java we are going to use in XI. Thank you with best regards Jeevan Roy
-
Hi there, I had some pics saved on my blackberry and suddenly an icon appear instead and when I tried to move that icon to my memory device the following msg appears:<br>Media Card is secured by another device. Cannot save encrypted file... What does
-
Does NSM no longer create NetStorage Objects?
Since upgrading from vr 2.5x to 3.x NSM is no longer creating NetStorage objects and I can't see an option anywhere in NSMAdmin to point collaborative or group polices at for the creation of the NS objects. This used to be a feature in 2.x of NSM. If
-
When an email attachment with a WAV file is received on my Blackberry Curve I don't see an attachment to click on in my email - I only see a message that says "Unsupported media type in header". These messages are coming from my voice mail, with WAV
-
As i am using qals-prueflos in webdynpro in that whenever i click for help the below error come....as this same field work will in smartform.....please help it The following error text was processed in the system OCD : Could not find attribute STAT_E