728x90

FlashBack

오라클 DB 데이터를 매우 빠른 속도로 복구하는 기술이다. 사용자 실수로 인한 데이터 오류, 테이블 삭제, 또는 데이터베이스 전체에 대해 문제가 발생했을 때 매우 빠른 속도로 복구할 수 있다.

FlashBack이 필요한 이유

예를 들어 쇼핑몰을 운영하는 회사에서 인플레이션으로 인해 사장님이 전체 상품에 대해 5% 인상을 이대리에게 요청한다. 이대리는 상품 테이블을 update 명령어로 5% 인상해야 하는데 실수로 50% 인상을 해버렸다.

FlashBack을 사용안하던 과거에는 실수로 상품 table을 삭제했을 때는 EXP/IMP, DATAPUMP, RMAN이 있는데 EXP/IMP, DATAPUMP는 원하는 시점으로 복구하기가 어렵고 RMAN은 가능하지만 데이터 크기가 크면 복구하는데 오래 걸릴 수 있다. 이럴 때 FlashBack table 기능을 이용하면 간단하게 복구할 수 있다.

FRA(Fast Recovery Area)

빠르게 복구할 수 있는 공간을 의미하고 백업 데이터 파일들을 통합 관리하는 기능을 제공한다.

테이블, 데이터 삭제 복구

1. find 명령어로 spfile위치를 확인한다.

find $ORACLE_HOME -name spfile*

2. spfile 백업

cp spfileSTR.ora spfileSTR.ora_20221231

3. UNDO RETENTION 파라미터 변경

-- 1Day = 86400sec
show parameter undo_retention
alter system set undo_retention=86400 scope=spfile;

4. DB 종료, 재시작

-- DB 종료
SHUTDOWN IMMEDIATE
-- DB 시작
STARTUP

5. Test 테이블, 데이터 생성 후 삭제

-- 테이블 생성
CREATE TABLE STR.FRA_TEST
(
  FRA_NO  VARCHAR2(20)
);
-- 데이터 1건 입력
INSERT INTO STR.FRA_TEST VALUES(TO_CHAR(SYSDATE,'YYYYMMDD HH24MISS'));
COMMIT;
-- 데이터 확인
SELECT * FROM STR.FRA_TEST;
-- 테이블 삭제
DROP TABLE STR.FRA_TEST;

6. FLASHBACK을 이용한 테이블 복구

FLASHBACK TABLE username.table_name TO BEFORE DROP;

테이블은 남아있고 데이터만 삭제 복구

1. Test 테이블, 데이터 생성 후 삭제

-- 테이블 생성
CREATE TABLE STR.FRA_TEST
(
  FRA_NO  VARCHAR2(20)
);
-- 데이터 5건 입력
INSERT INTO STR.FRA_TEST VALUES('1');
INSERT INTO STR.FRA_TEST VALUES('2');
INSERT INTO STR.FRA_TEST VALUES('3');
INSERT INTO STR.FRA_TEST VALUES('4');
INSERT INTO STR.FRA_TEST VALUES('5');
COMMIT;
-- INSERT 완료 시간 확인
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. 
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS "COMMIT_TIME" FROM DUAL;
-- 데이터 전체 삭제
DELETE FROM STR.FRA_TEST;
COMMIT;

2. 데이터 복구

-- 데이터 전체 복구
-- (INSERT 완료 시간 확인) 쿼리에 COMMIT_TIME을 확인한다. 
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. (2022/12/19 10:00:00)
INSERT INTO STR.FRA_TEST
SELECT * FROM STR.FRA_TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');
COMMIT;

부분 데이터 삭제 복구

1. Test 데이터 삭제

-- 부분 데이터 삭제
-- FRA_NO   3   데이터 삭제
DELETE FROM STR.FRA_TEST
WHERE FRA_NO = '3';
COMMIT;

2. 부분 데이터 복구(원본 테이블은 두고 복제 테이블을 만든다.)

-- CTAS를 이용한 FRA_TEST_20221219_1000 테이블 생성 및 데이터 복구
-- (INSERT 완료 시간 확인) 쿼리에 COMMIT_TIME을 확인한다. 
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. (2022/12/19 10:00:00)
CREATE TABLE STR.FRA_TEST_20221219_1000
AS
SELECT * FROM STR.FRA_TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');

-- 데이터 1건 복구 확인
SELECT * FROM * STR.FRA_TEST;

-- 테이블 삭제
DROP TABLE STR.FRA_TEST_20221219_1000 PURGE;
DROP TABLE STR.FRA_TEST PURGE;

3. 복제 테이블에서 원본 테이블과 빠진 데이터를 확인해서 Insert

