프린트 하기

내맘대로긍정이 알려주는

Oracle 23ai 신기능
무료 세미나

자세히보기 trending_flat
2024
10.12
14:00

OS환경 : Oracle Linux 7.6 (64bit)


DB 환경 : Oracle Database 12.2.0.1


방법 : 오라클 redo log switch 와 first_change#, resetlogs_change#, 리두 정리, redo 정리

리두로그에 관련된 몇가지 뷰에 대해 알아봄

이 글에 포함된 테스트

- log switch에 따라 redo log 변화상태 테스트

- log switch에 따라 v$log_history 뷰의 rows 변화상태 테스트

- resetlogs open시 v$log_history 뷰의 resetlogs_change# 변화상태 테스트


1. v$log 뷰

v$log 뷰 중요 컬럼 설명(굵게 표시)

GROUP# : 로그번호

THREAD# : 로그 스레드 번호

SEQUENCE# : 로그 시퀀스 번호

BYTES : 로그 크기 (바이트)

BLOCKSIZE : 로그 파일의 블록 크기 (512 또는 4096)

MEMBERS : 로그 그룹의 멤버수

ARCHIVED : 아카이브 되었는지 여부(YES 또는 NO)

STATUS : 로그 상태 :

UNUSED - 온라인 리두 로그가 작성된 적이 없다는것을 의미

RESETLOGS로 OPEN 직후 CURRNET 리두 로그가 아닌 리두 로그와 신규로 추가 된 리두 로그가 UNUSED로 표시됨

CURRENT - CURRNET 리두 로그, 리두 로그가 활성화되었음을 의미함, 현재 동작중인 리두 로그

ACTIVE - 로그가 active 상태이지만 CURRNET 로그는 아님, crash recovery에 필요함, 블록 복구에 사용 중일 수 있음, 보관되거나 보관되지 않을 수 있음

CLEARING - ALTER DATABASE CLEAR LOGFILE 명령문 이후에 로그가 빈 로그로 다시 작성됨

로그가 지워지면 상태가 UNUSED로 변경됨

INACTIVE - 더 이상 instance recovery에 필요하지 않은 로그, media recovery에 사용 중일 수 있음, 보관되거나 보관되지 않을 수 있음, CURRENT인 파일이 용량이 다 차서 쓰지못하기 전까지 '대기'하고 있는 로그 파일

FIRST_CHANGE# : 로그에서 가장 낮은 SYSTEM CHANGE NUMBER (SCN)

FIRST_TIME : 로그에서 첫 번째 SCN의 시간

NEXT_CHANGE# : 로그에서 가장 높은 SYSTEM CHANGE NUMBER (SCN)

STATUS가 CURRENT인 리두그룹은 NEXT_CHANGE#가 가장 높은 SCN인 18,446,744,073,709,551,615로 설정됨

NEXT_TIME : 로그에서 가장 높은 SCN의 시간, STATUS가 CURRENT인 리두그룹은 NULL로 설정됨

CON_ID : 데이터가 관련된 컨테이너의 ID(컨테이너 db에서 사용하는 컬럽 12c부터 추가됨)

가능한 값

0 - 이 값은 전체 CDB와 관련된 데이터를 포함하는 행에 사용됨 이 값은 비 CDB의 행에도 사용됨

1 - 이 값은 루트에만 관련된 데이터를 포함하는 행에 사용됨

n - 여기서 n 은 데이터를 포함하는 행에 적용 가능한 컨테이너 ID



log switch에 따라 redo log 변화상태 테스트

현재 리두로그 그룹과 상태, first_change#, next_change# 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL>
set lines 200
set pages 1000
col member for a60
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 NO  CURRENT               200    12135750   1.8447E+19
     2 YES INACTIVE            200    12097368     12135750
     3 YES INACTIVE            200    12082434     12097368

현재 CURRENT인 group 1번은 first_change#이 가장 높음

그리고 group 1번의 next_change#은 1.8447E+19(가장높은값)으로 표시되어 있음



이때 log switch 작업을 하게 되면 first_change#이 가장 낮은 group(3번)이 CURRENT 상태가됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> alter system switch logfile;
 
System altered.
 
SQL>
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 YES ACTIVE               200    12135750     12162089
     2 YES INACTIVE            200    12097368     12135750
     3 NO  CURRENT               200    12162089   1.8447E+19

