728x90

REDO란?

리두는 DB에 변경되는 모든 이력을 저장, 서버가 다운되었을 때 복구할 수 있는 파일, DB 복구, 인스턴스 복구, Fast Commit(데이터 블록을 기록하는 방식이 랜덤이 아니라 어펜드 방식을 사용하기 때문에 빠르게 커밋한다.)

REDO 파일 위치

/oracle/app/oracle/oradata/DB이름

내 로컬 경로

/opt/oracle/oradata/XE

REDO 관리

리두 로그 파일은 최소 두개가 필요하고 오라클 기본 설치하면 3개의 리두 로그 파일이 생성된다. 리두 로그 파일은 redo01.log, redo02.log, redo03.log 스위치 하면서 재사용한다. 이걸 Round-Robin 방식이라고 한다. 디비 백그라운드 프로세스인 LGWR가 리두에 저장되는 시점은 대표적으로 4가지가 있다.

  1. 3초에 한번
  2. 리두 로그 버퍼의 3분의 1이 되었거나 1MB가 넘었을 때
  3. 사용자에 의한 커밋 또는 롤백을 수행했을 때
  4. DBWR, LGWR에게 쓰기를 요청했을 때

디비의 트렌젝션이 많고 데이터 변경량도 많을 때 리두 로그 사이즈가 너무 작으면 CPU 사용량이 증가하고 DBWR, ARCn의 사용량이 증가한다. 리두 로그 사이즈를 적절하게 적용하면 CPU 사용량이 감소하고 디스크 I/O 향상된다. 오라클이 권고하는 리두 로그의 스위치는 20분에 한번 정도 발생하는 것이고 업계에서는 보통 10분에서 20분 사이에 한번 발생하는 것으로 추천한다.

REDO 추가

ALTER DATABASE ADD LOGFILE GROUP 4
(
'/파일위치/REDO4_1.LOG',
'/파일위치/REDO4_1.LOG'
) SIZE XXMB;

같은 그룹의 여러개의 리두 로그를 만든다면 물리적으로 서로 다른 디스크에 저장하는 것을 권고한다. 그래야 한쪽 디스크에 문제가 생겨도 안전하게 복원할 수 있다. 사이즈는 디비를 분석해서 규모가 있다면 1GB나 그 이상 10분에서 20분 사이에 발생하는지를 판단해서 사이즈 조정을 계속한다.

REDO 삭제

ALTER DATABASE DROP LOGFILE GROUP 1;

REDO 상태 확인

SELECT      
      A.GROUP#
    , A.STATUS
    , B.MEMBER
    , A.BYTES/1024/1024 AS "SIZE(MB)"
FROM 
      V$LOG A
    , V$LOGFILE B
WHERE A.GROUP# = B.GROUP#
ORDER BY 1;

리두 로그 그룹 삭제할 때 제일 중요한건 리두 로그 상태가 INACTIVE 상태 이어야 한다. 그냥 삭제하면 큰일 난다.

REDO LOG 변경 정보 전체 조회

SELECT
    TO_CHAR(FIRST_TIME,'YYYY/MM/DD HH24'), 
    COUNT(*)
FROM V$LOG_HISTORY
GROUP BY TO_CHAR(FIRST_TIME,'YYYY/MM/DD HH24')
ORDER BY 1;

REDO LOG 변경 정보 시간, 분 단위로 분석

-- 2022/11/13 ~ 2022/11/18 기간 조회
-- 추가로 일자를 변경하려면 TO_DATE(년월일)을 바꿔주세요.
-- 예) 2022년 7월 20일 부터 2022년 7월 21일 조회
--       WHERE FIRST_TIME >= TO_DATE('20221113') 
--       AND   FIRST_TIME  <   TO_DATE('20221118') 
SELECT
    TO_CHAR(FIRST_TIME,'HH24:MI'), 
    COUNT(*)
FROM V$LOG_HISTORY
WHERE FIRST_TIME >= TO_DATE('20221113')
AND   FIRST_TIME <  TO_DATE('20221118')
GROUP BY TO_CHAR(FIRST_TIME,'HH24:MI')
ORDER BY 1;

