프린트 하기

OS환경 : Oracle Linux 7.3 (64bit)

 

DB 환경 : Oracle Database 12.2.0.1

 

에러 : Checkpoint not complete

alert log를 보던중 Checkpoint not complete(checkpoint fail)이 빈번하게 발생하는 현상을 확인

1
2
3
4
5
6
2018-06-01T23:16:51.680048+09:00
Thread 1 cannot allocate new log, sequence 771
Checkpoint not complete
  Current log# 4 seq# 770 mem# 0/app/oracle/oradata/orcl2/redo04.log
2018-06-01T23:16:54.519392+09:00
Thread 1 advanced to log sequence 771 (LGWR switch)

 

 

해결 방법

select * from v$log를 통하여 현재 redo log file의 상태들이 어떤가 확인해봄

대부분 4개중에 1개는 현재 Current 로 씌여지고 있는것이고 나머지도 ACTIVE로 되어 있었음

 

로그파일 상태 

Current : 현재 쓰고 있는 redo log file

 

Active: 다쓰거나, log switch가 발생하여 쓰는 log file이 바뀌었는데 아직 예전 로그파일에 기록된 내용이 DB Buffer  cache에서 datafile로 저장되지 않은 상태를 말함

 

Inactive: 활성화된 log file이 바뀌었고, 그 log file의 내용이 DB buffer cache에서 datafile로 저장된 상태

 

 

redo log file을 추가

기존 redo log 그룹 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> select * from v$log;
 
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE      MEMBERS ARC STATUS           FIRST_CHANGE#
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- -------------
FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
--------- ------------ --------- ----------
     1        1         715   10485760       512        1 NO  ACTIVE             1129671
01-JUN-18      1130012 01-JUN-18      0
 
     2        1         716   10485760       512        1 NO  ACTIVE             1130012
01-JUN-18      1130357 01-JUN-18      0
 
     3        1         717   10485760       512        1 NO  CURRENT             1130357
01-JUN-18   1.8447E+19 (null)          0

 

기존 redo log 파일 확인

1
2
3
4
5
6
7
8
9
SQL> select * from v$logfile;
 
    GROUP# STATUS  TYPE    MEMBER                                  IS_    CON_ID
---------- ------- ------- --------------------------------------- --- ----------
     1 (null)  ONLINE       /app/oracle/oradata/orcl2/redo01.log   NO         0
     2 (null)  ONLINE       /app/oracle/oradata/orcl2/redo02.log   NO         0
     3 (null)  ONLINE       /app/oracle/oradata/orcl2/redo03.log   NO         0
 
3 rows selected.

 

리두 로그 파일 추가 방법

1
SQL> alter database add logfile group <number> 'redolog file 위치' size '원하는 용량';

만약 그동안 logfile group이 3까지 있었다고 한다면 

number에 4를 넣어주어 추가해주면 됨.

 

실제 사용

1
SQL> alter database add logfile group 4 '/app/oracle/oradata/orcl2/redo04.log' size 100m;

작업 완료후 만약 아직도 Active인것이 많다면 더 붙혀줘야 하고 아니라면 checkpoint fail 현상이 줄어들게 될것

 

 

또는 데이터를 많이 수정하는 시스템에선 DB_WRITER_PROCESSES 값을 늘리는 것도 방법이 될수 있음

1
2
3
SQL> alter system set DB_WRITER_PROCESSES=3 scope=spfile;
SQL> shutdown immediate
SQL> startup

 

 

이 값은 1 또는 CPU_COUNT/8 중 큰 값으로 설정되어야함

db 의 cpu_cont 값이 24인 경우 24/8=3이 DB_WRITER_PROCESSES 파라미터의 적정값임

1
2
3
4
5
SQL> show parameter cpu_count
 
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
cpu_count                 integer     24

참고로 DB_WRITER_PROCESSES는 일반적으로 오라클에 의해 계산되어야함(설치시 등)

 

 

원인 :  redo log file에 기록해야 할것들은 굉장히 많은데 비해 redo log file의 크기와 갯수가 부족하여 checkpoint fail 현상이 발생하게 된것

 

 

참조 : 

http://daniel5.tistory.com/1 [All about Daniel's life]

https://positivemh.tistory.com/402 Private strand flush not complete

https://positivemh.tistory.com/637 로그스위치 과다 발생 시 확인 사항

docs.oracle.com/cd/B16240_01/doc/doc.102/e16282/oracle_database_help/oracle_database_instance_throughput_dbwrcheckpoints_ps.html

docs.oracle.com/cd/E11882_01/server.112/e40402/initparams072.htm#REFRN10043

체크포인트 튜닝과 문제 해결 방안 (Doc ID 1526181.1)

www.dba-oracle.com/t_dbwr_database_writer_tuning_tips.htm