안녕하세요 오늘은 redo size증설 test했던 내용을 포스팅하겠습니다.
우선 redo가 어떤 역할을 하는지부터 알아보겠습니다.
REDO는 오라클 SGA영역에 있는 Redo Buffer 와 Redo Log File로 이루어져 있는데 Database에서 변경되는 내용을 저장하고 이는 Database의 복구를 목적으로 존재한다고 할 수 있습니다.
Redo가 일을 하는 조건으로는
매 3초마다, Log Buffer공간의 1/3이상 사용된 경우, 1MB 이상 사용되었을 경우, 사용자가 임의로 Commit 또는 Rollback한 경우, DBWR 프로세스에 의해 Disk로 변경된 내용이 기록되는 경우 등이 있습니다.
이전 고객사를 담당하며 alert.log를 확인하던 중 너무 빈번히 발생하는 로그스위치를 발견하고 redo log 증설에 대해 안내 드린 경험이 있습니다.
아래의 그림은 시간별 redo size 증설 전의 로그스위치 횟수를 조회한 결과입니다.
오라클에서 권고하는 시간당 리두로그 스위치의 횟수는 2~4회 정도입니다.
redo size 증설 전의 로그스위치의 횟수가 많게는 100회가 넘는것을 확인할 수 있습니다.
리두사이즈가 너무 작은경우 Wait Event가 발생할 수 있습니다.
발생할 수 있는 wait event의 경우 log file switch completion, log file switch archving needed, log file switch private strand flush incomplete 의 에러로그를 확인할 수 있습니다.
따라서 반드시 redo size증설이 필요하여 안내드렸습니다.
위의 이미지는 증설 후의 이미지 입니다. DB의 작업이 집중되는 시간이있어 로그스위치 횟수가 10회 넘는 시간대가 있지만
이전의 횟수들보다 확연히 줄어든것을 확인할 수 있습니다.
아래의 내용은 redo size 증설의 TEST내용입니다.
현재 리두 조회
COL MEMBER FOR A50
select l.group#, member, archived, l.status, (bytes/1024/1024) MB
from v$log l, v$logfile f
where f.group# = l.group#
order by 1;
GROUP# MEMBER ARC STATUS MB
---------- -------------------------------------------------- --- ---------------- ----------
1 /*****/oracle/app/oracle/oradata/ORCL11/redo01.log NO CURRENT 200
2 /*****/oracle/app/oracle/oradata/ORCL11/redo02.log YES INACTIVE 200
3 /*****/oracle/app/oracle/oradata/ORCL11/redo03.log YES INACTIVE 200
RAC의 경우 gv$log 테이블을 조회하여 INST_ID, THREAD#컬럼을 확인할 수 있습니다.
SQL> select * from gv$log;
INST_ID GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 1 28 209715200 512 1 NO CURRENT 1249033 02-FEB-21 2.8147E+14 (null)
1 2 1 26 209715200 512 1 YES INACTIVE 1073121 29-JAN-21 1157778 31-JAN-21
1 3 1 27 209715200 512 1 YES INACTIVE 1157778 31-JAN-21 1249033 02-FEB-21
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 28 209715200 512 1 NO CURRENT 1249033 02-FEB-21 2.8147E+14 (null)
2 1 26 209715200 512 1 YES INACTIVE 1073121 29-JAN-21 1157778 31-JAN-21
3 1 27 209715200 512 1 YES INACTIVE 1157778 31-JAN-21 1249033 02-FEB-21
REDO LOG 추가
REDO LOG 추가
alter database add logfile group 4 '/*****/oracle/app/oracle/oradata/ORCL11/redo04.log' size 300m;
alter database add logfile group 5 '/*****/oracle/app/oracle/oradata/ORCL11/redo05.log' size 300m;
alter database add logfile group 6 '/*****/oracle/app/oracle/oradata/ORCL11/redo06.log' size 300m;
REDO LOG 추가된 내용확인
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 28 209715200 512 1 NO CURRENT 1249033 02-FEB-21 2.8147E+14 (null)
2 1 26 209715200 512 1 YES INACTIVE 1073121 29-JAN-21 1157778 31-JAN-21
3 1 27 209715200 512 1 YES INACTIVE 1157778 31-JAN-21 1249033 02-FEB-21
4 1 0 314572800 512 1 YES UNUSED 0 (null) 0 (null)
5 1 0 314572800 512 1 YES UNUSED 0 (null) 0 (null)
6 1 0 314572800 512 1 YES UNUSED 0 (null) 0 (null)
6 rows selected.
추가한 REDO LOG가 CURRENT 상태가 되도록 LOG SWITCH합니다.
SQL> alter system switch logfile;
System altered.
SQL> /
System altered.
SQL> /
System altered.
SQL> /
System altered.
SQL> /
System altered.
SQL> /
System altered.
SQL> SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 34 209715200 512 1 YES INACTIVE 1327443 04-FEB-21 1327446 04-FEB-21
2 1 32 209715200 512 1 YES INACTIVE 1327437 04-FEB-21 1327440 04-FEB-21
3 1 33 209715200 512 1 YES INACTIVE 1327440 04-FEB-21 1327443 04-FEB-21
4 1 35 314572800 512 1 NO CURRENT 1327446 04-FEB-21 2.8147E+14 (null)
5 1 30 314572800 512 1 YES INACTIVE 1327431 04-FEB-21 1327434 04-FEB-21
6 1 31 314572800 512 1 YES INACTIVE 1327434 04-FEB-21 1327437 04-FEB-21
6 rows selected.
CHECK POINT를 발생시켜 REDO의 내용을 기록합니다.
SQL> alter system checkpoint;
System altered.
기존의 200MB의 리두로그를 삭제합니다.
select l.group#, member, archived, l.status, (bytes/1024/1024) MB
from v$log l, v$logfile f
where f.group# = l.group#
order by 1;
GROUP# MEMBER ARC STATUS MB
---------- -------------------------------------------------- --- ---------------- ----------
1 /*****/oracle/app/oracle/oradata/ORCL11/redo01.log YES INACTIVE 200
2 /*****/oracle/app/oracle/oradata/ORCL11/redo02.log YES INACTIVE 200
3 /*****/oracle/app/oracle/oradata/ORCL11/redo03.log YES INACTIVE 200
4 /*****/oracle/app/oracle/oradata/ORCL11/redo04.log NO CURRENT 300
5 /*****/oracle/app/oracle/oradata/ORCL11/redo05.log YES INACTIVE 300
6 /*****/oracle/app/oracle/oradata/ORCL11/redo06.log YES INACTIVE 300
6 rows selected.
REDO LOG 삭제
SQL> alter database drop logfile group 1;
Database altered.
SQL> alter database drop logfile group 2;
Database altered.
SQL> alter database drop logfile group 3;
Database altered.
기존 200M 짜리 REDO LOG 삭제완료 확인
SQL> select l.group#, member, archived, l.status, (bytes/1024/1024) MB
from v$log l, v$logfile f
where f.group# = l.group#
order by 1; 2 3 4
GROUP# MEMBER ARC STATUS MB
---------- -------------------------------------------------- --- ---------------- ----------
4 /*****/oracle/app/oracle/oradata/ORCL11/redo04.log NO CURRENT 300
5 /*****/oracle/app/oracle/oradata/ORCL11/redo05.log YES INACTIVE 300
6 /*****/oracle/app/oracle/oradata/ORCL11/redo06.log YES INACTIVE 300
물리적인 파일 삭제
[oracle@ORACLE11 ~]$ cd /*****/oracle/app/oracle/oradata/ORCL11/
[oracle@ORACLE11 ORCL11]$ ll
total 5192184
-rw-r----- 1 oracle dba 8077312 Feb 4 01:28 control01.ctl
-rw-r----- 1 oracle dba 8077312 Feb 4 01:28 control02.ctl
-rw-r----- 1 oracle dba 209715712 Feb 4 01:21 redo01.log
-rw-r----- 1 oracle dba 209715712 Feb 4 01:21 redo02.log
-rw-r----- 1 oracle dba 209715712 Feb 4 01:21 redo03.log
-rw-r----- 1 oracle dba 314573312 Feb 4 01:27 redo04.log
-rw-r----- 1 oracle dba 314573312 Feb 4 01:21 redo05.log
-rw-r----- 1 oracle dba 314573312 Feb 4 01:21 redo06.log
-rw-r----- 1 oracle dba 524296192 Feb 4 01:23 sysaux01.dbf
-rw-r----- 1 oracle dba 734011392 Feb 4 01:23 system01.dbf
-rw-r----- 1 oracle dba 2097160192 Feb 3 22:00 temp01.dbf
-rw-r----- 1 oracle dba 314580992 Feb 4 01:23 undotbs01.dbf
-rw-r----- 1 oracle dba 2147491840 Feb 4 01:23 users01.dbf
[oracle@ORACLE11 ORCL11]$ rm -rf redo01.log
[oracle@ORACLE11 ORCL11]$ rm -rf redo02.log
[oracle@ORACLE11 ORCL11]$ rm -rf redo03.log
[oracle@ORACLE11 ORCL11]$
[oracle@ORACLE11 ORCL11]$ ll
total 4577772
-rw-r----- 1 oracle dba 8077312 Feb 4 01:29 control01.ctl
-rw-r----- 1 oracle dba 8077312 Feb 4 01:29 control02.ctl
-rw-r----- 1 oracle dba 314573312 Feb 4 01:27 redo04.log
-rw-r----- 1 oracle dba 314573312 Feb 4 01:21 redo05.log
-rw-r----- 1 oracle dba 314573312 Feb 4 01:21 redo06.log
-rw-r----- 1 oracle dba 524296192 Feb 4 01:23 sysaux01.dbf
-rw-r----- 1 oracle dba 734011392 Feb 4 01:23 system01.dbf
-rw-r----- 1 oracle dba 2097160192 Feb 3 22:00 temp01.dbf
-rw-r----- 1 oracle dba 314580992 Feb 4 01:23 undotbs01.dbf
-rw-r----- 1 oracle dba 2147491840 Feb 4 01:23 users01.dbf
4 5 6 그룹의 리두로그를 이중화 합니다.
이중화 할때의 경우 기존 사이즈와 동일하게 구성되기 때문에 사이즈를 지정해주지 않습니다.
SQL> alter database add logfile member '/*****/oracle/app/oracle/oradata/ORCL11/redo04_2.LOG' to group 4;
Database altered.
SQL> alter database add logfile member '/*****/oracle/app/oracle/oradata/ORCL11/redo05_2.LOG' to group 5;
Database altered.
SQL> alter database add logfile member '/*****/oracle/app/oracle/oradata/ORCL11/redo06_2.LOG' to group 6;
Database altered.
SQL> select l.group#, member, archived, l.status, (bytes/1024/1024) MB
from v$log l, v$logfile f
where f.group# = l.group#
order by 1;
GROUP# MEMBER ARC STATUS MB
---------- ---------------------------------------------------------------------- --- ---------------- ----------
4 /*****/oracle/app/oracle/oradata/ORCL11/redo04_2.LOG NO CURRENT 300
4 /*****/oracle/app/oracle/oradata/ORCL11/redo04.log NO CURRENT 300
5 /*****/oracle/app/oracle/oradata/ORCL11/redo05.log YES INACTIVE 300
5 /*****/oracle/app/oracle/oradata/ORCL11/redo05_2.LOG YES INACTIVE 300
6 /*****/oracle/app/oracle/oradata/ORCL11/redo06.log YES INACTIVE 300
6 /*****/oracle/app/oracle/oradata/ORCL11/redo06_2.LOG YES INACTIVE 300
6 rows selected.
이와같이 오늘은 REDO LOG파일의 증설에 대해 알아보았습니다.
Oracle DBMS_데이터파일 유실상황 TEST (0) | 2021.02.24 |
---|---|
Oracle 시간별 로그스위치 횟수 조회하기 (0) | 2021.02.10 |
ORACLE SID와 SERVICE NAME 알아보자 (0) | 2021.02.06 |
오라클 에러 ORA-00904: "WM_CONCAT": invalid identifier해결하기 (0) | 2021.02.05 |
내가 만난Oracle DBMS_ORA-00600 error정리 (0) | 2021.02.03 |
댓글 영역