group 3번의 first_change#가 12082434으로 가장 낮았었지만 12162089로 가장 높아지고 CURRENT가 됨

그리고 group 3번의 next_change#은 1.8447E+19(가장높은값)으로 표시되어 있음



이때 log switch 작업을 한번더 하게 되면 first_change#이 가장 낮은 group(2번)이 CURRENT 상태가됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> alter system switch logfile;
 
System altered.
 
SQL>
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 YES INACTIVE            200    12135750     12162089
     2 NO  CURRENT               200    12164468   1.8447E+19
     3 YES ACTIVE               200    12162089     12164468

group 2번의 first_change#가 12097368으로 가장 낮았었지만 12164468로 가장 높아지고 CURRENT가 됨

그리고 group 2번의 next_change#은 1.8447E+19(가장높은값)으로 표시되어 있음



이 상태에서 redo log 추가

1
2
3
SQL> alter database add logfile group 4 '/oracle/app/oracle/oradata/ORCL12/redo04.log' size 200m;
 
Database altered.



리두로그 그룹과 상태, first_change#, next_change# 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL>
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 YES INACTIVE            200    12135750     12162089
     2 NO  CURRENT               200    12164468   1.8447E+19
     3 YES ACTIVE               200    12162089     12164468
     4 YES UNUSED               200           0        0

새로 추가된 group 4번은 UNUSED로 표시되고 first_change#, next_change# 이 0으로 표시됨



이때 log switch 작업을 한번더 하게 되면 first_change#이 가장 낮은 group(4번)이 CURRENT 상태가됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL> alter system switch logfile;
 
System altered.
 
SQL>
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 YES INACTIVE            200    12135750     12162089
     2 YES ACTIVE               200    12164468     12164760
     3 YES INACTIVE            200    12162089     12164468
     4 NO  CURRENT               200    12164760   1.8447E+19
기존의 first_change# 이 12135750으로 가장 낮은 group 1번이 CURRENT까 되는것이 아닌
추가 후 first_change# 이 0으로 가장 낮은 group 4번이 CURRENT가 됨


이 테스트로 group 번호 순서대로 log switch가 되는게 아니라는것을 알수 있음


2. v$log_history 뷰

v$log_history 뷰 중요 컬럼 설명(굵게 표시)
RECID : controlfile 레코드 ID
STAMP : controlfile 레코드 스탬프
THREAD# : archived log의 스레드 번호
SEQUENCE# : archived log의 시퀀스 번호
FIRST_CHANGE# : 로그에서 가장 낮은 SYSTEM CHANGE NUMBER (SCN)
FIRST_TIME : 로그에서 첫 번째 SCN의 시간
NEXT_CHANGE# : 로그에서 가장 높은 SYSTEM CHANGE NUMBER (SCN)
RESETLOGS_CHANGE# : RESETLOGS 로 OPEN 후 첫 SCN
RESETLOGS_TIME : 로그가 기록 된 데이터베이스의 Resetlogs 시간

CON_ID : 데이터가 관련된 컨테이너의 ID(컨테이너 db에서 사용하는 컬럽 12c부터 추가됨)

가능한 값

0 - 이 값은 전체 CDB와 관련된 데이터를 포함하는 행에 사용됨 이 값은 비 CDB의 행에도 사용됨

1 - 이 값은 루트에만 관련된 데이터를 포함하는 행에 사용됨

n - 여기서 n 은 데이터를 포함하는 행에 적용 가능한 컨테이너 ID



log switch에 따라 v$log_history 뷰의 rows 변화상태 테스트

현재 v$log_history 뷰 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL>
select recid, stamp, first_change#, resetlogs_change#, resetlogs_time 
from v$log_history
/
 
     RECID    STAMP FIRST_CHANGE# RESETLOGS_CHANGE# RESETLOGS
---------- ---------- ------------- ----------------- ---------
       181 1025309802        3905872            1 15-OCT-19
       182 1025354493        3923046            1 15-OCT-19
       183 1025388060        3955844            1 15-OCT-19
.
.
       469 1033484437       12097368            1 15-OCT-19
       470 1033515059       12135750            1 15-OCT-19
       471 1033516655       12162089            1 15-OCT-19
       472 1033516971       12164468            1 15-OCT-19
 
292 rows selected.

