[re]지난번 스터디때 나왔던 논의사항 0 3 5,087

by TeLl2 snapshot too old undo tablespace full [2009.10.19 18:00:42]


우선 아래의 상황에 대하여 테스트는 않해 봤으며
생각나는데로 적어 봅니다. (틀린내용일수도 있다는...ㅡ.,ㅡ)

 

1. snapshot too old와 undo tablespace full의 발생 우선순위

언두 사용시 더이상 사용할 공간이 없을때 에전 언두 데이터를 덮어써 snapshot too old
메세지를 발생시키는지.. 아니면 undo tablespace full 메세지를 발생시키는지
메세지간의 우선 순위

==> snapshot too old 와 undo tablespace full은 언두 내에서 일어나는 문제 때문에 발생하는 에러 이지만
두 에러는 별개의 문제라는 생각이 드네요.
9i 이후의 버전에서 aum(automatic undo management) 사용을 예로 들면
진행중인 트랜잭션이 모든 undo tablespace를 사용하여 더 이상 사용할 공간이 없을 경우 발생하는 것이며,
(이 경우에는 모든 undo segment의 모든 extent들의 상태는 active 상태임)
snapshot too old는 undo의 circular 동작 방식과 관계가 있습니다,
간단히 말씀드리면 각각의 undo segment는에는 트랜잭션을 관리하는 트랜젝션 테이블 슬롯과
그 undo 정보를 저장하는 undo block(undo recode)으로 볼 수 있는데요, 
트랜잭션이 많은 시스템에서는 undo의 circular 방식에 의해(10g의 guarantee 옵션 제외)
active 상태가 아니면 새로운 트랜잭션이 트랜잭션 테이블 슬롯 이든 undo block든 모두 재사용 될 수 있으며
재사용된 테이블 슬롯 이든 undo block을 read consistent를 위해 읽을 필요가 있는 세션은
쿼리를 시작했던 시점의 data를 복원할 수 없으므로 나는 에러이므로
무엇이 우선이다 라고 얘기 할 수 없듯 합니다.


2. rollback segment 사용시처럼 특정 작업에 특정 롤백 세그먼트를
사용하도록 하는 히든 패러미터 존재 여부

==> UNDO 테이블스페이스에도 rollback segment를 만들 수는 있으나 그렇게 하지 않는 것이 권고사항이라네요.
다른 하나의 방법은 auto 와 manual로 두 undo tablespace를 만들고 메뉴얼한 작업이 필요한 경우에 한하여
alter system set undo_tablespace=xx;
로 변경하여 지정후 사용할 수 있는 것으로 압니다.



3. 인덱스리빌드시 사용하는 테이블스페이스
인덱스가 존재하는 테이블스페이스인지, 템프 테이블스페이스인지

==> 모든 정렬은 sort area에서 발생하는 합니다. 고로 템프 테이블 스페이스를 사용하거 같네요.
새로운 이름으로 인덱스를 생성하고 나중에 체인지하고 기존꺼 드랍 하는 방식 이였던거 같은데요.
누가 테스트해 주세요.. 정확히 말씀드리기 힘드네요..


4. 인덱스 nologging 사용시 문제
왜 인덱스를 nologging으로 사용하지는 않는지

==> 저희는 인덱스를 nologging으로 운영하다가 최근에 제가 logging으로 바꿨습니다.
인덱스를 nologging으로 사용하는 이유는 다 아시다 시피 redo로그 생성량을 줄일 수 있기때문인데요.
대신 db crash 발생시 복구를 하게 되면 해당하는 테이블의 인덱스를 리빌드 해 줘야 합니다.
그만큼 복구 시간이 길어 지게 되므로 redo로그 발생이 많아지더라도 복구 시간을 최소해 하기
위해 전 바꾸었는데요. 인덱스 없이 운영가능하거나 복구 시 시간에 자유로운 시스템이라면
굳이 logging으로 운영할 필요는 없을거 같네요..
(또하나는 복구시 찾아서 인덱스 리빌드까지 해 줘야 하므로 귀찮니즘이....)


5. 파티션 테이블에서 append 힌트를 사용해서 insert시에
테이블 전체에 락을 잡는지 아니면 해당 파티션에만 락을 잡는지

==> 일반적으로 생각해 보면 오라클이 append시 어떤 값이 들어 올지 모르므로
테이블 전체에 대해 락을 잡을듯 하네요.
insert into tbl partition (part_name)
select * from tbl2;
위의 구문이 동작하므로 파티션 단위로 락을 잡게 할 수 있으므로 전체를 잡을듯하네요.
이것도 누가 테스트 해주세요...ㅎㅎ


우와 답글 달기 힘드네요..
일 않하고 한시간째 글썼네요...ㅋㅋ

by maxmania [2009.10.19 18:17:25]
멋지세요 ㅎㅎ
테스트 필요한 부분은 테스트 후에 추가해 놓을께요~

by drakula [2009.10.19 20:27:08]
ㅎㅎㅎ;;종원오빠 오늘, 하루종일 이거 쓰고
저번에 cr block 테스트 한거 아냠??

by 타락천사 [2009.10.20 17:03:13]
이런 좋은 글은 전체 공유가 가능하도록 조절하는게 맞을듯 싶어요
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입