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가지가 있다.
- 3초에 한번
- 리두 로그 버퍼의 3분의 1이 되었거나 1MB가 넘었을 때
- 사용자에 의한 커밋 또는 롤백을 수행했을 때
- 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
'Oracle > Oracle DataBase 관리' 카테고리의 다른 글
오라클 Alert Log 분석 (0) | 2022.11.23 |
---|---|
오라클 삭제된 데이터 간단하게 복구하기(UNDO) (0) | 2022.11.22 |
오라클 리스너 Listener 시작과 종료 (0) | 2022.11.19 |
오라클 시작과 종료 (0) | 2022.11.19 |
오라클 ARCHIVE(아카이브) 관리 (0) | 2022.11.18 |