본문 바로가기
Oracle/운영

Checkpoint와 Checkpoint not complete

by 취미툰 2020. 9. 9.
반응형

오늘 DB가 느려졌다는 연락을 받고 Alert log를 확인해보니 특정시간 이후 Redo log파일의 switch가 자주 일어나고 있었고 그에 따라 Checkpoint not complete 에러가 계속 발생하고 있었습니다. 결국 DB 재기동을 통해서 눈앞의 급한 이슈는 해결할 수 있었지만, 다음번에는 재기동 없이 해결할 수 있는 방법을 찾기 위해서 정리해보고자 합니다.

 

 

1.Checkpoint란?

메모리에 있는 block buffer의 내용과 disk의 data block간의 내용을 맞추는 것이라고 할 수 있습니다.

checkpoint가 발생하면 그때까지 메모리내의 block에 가해진 모든 변경사항을 disk 상의 datafile 내에 반영하게 됩니다. 

database crash에 의해 복구가 필요하게되면 이 checkpoint이후의 변경사항에 대해서만 복구를 시도하면 되므로 복구를 쉽고 효율적으로 수행할 수 있습니다.

checkpoint 중에 수행되는 작업은 아래의 두가지입니다.

-DBWR이 buffer cache내의 모든 변경된 block을 datafile에 기록합니다.

-LGWR(혹은 CKPT)가 현재 발생한 checkpoint의 SCN값을 datafile과 controlfile에 기록합니다. 

 

중요한 것은 checkpoint event가 발생하여 block buffer에 어느 block이 disk로 쓰여져야 하는가를 표시하면 DBWR은 순서와 관계없이 disk로 쓰게 됩니다. redo log gorup1에 대한 buffer를 checkpoint하고 있는 중에 redo log group2에 대한 checkpoint가 들어오면 group1에 대한 checkpoint를 끝내고 group2에 대한 처리를 하는것이 아니고, group1에 대한 checkpoint가 진행중에 group2에 해당하는 buffer도 buffer cache내에 모두 표시한 후 group1이냐 group2냐 구별없이 순서없이 랜덤으로 checkpoint로 인해 disk로 쓰여지는 것입니다.

 

checkpoint가 발생하는 경우는 다음 4가지입니다.

1.log switch

2.log_checkpoint_interval 만큼의 os block 간격

3.log_checkpoint_timeout 초 간격

4.alter system checkpoint 명령문 수행 시

 

2.Checkpoint의 성능

checkpoint를 자주하면 복구시간을 줄일 수 있는 장점이 있지만, 운영 시에는 속도를 저하시키는 요인이 되기도 합니다. checkpoint 중에는 해당 datafile의 header 내용이 고정되어 datafile header에 대한 다른 작업이 진행되지 못합니다. 또한 checkpoint 간격이 너무 짧으면 'checkpoint not complete'가 발생할 가능성도 커지게 됩니다.

 

 

3.CKPT Process

Checkpoint 수행 중 SCN의 값을 controlfile과 datafile header에 반영시키는 작업을 수행하는 백그라운드 프로세스입니다. 버전에 따라서 LGWR이 그 행위를 수행할 수도있고 CKPT가 수행할 수도 있습니다.

Oracle 8i 이상에서는 CKPT가 항상 기동되어서 CKPT가 checkpoint를 반영시키는 작업을 수행합니다.

 

 

4.Checkpoint가 발생되는 시점

1.log switch

log switch가 발생하면 항상 checkpoint가 발생합니다. 하지만 checkpoint가 발생한다고 하여 log switch가 항상 되는것은 아닙니다. log switch가 되는 경우는 사용중인 log file이 모두 쓰여졌거나 alter system switch logfile을 수행한 경우입니다.

 

2.log_checkpoint_interval

이 파라미터의 단위는 OS block size로 이 크기만큼의 redo log file에 기록한 후 checkpoint가 발생합니다.

예를들어 log_checkpoint_interval이 10,000으로 지정되어 있고 대부분의 UNIX의 경우 한 OS block size가 512bytes이면 10,000 * 512bytes = 5MB가 됩니다. redo log file의 크기가 20MB라고 가정할 때 5MB마다 checkpoint가 발생하므로 redo log file하나를 기록하는 동안 4번의 checkpoint가 발생하게 됩니다.

 

반대로 redo log file 사이즈가 더 작다면(3MB) 파라미터는 무시되고 log switch 될때 checkpoint가 수행됩니다.

 

