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
'Oracle > Oracle DataBase 관리' 카테고리의 다른 글
Oracle RMAN 복구는 예술이다. 2부 (0) | 2023.01.19 |
---|---|
Oracle RMAN 백업은 기술이다. 1부 (1) | 2023.01.11 |
Oracle AWR 분석 보고서 환경 설정 (0) | 2022.12.17 |
Oracle(보안) DB IP 접근 제한 환경설정 (0) | 2022.12.16 |
Oracle(보안) TDE 암호화 설정 (0) | 2022.12.15 |