SQL2000 강좌
트랜젝션과 로그는 아주 밀접한 관계가 있습니다.
물론 로그 이야기가 나오니.. 복구 하는 부분과도 대단히 밀접한 관련이 있지요.
또한 SQL서버는 내부적으로 체크포인트라고 하는 프로세스를 발생 시키는데..
이 작업이 디스크에 쓰기와 관련이 대단히 많습니다.
트랜젝션부터 복구 작업까지 이어지는 이야기를 찬찬히 알아 보도록 하지요.
먼저 한가지 퀴즈 입니다.
데이터 변경 작업이 일어날 경우에.. 예를들면 INSERT나 DELETE, UPDATE 작업이 수행될
경우 이 작업이 즉시!! 디스크 - 컴퓨터의 하드디스크의 MDF화일이나 LDF화일에
쓰여지는 것일까요?
답은 아닙니다 입니다.
SQL서버는 빠른 처리 속도를 위해서 이 데이터 변경을
캐시에 저장하고 있다가 Check Point Process(체크포인트 프로세스)라고 하는
SQL서버 내부의 프로세스가 활성화 될 경우에 이 캐시상의 데이터 변경을
디스크에 쓰게 됩니다.
왜? - 빠른 속도를 위해서 입니다. -_-;;
그렇다면? 질문?
insert를 하자마자 데이터를 select하면 데이터가 삽입된게 보이자나요~~~
이건 또 몹니까~~~ 코난이가 구라를 치는 것이냐? -_-;;
아닙니다. SELECT를 하게 될 경우..
1. 디스크의 테이블에서 데이터를 조회한다.
+
2. 메모리상의 캐시 영역에더 역시나 데이터를 또한 조회해서
SELECT의 결과셋을 내부적으로 생성 사용자에게 뿌려주게 되는 것입니다.
조금더 흥미 있는 이야기를 들려 드린다면?
진행중인 트랜젝션 역시 디스크에 쓰게 됩니다. 언제? 체크포인트 발생시마다!!
체크포인트는 퍼지 이론에 의애 대략 1분정도에 한번씩 발생합니다. - 주기 변경 가능합니다.
이때 현재 활성중인 트랜젝션(계속 수행중인 트랜젝션) 역시 디스크에 씁니다.
이를 보통 Write Ahead Log(먼저 쓰기 로그)라고 하며 SQL서버는 이 방식을 취하지요.
(사실 내부적인 이야기라서 이런 이야기는 많은 개발자 분들은 필요가 없을듯 하지만..
이 장의 마지막쯤 말씀드릴 COM 구성요소를 생성할 경우 아주 중요한 이야기가 되기 때문에..
설명을 드리는 것이니.. 이해해 주세요. - 개발자도 알아야만 합니다.!!!!)
그렇다면 이제 우리가 사용하려 하는 트랜젝션과 체크포인트 이야기를 해 보도록
하지요.
트랜젝션과 체크포인트를 이해하실 때 많이 보셨을만한 그림입니다.
1. 체크포인트 프로세스가 두번 발생했으며 시스템 장애로 꺼져버렸습니다.
Tran1, Tran2, Tran3이 있지요.
Tran1은 첫번째 체크포인트에서 수행중이였습니다. 그리고 두번째 체크포인트 전에
끝났지요. - 두번째 체크포인트에서 디스크에 써짐
Tran2는 첫번째 체크포인트에서 수행중, 두번째 체크포인트에서 수행중이고
체크포인트 없는 상태에서 트랜젝션이 끝났습니다.
Tran3은 두번째 체크포인트에서 수행중 그리고 시스템 실패까지 수행중입니다.
그렇다면 문제가 발생 했을때.. 어느녀석을 복구해야 정석일까요?
이때 바로 맨 처음에 말씀드린 REDO와 UNDO 이야기가 나옵니다.
SQL서버는 항상 자동복구라는 프로세스가 SQL서버 시작시 활동하게 됩니다.
(정전후 SQL서버를 키니 이상한 스크롤바가 나와서 완료라고 하며 사라지는 것
보신분 계실 겁니다.) 이녀석은 항상 먼저 로그를 확인하고 철회시킬 녀석과 재수행
시킬 녀석을 판단합니다. 복구시는?
Tran1은 어떨까요?
체크포인트 전에 Commit이 있으니? REDO(재수행)을 시킵니다.
Tran2는 어떨가요?
체크포인트 전에 Commit이 없으니 UNDO(철회)를 시킵니다. - 데이터를 최초의
상태 - 트랜젝션이 시작하기 전의 상태로 바꾼다는 것입니다.
Tran3은 그럼???
역시나 체크포인트 전에 Commit이 없으니 역시나 철회가 됩니다.
그러면? 데이터베이스는 스테이블한 상태가 되면서 계속 작업을 수행하게 되지요.
자.!! 그럼 대강 느끼시겠지만.. 처 체크포인트가 발생하는 시점으로..!!
데이터의 복구와 처리 여부가 결정되니 중요한 녀석이구먼.. 하는
생각이 드실 겁니다.
그럼 저 Check Point는 언제 발생하는가?
1. 자동적으로 1분 정도에 한번씩 발생합니다.
2. 쿼리 분석기에서 CHECKPOINT 라고 수행할 경우
3. SHUTDOWN 구문을 수행할 경우 - 잘 모르시는 분들이 많은데요..
쿼리로 멈추는 겁니다.
4. SQL서버 서비스를 중단할 경우
이렇게 발생합니다. 기억하실 부분으로..
1번과 3번 정도가 되겠지요. SQL서버가 멈추어도 수행 됩니다.
잠시 생각을 좀더 드리는 의미로.. sp_dboption에서..
체크포인트 발생시 로그를 디스크에 기록하지 않고 버리라고 하는 옵션 기억 하시나요?
|
sp_dboption '디비명', 'trunc. log on chkpt.', 'true'
|
라고 하시면? 체크포인트시 - 바로 오늘 배우신 체크포인트를 의미 합니다.- 에 로그를
비우는 옵션이지요. 위의 구문은 SQL7과 SQL2000 모두 사용 가능하구요..
또한 데이터베이스의 복구 모델을 simple모델로 바꿔도
저 옵션이 자동 활성화가 됩니다. SQL2000만 사용 가능한 명령은 아래 입니다.
|
alter database 디비명 set recovery simple
|
이렇게 사용 역시 가능하지요.
누누히 말씀 드리지만.. 테스트나 개발용 DB가 아닌 실제 서버에서는..
위의 방법으로 로그를 비우지 마시고.. FULL 모델이나 대량 로그 모델로 하시고
로그를 주기적으로 백업하라는 말씀을 누누히 드렸습니다. 참고하세요.
또한 checkpoint 발생 주기 변경역시.. 가능하다고 말씀 드렸지요.
|
--옵션 recovery interval (min)이 안보일 경우
|
라고 해 보시면?
recovery interval (min) 이 보일 거구요. 이것이 발생 주기 입니다.
삽입등의 여러 상황을 고려해 변경이 가능하나 함부로 변경할 경우 느려질 수 있으니
참고하세요.
오늘의 트랜젝션 이야기돠는 틀리지만.. 종종 사용하게 되는 옵션이라 리마인드 해
드린 거구요.. 체크포인트 어떤 녀석인지 이제 감이 좀 잡히시는지요? ^_^
사실 체크포인트와 자동 복구 부분은 SQL서버의 대단히 아래쪽의 이야기 입니다.
SQL서버의 여러 엔진 부분의 다양한 요소를 아셔야 하겠지만.. 위에서 제가 설명드린
부분은 이런 아래쪽의 엔진부분을 숨기고 처음 접하시는 분들도 쉽게 접하실 수
있도록 대단히 많이 래핑한것이니.. 조금더 깊이있는 공부를 원하시는 분들은
참고 하시길 바랍니다.
자 그럼 다음 이야기인 잠금을 이해하는 부분으로 넘어가 보도록 하지요.
이녀석도 별것 아닌 쉬운 이야기 입니다. ^_^
11. 트랜젝션과 잠금처리 - 3. 트랜젝션과 체크 포인트(Check Point)

부족하지만, SQLER의 누군가와 함께한 나눔을 통해 제가 더 많이 즐거웠습니다.
SQLER와 함께 즐거워 할수록, 그 나눔을 통해 더 많은 기회와 가치를 발견하게 되었습니다.
나눔의 생각이 앞으로도 계속, SQLER를 움직일 것입니다.
코난, 김대우 / SQLER 운영자 / 골라먹는 SQLER RSS 정보 구독 / 실시간 SQLER 소식 uxkorea 트위터

코난