직전의 CURRENT (현재는 INACTIVE) 상태인 group 2번(first_change# 12164468)이 제일 마지막에 표시됨



v$log 뷰 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL>
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 YES INACTIVE            200    12135750     12162089
     2 YES INACTIVE            200    12164468     12164760
     3 YES INACTIVE            200    12162089     12164468
     4 NO  CURRENT               200    12164760   1.8447E+19

현재는 INACTIVE 상태인 group 2번

이후 한번의 log switch 후에는 CURRENT 상태인 group 4번이 v$log_history 제일 마지막에 추가될 것임



log switch 후 v$log_history 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL> alter system switch logfile;
 
System altered.
 
SQL> 
select recid, stamp, first_change#, resetlogs_change#, resetlogs_time 
from v$log_history
/
 
     RECID    STAMP FIRST_CHANGE# RESETLOGS_CHANGE# RESETLOGS
---------- ---------- ------------- ----------------- ---------
       182 1025354493        3923046            1 15-OCT-19
       183 1025388060        3955844            1 15-OCT-19
       184 1025396373        3977902            1 15-OCT-19
.
.
       470 1033515059       12135750            1 15-OCT-19
       471 1033516655       12162089            1 15-OCT-19
       472 1033516971       12164468            1 15-OCT-19
       473 1033519132       12164760            1 15-OCT-19
 
292 rows selected.

직전의 CURRENT 상태인 group 4번(first_change# 12164760)이 제일 마지막에 표시됨

* rows는 292개로 동일함 RECID가 가장 낮은 제일 위 row가 지워지고 제일아래에 새로운 row가 추가됨

이 rows 는 MAXLOGHISTORY Parameter 에 의해서 제어되고 이 값을 변경하고 싶다면

controlfile을 재생성해야함



컨트롤 파일 trace 백업 후 해당 파일의 MAXLOGHISTORY 부분을 수정하면 됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SQL> alter database backup controlfile to trace as '/home/oracle/recon.sql';
 
Database altered.
 
SQL> !cat recon.sql 
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL12" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/oracle/app/oracle/oradata/ORCL12/redo01.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 2 '/oracle/app/oracle/oradata/ORCL12/redo02.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 3 '/oracle/app/oracle/oradata/ORCL12/redo03.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 4 '//oracle/app/oracle/oradata/ORCL12/redo04.log'  SIZE 200M BLOCKSIZE 512
DATAFILE
  '/oracle/app/oracle/oradata/ORCL12/system01.dbf',
  '/oracle/app/oracle/oradata/ORCL12/sysaux01.dbf',
  '/oracle/app/oracle/oradata/ORCL12/undotbs01.dbf',
  '/oracle/app/oracle/oradata/ORCL12/users01.dbf',
  '/oracle/app/oracle/oradata/ORCL12/sysaud01.dbf'
CHARACTER SET KO16MSWIN949
;



resetlogs open시 v$log_history 뷰의 resetlogs_change# 변화상태 테스트

현재 v$log_history 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL> 
select recid, stamp, first_change#, resetlogs_change#, resetlogs_time 
from v$log_history
/
 
     RECID    STAMP FIRST_CHANGE# RESETLOGS_CHANGE# RESETLOGS
---------- ---------- ------------- ----------------- ---------
       182 1025354493        3923046            1 15-OCT-19
       183 1025388060        3955844            1 15-OCT-19
       184 1025396373        3977902            1 15-OCT-19
.
.
       470 1033515059       12135750            1 15-OCT-19
       471 1033516655       12162089            1 15-OCT-19
       472 1033516971       12164468            1 15-OCT-19
       473 1033519132       12164760            1 15-OCT-19
 
292 rows selected.

현재 RESETLOGS_CHANGE#이 1로 표시되어 있음



위에서 만든 recon.sql 로 컨트롤파일 재생성 후 resetlogs 로 open 시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> @recon
ORACLE instance started.
 
Total System Global Area 1660944384 bytes
Fixed Size            8621376 bytes
Variable Size         1023410880 bytes
Database Buffers      620756992 bytes
Redo Buffers            8155136 bytes
 
Control file created.
 
SQL> alter database open resetlogs;
 
Database altered.

resetlogs로 오픈됨



v$log 뷰 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> 
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 NO  CURRENT               200    12171747   1.8447E+19
     2 YES UNUSED               200           0        0
     3 YES UNUSED               200           0        0
     4 YES UNUSED               200           0        0

group 1번만 CURRENT 상태이고 first_change#이 12171747임

나머지 group은 UNUNED 상태임



현재 v$log_history 확인

1
2
3
4
5
6
7
8
SQL> 
select recid, stamp, first_change#, resetlogs_change#, resetlogs_time 
from v$log_history
/
 
     RECID    STAMP FIRST_CHANGE# RESETLOGS_CHANGE# RESETLOGS
---------- ---------- ------------- ----------------- ---------
     1 1033520059       12169039            1 15-OCT-19

모두 다 지워지고 1개만 표시됨, 컨트롤파일 재생성 전 마지막 값이 recid 1번의 first_change#에 기록되어있음



log switch 후 v$log_history 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> alter system switch logfile;
 
System altered.
 
SQL> 
select recid, stamp, first_change#, resetlogs_change#, resetlogs_time 
from v$log_history
/
 
     RECID    STAMP FIRST_CHANGE# RESETLOGS_CHANGE# RESETLOGS
---------- ---------- ------------- ----------------- ---------
     1 1033520059       12169039            1 15-OCT-19
     2 1033520375       12171747         12171747 28-FEB-20

resetlogs로 open 한 뒤 제일 처음 CURRENT group 1번의 first_change#이 resetlogs_change#으로 기록됨



v$log 뷰 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> 
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 YES ACTIVE               200    12171747     12172412
     2 NO  CURRENT               200    12172412   1.8447E+19
     3 YES UNUSED               200           0        0
     4 YES UNUSED               200           0        0



log switch 한번 더 실행 후 v$log_history 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> alter system switch logfile;
 
System altered.
 
SQL> 
select recid, stamp, first_change#, resetlogs_change#, resetlogs_time 
from v$log_history
/
 
     RECID    STAMP FIRST_CHANGE# RESETLOGS_CHANGE# RESETLOGS
---------- ---------- ------------- ----------------- ---------
     1 1033520059       12169039            1 15-OCT-19
     2 1033520375       12171747         12171747 28-FEB-20
     3 1033520584       12172412         12171747 28-FEB-20

직전의 CURRENT 상태인 group 2번(first_change# 12172412)이 제일 마지막에 표시됨

resetlogs로 open 한 뒤 제일 처음 CURRENT group 1번의 first_change#이 계속 resetlogs_change#으로 기록됨

이후 쌓이는 row도 resetlogs_change# 가 모두 같은 12171747으로 기록됨



그리고 resetlogs_time 컬럼을 통해 해당 db가 resetlogs로 언제 open 이 되었는지도 확인이 가능함

+ resetlogs 로 open 시 이전의 아카이브 파일은 모두 사용 불가함



https://positivemh.tistory.com/244 글에 있는

$ORACLE_HOME/suptools/orachk/.cgrep/scnhealthcheck.sql 스크립트로 

현재 db의 CURRENT SCN을 조회할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> @?/suptools/orachk/.cgrep/scnhealthcheck.sql
--------------------------------------------------------------
ScnHealthCheck
--------------------------------------------------------------
Current Date: 2020/02/28 10:54:23
Current SCN:  12191321
Version:      12.2.0.1.0
--------------------------------------------------------------
Result: A - SCN Headroom is good
Apply the latest recommended patches
based on your maintenance schedule
For further information review MOS document id 1393363.1
--------------------------------------------------------------

여기에 나온 SCN은 v$log 에 나오는 first_change#, next_change# 값보다 큼



v$log 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> 
select l.group#, archived, l.status, (bytes/1024/1024) MB, first_change#, next_change#
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# ARC STATUS            MB FIRST_CHANGE# NEXT_CHANGE#
---------- --- ---------------- ---------- ------------- ------------
     1 YES INACTIVE            200    12191233     12191237
     2 YES INACTIVE            200    12191237     12191242
     3 NO  CURRENT               200    12191242   1.8447E+19
     4 YES INACTIVE            200    12191227     12191233

group 3번(CURRENT) 의 next_change# 제외하고는 모두 scnhealthcheck.sql 에 나오는 SCN보다 낮은 값임




참조 : 

https://m.blog.naver.com/fntlove/110127514184

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/refrn/V-LOG.html

https://m.blog.naver.com/darkturtle/50030044270

https://positivemh.tistory.com/244