728x90

RMAN 데이터 파일 복구 명령어 순서

  1. DB SHUTDOWN
  2. STARTUP MOUNT
  3. RESTORE DATAFILE
  4. RECOVER DATAFILE
  5. DB OPEN

RMAN 전체 복구 명령어 순서

  1. DB SHUTDOWN
  2. STARTUP NOMOUNT
  3. RESTORE CONTROLFILE
  4. STARTUP MOUNT
  5. RESTORE DATABASE
  6. RECOVER DATABASE
  7. DB OPEN RESETLOGS

전체 백업

-- 전체 백업 파일
rman target /

list backup summary;

## 아카이브 로그 파일 확인
ls -l /ARC_STR

## 아카이브 로그 파일 생성
## ALTER SYSTEM SWITCH LOGFILE 10회 수행
sqlplus / as sysdba <<EOF
begin
for i in 1..10 loop
  EXECUTE IMMEDIATE 'ALTER SYSTEM SWITCH LOGFILE';
end loop;
end;
/
exit
EOF

데이터 파일 복구

## 리스너 종료
lsnrctl stop 

-- DB 접속
sqlplus / as sysdba

-- DB 종료
shutdown abort

startup mount

-- rman 접속
rman target /

REPORT SCHEMA;

RESTORE DATAFILE 3,5;
RECOVER DATAFILE 3,5;

ALTER DATABASE OPEN

REPORT SCHEMA;

## sysaux 데이터 파일 확인
## linux 수행
ls -lh /oracle/app/oracle/oradata/STR

DB 전체 복구

sqlplus / as sysdba

shutdown abort
startup nomount

-- rman 접속
-- /RMANBKP/str_20230108_cont_541hdsi2_1_1 --> 최근 백업한 컨트롤 파일로 변경해주세요.

rman target /

host 'ls -l /RMANBKP/str*cont*';

RESTORE CONTROLFILE FROM '/RMANBKP/str_20230108_cont_541hdsi2_1_1';

host 'ls -l /oracle/app/oracle/oradata/STR';

ALTER DATABASE MOUNT;

CONFIGURE DEVICE TYPE DISK PARALLELISM 4;

RESTORE DATABASE;
RECOVER DATABASE;
host 'ls -l /ARC_STR';

ALTER DATABASE OPEN RESETLOGS;

-- 정상적으로 백업 되었는지 확인
REPORT SCHEMA;

CONFIGURE DEVICE TYPE DISK CLEAR;

## 리스너 시작
lsnrctl start

리스너 빠르게 등록하는 팁

lsnrctl start 명령어 후 SQLPlus에 접속하여 alter system register

참고

https://www.youtube.com/watch?v=BTd-wVIjZI8&t=627s 

 

728x90
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
728x90

오라클 서버에서 .sql 파일 실행법

@파일이름.sql

전체 복구(기본)

ls -lh EXPDP_STR_FULL_20221207*

impdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
DUMPFILE=EXPDP_STR_FULL_20221207.DMP \
LOGFILE=IMPDP_STR_FULL_20221207.log

전체 복구(기본+TDE)

ls -lh EXPDP_STR_FULL_TDE_20221207*

impdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_TDE_20221207.DMP \
LOGFILE=IMPDP_STR_FULL_TDE_20221207.log

전체 복구(압축+TDE)

ls -lh EXPDP_STR_FULL_COMP_20221207*

impdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_COMP_20221207.DMP \
LOGFILE=IMPDP_STR_FULL_COMP_20221207.log

전체 복구(백업 파일 100M 분할)

ls -lh EXPDP_STR_FULL_DIV_20221207

impdp system/oracle DIRECTORY=STR_DUMP FULL=YES \
ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_DIV_20221207_%U.DMP \
LOGFILE=IMPDP_STR_FULL_DIV_20221207.log

전체 복구(Parallel+압축+TDE)

ls -lh EXPDP_STR_FULL_PCOMP_20221207*

impdp system/oracle DIRECTORY=STR_DUMP \
PARALLEL=4 FULL=YES ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_FULL_PCOMP_20221207_%U.DMP \
LOGFILE=IMPDP_STR_STR_FULL_PCOMP_20221207.log

Datapump 스키마(유저) 복구 STR계정 복구(Parallel+압축)

ls -lh EXPDP_STR_STR_P_20221207*

impdp system/oracle DIRECTORY=STR_DUMP SCHEMAS=STR \
PARALLEL=4 \
ENCRYPTION_PASSWORD=oracle123 \
DUMPFILE=EXPDP_STR_STR_P_20221207_%U.dmp \
LOGFILE=IMPDP_STR_STR_P_20221207.log

Datapump 테이블 복구(계정명: STR 테이블명: CUST)

ls -lh EXPDP_STR_CUST_20221207*

impdp system/oracle DIRECTORY=STR_DUMP \
DUMPFILE= EXPDP_STR_CUST_20221207.DMP  \
LOGFILE=IMPDP_STR_CUST_20221207.log \
TABLES=STR.CUST

Datapump 테이블 복구

-- 테이블스페이스 위치 변경: TS_STR_D, TS_STR_I  -->  SYSTEM

ls -lh EXPDP_STR_CUST_20221207*

impdp system/oracle DIRECTORY=STR_DUMP \
DUMPFILE= EXPDP_STR_CUST_20221207.DMP  \
LOGFILE=IMPDP_STR_CUST_20221207.log \
TABLES=STR.CUST \
REMAP_TABLESPACE=TS_STR_D:SYSTEM \
REMAP_TABLESPACE=TS_STR_I:SYSTEM

복구 진행 중에 계속 멈춰 있다면 테이블 스페이스 공간을 확인하자

SELECT 
    OWNER, 
    SEGMENT_TYPE, 
    SEGMENT_NAME,
    TABLESPACE_NAME
FROM DBA_SEGMENTS
WHERE  SEGMENT_NAME IN ('CUST','CUST_IDX1');

ALTER DATABASE DATAFILE '/oracle/app/oracle/oradata/STR/system01.dbf' RESIZE 2048M;

Datapump 테이블 복구(테이블명 변경: CUST --> CUST_BACKUP_20221003)

ls -lh EXPDP_STR_CUST_20221207*

impdp system/oracle DIRECTORY=STR_DUMP \
DUMPFILE= EXPDP_STR_CUST_20221207.DMP  \
LOGFILE=IMPDP_STR_CUST_20221207.log \
TABLES=STR.CUST \
REMAP_TABLE=CUST:CUST_BACKUP_20221207

참고

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

 

728x90

+ Recent posts