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/E11882_01/server.112/e40402/initparams072.htm#REFRN10043
체크포인트 튜닝과 문제 해결 방안 (Doc ID 1526181.1)