-- 데이터 1건 복구 SQL
INSERT INTO STR.FRA_TEST
SELECT FRA_NO
FROM STR.FRA_TEST_20221219_1000
WHERE FRA_NO NOT IN (
	SELECT FRA_NO FROM STR.FRA_TEST);
COMMIT;     

데이터베이스 전체 복구

1. 아카이브 & FRA 디렉터리 생성, root 실행

mkdir /FRA
chown oracle.dba /FRA

ls -ld /FRA

2. FRA 파라미터 변경

-- 1Day = 1440min defualt
show parameter DB_FLASHBACK_RETENTION_TARGET

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G scope=spfile; -- 용량 설정
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/FRA' scope=spfile; -- 디렉터리 설정

3. DB 종료 후 Mount 상태로 올려야한다.

SHUTDOWN IMMEDIATE
STARTUP MOUNT

4. 아카이브 로그 모드, Flashback 모드로 변경 후 DB Open

ALTER DATABASE ARCHIVELOG;
-- 아카이브 로그 확인
ARCHIVE LOG LIST; 
-- Flashback 모드 변경
ALTER DATABASE FLASHBACK ON;
-- Flashback 모드 확인
SELECT FLASHBACK_ON FROM V$DATABASE;
-- DB OPEN
ALTER DATABASE OPEN;

FRA를 사용하려면 아카이브 로그모드와 FlashBack on이 되어있어야 한다.

5. 아카이브 & Flashback 상태 확인

SELECT NAME, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;

FlashBack이 실행되어 있으면 리눅스에서 RVWR 프로세스가 실행 중이다.

-- Linux 실행 RVWR(Recovery Writer) 프로세스 확인
ps -efl | grep [r]vwr

6. 시작 시간 확인

SELECT
TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS "START_TIME" ,
TIMESTAMP_TO_SCN(SYSDATE) AS "SCN"
FROM DUAL;

7. DB mount 상태로 이동 mount 상태에서 복구해야 한다.

STARTUP MOUNT

8. DB 전체 Flashback으로 원하는 시간으로 복구 후 DB를 RESETLOGS로 Open 한다.

-- (시작 시간 확인) 쿼리에 START_TIME을 확인한다. (2022/12/19 10:00:00)
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');
-- DB OPEN
ALTER DATABASE OPEN RESETLOGS;

FRA 관리 방법

1. FRA 디렉터리에 어떤 파일들이 있는지 확인, FRA 디렉터리 사용량 확인할 수 있다.

--  sqlplus / as sysdba 접속
sqlplus / as sysdba
SET LINES 180
COL NAME FOR A20
-- FRA 디렉터리에 어떤 파일들이 있는지 확인, FRA 디렉터리 사용량 확인할 수 있다.
SELECT 
    FILE_TYPE, 
    PERCENT_SPACE_USED, 
    PERCENT_SPACE_RECLAIMABLE, NUMBER_OF_FILES 
FROM V$FLASH_RECOVERY_AREA_USAGE;

SELECT 
    NAME, 
    ROUND(SPACE_LIMIT/1024/1024/1024)   AS "SPACE(GB)",
    ROUND(SPACE_USED/1024/1024/1024,2)  AS "USED(GB)"
FROM V$RECOVERY_FILE_DEST;

백업 파일 삭제

1. Recovery Manager에 접속 후 백업 파일 삭제

-- rman에서 로그 확인 및 백업 파일 삭제
rman target /

REPORT OBSOLETE;
LIST ARCHIVELOG ALL;

CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;

DELETE EXPIRED BACKUP;
DELETE EXPIRED ARCHIVELOG ALL;
DELETE FORCE OBSOLETE;

FRA 원상 복구

1. 파라미터 원복

ALTER SYSTEM RESET UNDO_RETENTION;
ALTER SYSTEM RESET DB_RECOVERY_FILE_DEST_SIZE;
ALTER SYSTEM RESET DB_RECOVERY_FILE_DEST;

2. DB 종료 후 Mount 상태로 Open

-- DB 종료
SHUTDOWN IMMEDIATE
-- DB 시작(Mount 상태)
STARTUP MOUNT

3. Flashback, 아카이브 로그 OFF 후 DB Open

-- Flashback 기능 OFF
ALTER DATABASE FLASHBACK OFF;
-- 아카이브 로그 OFF
ALTER DATABASE NOARCHIVELOG;
-- DB OPEN
ALTER DATABASE OPEN;

4. DB 상태 확인

-- DB 상태 확인
SELECT NAME, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;

5. FRA 디렉터리 삭제

-- root 접속
cd /
rm -rf /FRA

참고

https://www.youtube.com/watch?v=CqqNRKaVwqg 

 

728x90

+ Recent posts