'Undo'에 해당되는 글 2건

  1. 2015.09.15 undo 관련 좋은 링크
  2. 2014.04.16 Undo tablespace shrink

개요


http://blog.oracle48.nl/oracle-database-undo-space-explained/

 

만약 active undo extents만 존재하여 더이상 해당 트랜잭션에 대한 undo 공간을 확보할 수 없을 경우 ORA-30036 unable to extend segment in Undo tablespace 에러를 받게 되고 자동으로 트랜잭션은 rollback되게 된다.

이 현상이 얼마나 일어났는지 확인은 아래 sql을 통해 가능하다.

 

SQL> select sum(NOSPACEERRCNT) from v$undostat;

 

만약 active상태의 extents이 필요한데 expired extents이 없다면 unexpired(undo_retention 기간이 아직 지나지 않은 상태) extents를 빼앗게(steal) 되는데 해당 count를 확인하는 법은 아래와 같다.

 

SQL> select sum(unxpstealcnt) from v$undostat;

 

※ steal 못하게 하려면 undo 테이블스페이스에 대해 retention guarantee 옵션을 주면 된다.

SQL> alter tablespace undotbs1 retention guarantee;

단.. 이러면 이제 unexpired extent를 뺏지 않기 때문에 조금 긴 dml의 경우 실패할 경우가 자주 생길 것이다. 이는 즉 ORA-30036과 ORA-01555 중 어느것을 선택하느냐이다.

 

만약 이렇게 steal된 unexpired extents에 대해 read consisteny read 수행하면 ORA-01555 snapshot too old 발생하고 이 역시 v$undostat에서 확인 가능하다.

 

SQL> select sum(ssolderrcnt) from v$undostat;

 

※ undo extent 크기와 퍼센트를 확인하는 쿼리. 단 free는 포함되지 않음

 

select status,
  round(sum_bytes / (1024*1024), 0) as MB,
  round((sum_bytes / undo_size) * 100, 0) as PERC
from
(
  select status, sum(bytes) sum_bytes
  from dba_undo_extents
  group by status
),
(
  select sum(a.bytes) undo_size
  from dba_tablespaces c
    join v$tablespace b on b.name = c.tablespace_name
    join v$datafile a on a.ts# = b.ts#
  where c.contents = 'UNDO'
    and c.status = 'ONLINE'
);

 

■ undo size tune


undo tablespace size가 고정되어있다면 오라클이 retention time을 undo 생성량에 따라 최적값을 찾게 된다. 하지만 undo tablespace 크기가 크다면 이를 크게 잡게 될 것이다.

이는 아래 쿼리로 확인 가능하다.

 

SQL> select tuned_undoretention from v$undostat;

 

이 경우 undo_retention parameter는 "최소 undo retention"이 된다.

undo retention autotune은 '_undo_autotune' hidden parameter를 설정해 끌 수도 있다.

 

■ undo_retention 값을 가장 긴 쿼리에 맞춰 설정하기


ORA-01555 에러를 피하기 위해 가장 긴 쿼리에 맞춰 undo retention을 설정하는 방법을 생각할 수 있다.

 

최근 7일간 가장 긴 쿼리의 길이(초)를 확인하는 방법

SQL> select max(maxquerylen) from v$undostat

'Knowledge > Oracle' 카테고리의 다른 글

Oracle Create Table 내부 절차  (0) 2015.10.21
SQL Loader Direct Load  (0) 2015.10.05
null 관련 주의사항  (0) 2015.07.10
logon trail trigger on oracle  (0) 2015.01.22
oracle 접속 ip 차단하기  (0) 2015.01.22
Posted by neo-orcl
,

#############################################################################################
undo 크기가 늘어나는 이유
#############################################################################################
1. undo segment를 할당하는 방식

 

1-1. autoextend off인 경우
빈 공간이 없다면 undo_retention 값에 해당하는 segment도 재사용하게 되고 이는 snapshot too old가 발생할 수 있다.

 

1-2. autoextend on인 경우
빈 공간이 없다면 undo_retention 값에 해당하는 공간은 재사용하지 않고 데이터 파일 크기를 늘릴 수 있을 때까지 늘린다.
늘릴수 없을 정도까지 늘어났다면 이때부터 undo_retiontion 값에 해당하는 segment도 재사용하게 된다.

이 것이 undo tablespace가 커지는 주이유이다.
AUTOEXTEND ON + MAXSIZE를 적용해 크기를 제한하고 사용하는 방법이 권장된다.

 

#############################################################################################
undo tablespace shrink
#############################################################################################
1. undo tablespace를 원하는 크기로 하나 더 생성한다.
create undo tablespace undotbs2 datafile 'undotbs2.dbf' size <new size>;

 

2. undo_tablespace 파라미터를 바꾼다.
alter system set undo_tablespace=undotbs2;

 

3. 이전의 undo tablespace를 drop한다.
alter tablespace undotbs1 including contents;

 

※만약 drop시 ora-30013이 발생한다면 undo 를 사용하는 트랜잭션이 존재한다는 것이고 이를 drop하기 위해선
해당 트랜잭션이 끝나기를(commit or rollback) 기다릴 수 밖에 없다.

 

※OS에 따라서 drop했는데도 disk상의 공간이 확보가 되지 않을 수 있다(du or df).

   이때는 disk 확보가 필요하다면 db 재시작이 필요하다.

'Knowledge > Oracle' 카테고리의 다른 글

EZCONNECT 사용방법  (0) 2014.05.30
DB Upgrade 상식  (0) 2014.05.27
datapump expdp remote  (0) 2014.04.03
Datapump export in ASM  (0) 2014.03.20
About View  (0) 2014.03.07
Posted by neo-orcl
,