3.log_checkpoint_timeout

이파라미터의 단위는 초단위이며, 이 시간 간격으로 checkpoint가 발생하게 됩니다. 해당 파라미터 설정 시 트랜잭션이 발생하지 않아도 일정시간이 지나면 무조건 checkpoint를 발생시키기 때문에 불필요한 checkpoint를 발생시킬수도 있습니다.

 

5.Redo log  file과 Checkpoint

log switch시에는 항상 checkpoint가 발생합니다. 따라서 redo log file과 밀접한 관련이 있으며, redo log file 크기가 너무 작으면 불필요한 checkpoint작업이 자주 발생할 수 있습니다. checkpoint가 자주 발생하면 성능저하가 되므로, 오라클에서는 1시간에 한번정도의 log switch작업을 권장하고 있습니다. 

 

redo log file의 크기가 작아 발생하는 또다른 문제점은 log file의 status가 ACTIVE인 상태로 오래 지속되는 것입니다.

redo log file은 log switch가 발생하고 checkpoint가 진행되는 동안 ACTIVE상태가 됩니다. checkpoint가 완전히 끝나면 INACTIVE상태가 됩니다. 그런데 redo log file 크기가 작아 아직 이전 redo log file에 대한 checkpoint가 끝나지 않았는데 새로운 checkpoint event가 발생되면 이전 checkpoint와 새로운 checkpoint가 구별되어 수행되는 것이 아니고 이전 checkpoint와 새로운 checkpoint가 하나로 묶여 새로운 checkpoint까지 끝나야만 INACTIVE상태도 변경이 됩니다.

 

Checkpoint중인 datafile header에는 다른 작업이 blocking되기 때문에 checkpoint중인 상태로 오래 지속되는 것은 바람직하지 않으며 적정한 크기와 갯수가 중요하게 됩니다.

 

6.Checkpoint not complete

다량의 import작업이나 load 혹은 batch작업을 진행하는 경우 DB가 Hang이 걸리며 alert log에는 checkpoint not complete 메세지가 계속해서 발생하는 경우가 있습니다.

 

이 메세지가 나타나는 것은 LGWR이 redo log를 재사용하려고 하는데 아직 그 redo log file이 checkpoint가 끝나지 않은 상태임을 나타냅니다. 

예를들어 1번 redo에 내용을 기록하고 2번으로 switch하면서 1번에 대한 checkpoint를 진행중인 상태에서 2번 3번 redo를 모두 사용하고 다시 1번을 사용하려 할 때 아직 checkpoint가 진행중이라면 위의 메세지가 발생하며 1번을 다시 사용할 수 있을 때 까지 DB의 모든 변경작업은 waiting상태가 됩니다.

 

이러한 현상은 DB에 변경을 가하는 DML이 한꺼번에 빠르게 수행되는 경우 LGWR이 redo log file에 빠른 속도로 많은 내용을 기록하는 경우 발생합니다.

 

redo log file의 크기나 갯수가 작아 log switch가 빈번히 발생하는 경우 한바퀴 도는 시간이 너무 빠르게되면 이 현상을 쉽게 발생 가능합니다.

 

해결하기 위한 방안은 아래와 같습니다.

 

1.LGWR이 redo log file을 한바퀴 도는 시간을 지연시킵니다.
- Redo log file의 크기를 증가
- Redo log group을 추가

2.Checkpoint를 자주 발생시키지 않도록 합니다.
- log_checkpoint_interval의 값을 증가
- online redo log file의 크기를 증가

3.checkpoint작업의 효율성을 증가시킵니다.
- db_block_size를 증가시켜 DBWR이 checkpoint시에 disk에 write하는 속도를 향상시킵니다.
(이것은 DB를 완전히 다시 만드는 작업이어서 계속해서 심각하게 영향을 미치는 경우 고려할 것)

 

 

출처 : community.oracle.com/thread/470708

반응형

'Oracle > 운영' 카테고리의 다른 글

Oracle Lock 걸린 세션 확인 및 Lock관련 테이블  (0) 2020.09.21
BINARY_FLOAT,BINARY_DOUBLE  (0) 2020.09.11
Temp Tablespace  (0) 2020.09.08
Reorg 방법 - Shrink 와 Move  (2) 2020.09.02
Pivot 함수와 Pivot XML  (1) 2020.08.29

댓글