내맘대로긍정이 알려주는
Oracle 23ai 신기능
무료 세미나 발표자료
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 |
2. v$log_history 뷰
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'ORACLE > Admin' 카테고리의 다른 글
오라클 18c fra 영역 설정하기 (0) | 2020.03.23 |
---|---|
오라클 유저에게 기본적으로 주는 롤 connect와 resource 에 포함된 권한 확인 (0) | 2020.02.28 |
오라클 파라미터 뷰, 파일 관련 정리 spfile, v$parameter, v$parameter2, v$spparameter 비교 (0) | 2020.02.11 |
오라클 control file 경로 변경 및 이중화 (0) | 2020.02.11 |
오라클 audit 정리 및 테스트 (3) | 2020.02.01 |