최근 10일 동안 REDO LOG 변경 정보 조회

SELECT
    DECODE(TO_CHAR(FIRST_TIME,'HH24'),NULL,'TOTAL',TO_CHAR(FIRST_TIME,'HH24')) AS "REDO_TIME",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE)-10 AND FIRST_TIME < TRUNC(SYSDATE) -9 THEN 1 ELSE 0 END) AS "TODAY-10",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -9 AND FIRST_TIME < TRUNC(SYSDATE) -8 THEN 1 ELSE 0 END) AS "TODAY-9",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -8 AND FIRST_TIME < TRUNC(SYSDATE) -7 THEN 1 ELSE 0 END) AS "TODAY-8",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -7 AND FIRST_TIME < TRUNC(SYSDATE) -6 THEN 1 ELSE 0 END) AS "TODAY-7",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -6 AND FIRST_TIME < TRUNC(SYSDATE) -5 THEN 1 ELSE 0 END) AS "TODAY-6",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -5 AND FIRST_TIME < TRUNC(SYSDATE) -4 THEN 1 ELSE 0 END) AS "TODAY-5",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -4 AND FIRST_TIME < TRUNC(SYSDATE) -3 THEN 1 ELSE 0 END) AS "TODAY-4",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -3 AND FIRST_TIME < TRUNC(SYSDATE) -2 THEN 1 ELSE 0 END) AS "TODAY-3",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -2 AND FIRST_TIME < TRUNC(SYSDATE) -1 THEN 1 ELSE 0 END) AS "TODAY-2",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE) -1 AND FIRST_TIME < TRUNC(SYSDATE) -0 THEN 1 ELSE 0 END) AS "TODAY-1",
    SUM(CASE WHEN FIRST_TIME >= TRUNC(SYSDATE)    AND FIRST_TIME < TRUNC(SYSDATE) +1 THEN 1 ELSE 0 END) AS "TODAY",
    SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),NULL,0,1)) AS "SUM"
FROM V$LOG_HISTORY
WHERE FIRST_TIME >= TRUNC(SYSDATE) - 10
GROUP BY ROLLUP(TO_CHAR(FIRST_TIME,'HH24'))
ORDER BY 1;

디스크 사용량을 보는 명령어

df -h

REDO 그룹 4 추가

ALTER DATABASE 
ADD LOGFILE GROUP 4 
(
 '/opt/oracle/oradata/XE/REDO4_1.LOG',
 '/opt/oracle/oradata/XE/REDO4_2.LOG'
) SIZE 500M;

리두 로그를 만들 때 소문자가 아닌 대문자로 만드는 이유는 SqlPlus에서 drop으로 삭제해도 실제 파일은 남아있기 때문에 소문자 대문자를 구분해서 혹시 모를 사고를 방지하기 위해서이다.

초기 설정된 REDO 로그 삭제

-- (REDO 로그 스위치하면서 INACTIVE 상태에서 DROP 명령어 실행)
alter system switch logfile

ALTER DATABASE DROP LOGFILE GROUP 1;
ALTER DATABASE DROP LOGFILE GROUP 2;
ALTER DATABASE DROP LOGFILE GROUP 3;

REDO 로그 파일 삭제

/***************************************************************************
  REDO 로그 파일 삭제
   초기 설정된 REDO 로그 그룹 1,2,3 삭제
   리눅스에서 작업한다. (oracle 계정 확인)
***************************************************************************/

cd /opt/oracle/oradata/DB이름
cd $ORACLE_BASE/oradata/DB이름

rm /opt/oracle/oradata/XE/redo01.log
rm /opt/oracle/oradata/XE/redo02.log
rm /opt/oracle/oradata/XE/redo03.log

참고

https://www.youtube.com/watch?v=LmeAv9B_y5I&list=PLKaW9UT2TL3Lpqrh_lJ8PHyHpR7NgdrPP&index=5 

 

728x90

+ Recent posts