728x90

테이블 복구는 FLASHBACK을 사용하는 게 편리하고 간단하다. FLASHBACK을 사용하려면 undo_retension 파라미터와 undo 테이블 스페이스의 충분한 공간이 필요하다.

FLASHBACK은 데이터나 테이블이 최근에 삭제되었을 때만 유용하게 사용이 가능하다. 이런 단점을 보안하는 방법이 RMAN을 이용한 복구이다.

RMAN 테이블 단위 복구

RMAN을 이용한 복구는 오래된 데이터나 테이블을 삭제했을 때 유용하게 사용한다.

  1. Auxiliary DB(보조 DB) 생성 및 시점 복구
  2. 테이블 Datapump Export Auxiliary DB
  3. 테이블 Datapump Import STR DB

RMAN을 테이블을 복구하기 위해 Auxiliary DB를 따로 만들어야 되기 때문에 운영시스템의 CPU, 메모리, 디스크 공간을 많이 사용해서 정말 필요한 상황이 아니면 테스트 DB를 따로 만들어서 거기에 복구하고 데이터를 옮기는 게 실무에서는 더 적절하다.

RMAN 테이블 복구 제약조건

  1. SYS 계정 테이블 복구 불가
  2. SYSTEM 테이블 복구 불가
  3. SYSAUX 테이블 복구 불가
  4. 테이블 NOT NULL 제약 조건 복구 불가(REMAP)

NLS_DATE_FORMAT 변경

export NLS_DATE_FORMAT="YYYY/MM/DD(DY) HH24:MI:SS"

rman_backup.rcv 백업 파일 생성

cat << EOF > /home/oracle/script/rman_backup.rcv
run {
  allocate channel ch1 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch2 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch3 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch4 device type disk format '/RMANBKP/str_%T_full_%U';
  crosscheck archivelog all;
  delete noprompt archivelog all completed before 'trunc(sysdate) -1';
  backup as compressed backupset database tag 'DB_FULL_BACKUP' plus archivelog tag 'ARCHIVELOG';
  backup current controlfile tag 'CONTROLFILE' format '/RMANBKP/str_%T_cont_%U';
  backup spfile tag 'SPFILE' format '/RMANBKP/str_%T_para_%U';
  crosscheck backup;
  delete noprompt backup completed before 'trunc(sysdate) -1';
  release channel ch1;
  release channel ch2;
  release channel ch3;
  release channel ch4;
}

run {
begin
for i in 1..10 loop
  EXECUTE IMMEDIATE 'ALTER SYSTEM SWITCH LOGFILE';
end loop;
end;
/
}
EOF

백업 실행

rman target /

@/home/oracle/script/rman_backup.rcv

list backup summary;

DB 테이블 복구

-- DB 시간 확인(복구 시간 확인)
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS "RECO_TIME" FROM DUAL;
-- <<DB 시간 확인(복구 시간 확인)>>을 확인하고 until time 뒤에 시간을 넣어주세요.
rman target /

-- PARALLEL 4 변경
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;

-- RMAN TABLE 복구
recover table STR."TEST" until time "TO_DATE('2023/01/12 12:53:47','YYYY/MM/DD HH24:MI:SS')" auxiliary  destination  '/RMANBKP'
datapump destination '/RMANBKP' dump file 'TEST_20230112.dmp';

RMAN TABLE RENAME 복구

recover table STR."TEST" until time "TO_DATE('2023/01/12 12:53:47','YYYY/MM/DD HH24:MI:SS')" auxiliary  destination  '/RMANBKP'
remap TABLE 'STR'.'TEST':'TEST_20230112_1253'
datapump destination '/RMANBKP' dump file 'TEST_20230112.dmp';

-- PARALLEL 초기화
CONFIGURE DEVICE TYPE DISK CLEAR;

PITR 관련 로그 파일 삭제

## Linux oracle 계정 실행
find /RMANBKP \\( -name "*PITR_STR*" -o -name "STR" \\) | xargs rm -rf
find $ORACLE_BASE/admin -name "*pitr_STR" | xargs rm -rf
find $ORACLE_BASE/diag/rdbms -name "*pitr_str" | xargs rm -rf
find $ORACLE_HOME/dbs \\( -name "hc*dat" -o -name "spfile*ora" -o -name "*PITR_STR" \\) -not \\( -name "hc_STR.dat" -o -name "spfileSTR.ora" \\) | xargs rm -f

## 삭제 확인
find $ORACLE_BASE \\( -name "*pitr_str*" -o -name "*pitr_STR*" -o -name "*PITR_STR" \\)

crontab 자동 백업 삭제

crontab -r

참조

https://www.youtube.com/watch?v=5f8H6c1u3-w&t=603s 

 

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

RMAN(Recovery Manager)?

오라클에서 제공하는 백업, 복구 유틸리티이다. 예전에는 Begin End 백업을 많이 사용했지만, 요즘 회사 중요 메인 시스템의 경우 오라클을 RAC의 ASM을 많이 사용하는 추세라 RMAN을 이용한 백업은 필수가 되어가고 있다.

RMAN의 이점

  1. 성능
    1. 백업을 parallel로 병렬 처리가 가능하다.
  2. 압축
    1. 백업 압축률을 설정해 중복된 데이터가 많다면 백업 용량을 줄일 수 있다.
    2. 기본 압축 옵션은 basic이다.
  3. 증분 백업
    1. db의 데이터가 50에서 100 테라가 넘는다면 Incremental 백업을 이용해 하루에 증가되는 데이터만 백업할 수 있다.
  4. 암호화
    1. 암호화를 해서 백업이 가능하다.

백업하는 내용

  1. Data File
  2. Control File
  3. Parameter File
  4. Archived Redo log

백업 계획

  • 1주일에 한번 월요일에 Full Backup 화수목금토일 Incremental Backup을 한다.
  • 스토리지 공간이 넉넉하다면 매일 Full Backup을 하는 것을 추천한다.
  • 백업 성능을 좋게 하려면 디스크 I/O 성능이 좋은 스토리지가 필요하다.

RMAN 실습

  1. 디렉터리 생성 /ARC_STR, /RMANBKP
  2. Archive 모드 변경
  3. RMAN 백업
  4. 백업 자동화

1. 아카이브 & RMAN BACKUP 디렉터리 생성(root 계정)

## 아카이브 디렉터리 생성
mkdir /ARC_STR
chown oracle.dba /ARC_STR

## RMAN BACKUP 디렉터리 생성
mkdir -p /RMANBKP/control
chown -R oracle.dba /RMANBKP

ls -ld /RMANBKP /ARC_STR

2. 디스크 읽기 성능 테스트

fdisk -l | grep 'Disk /dev/sd'
hdparm -t /dev/sda

3. 아키이브 로그 파라미터 변경, 아카이브 로그 모드 변경

ALTER SYSTEM SET log_archive_dest='/ARC_STR' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_format='ARCH_STR_%r_%t_%s.ARC' SCOPE=SPFILE;

-- 아카이브 로그 모드 변경
shutdown immediate;
startup mount;
alter database archivelog;

archive log list;
alter database open;

4. RMAN 접속, DB 전체 정보, DB 파일 상태 점검

-- rman 접속
rman target /

-- DB 전체 정보
report schema;

-- DB 파일 상태 점검
validate database;

validate database는 데이터베이스 안에 있는 블록들에 손상된 블록이 있는지 확인하는 방법이다.

5. RMAN 백업 설정

-- 2일 전의 백업까지 
rman target /

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/RMANBKP/control/control_%F';
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/RMANBKP/control/snapcontrol_STR.f';

-- rman 설정 원복
CONFIGURE RETENTION POLICY CLEAR;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK CLEAR;
CONFIGURE SNAPSHOT CONTROLFILE NAME CLEAR;

-- rman 설정 확인
show all;

6. RMAN 백업

-- %T (YYYYMMDD) 년월일 포멧
-- %U 시스템 생성 고유 파일 이름 8자리
-- 전체 백업
backup database format '/RMANBKP/STRDB2_full_n_bkp_%T_%U';

-- 전체 백업 + 압축
backup as compressed backupset database format '/RMANBKP/STRDB2_full_c_bkp_%T_%U';

-- 백업 상태 확인
list backup;
list backup summary;

host 'ls -lh /RMANBKP';

7. ARCHIVE LOG & BACKUP 삭제(rman에서 수행)

run {
  delete noprompt archivelog all;
  delete noprompt backup;
}

8. channel 4개로 Parallel 백업(rman에서 수행)

run {
  allocate channel ch1 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch2 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch3 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch4 device type disk format '/RMANBKP/str_%T_full_%U';
  crosscheck archivelog all;
  delete noprompt archivelog all completed before 'trunc(sysdate) -1';
  backup as compressed backupset database tag 'DB_FULL_BACKUP' plus archivelog tag 'ARCHIVELOG';
  backup current controlfile tag 'CONTROLFILE' format '/RMANBKP/str_%T_cont_%U';
  backup spfile tag 'SPFILE' format '/RMANBKP/str_%T_para_%U';
  crosscheck backup;
  delete noprompt backup completed before 'trunc(sysdate) -1';
  release channel ch1;
  release channel ch2;
  release channel ch3;
  release channel ch4;
}

9. Linux Shell을 이용한 DB 전체 자동백업과 삭제 스크립트

## rman 백업 로그 디렉터리 생성
## oracle 계정
cd /home/oracle
mkdir -p /home/oracle/oraclelog

## rman 백업 스크립트 디렉터리 생성
## oracle 계정
mkdir -p /home/oracle/script

## 임시 nfsbackup 디렉터리 생성
## root 계정
mkdir /nfsbackup
chown oracle.dba /nfsbackup
ls -ld /nfsbackup

nfsbackup는 실제 운영에서는 백업 서버를 연결해서 원격 디렉터리를 만들지만 테스트할 때는 백업 서버가 없으니 있다고 가정하고 실행한다.

10. rman 백업 Shell 스크립트 생성(vi 편집기 사용 안하고 파일 만드는 법)

-- Channel을 많이 사용하면 DB 전체 SQL 성능 지연 발생할수 있으니 주의 필요!!!
cat << \\FILE > /home/oracle/script/rman_backup.sh
#!/bin/bash

################################################################################
#  RMAN FULL BACKUP SCRIPT
#    V 1.0    CPU 8Core 권장 스크립트 (Channel 4개 사용)  DBBODA
#                  Channel을 많이 사용하면 DB 전체 SQL 성능 지연 발생할수 있으니 주의 필요!!!
################################################################################
export ORACLE_HOME=/oracle/app/oracle/product/19.0.0.0/db_1
export ORACLE_SID=STR
export PATH=$ORACLE_HOME/bin:$PATH
export DATE=`date +%Y%m%d`
export YDATE=`date -d '1 day ago' '+%Y%m%d'`
export HOSTNAME=`hostname`
export NLS_DATE_FORMAT="YYYY/MM/DD(DY) HH24:MI:SS"

rman log=/home/oracle/oraclelog/${HOSTNAME}_rman_backup_${DATE}.log << EOF
connect target /
run {
  allocate channel ch1 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch2 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch3 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch4 device type disk format '/RMANBKP/str_%T_full_%U';
  crosscheck archivelog all;
  delete noprompt archivelog all completed before 'trunc(sysdate) -1';
  backup as compressed backupset database tag 'DB_FULL_BACKUP' plus archivelog tag 'ARCHIVELOG';
  backup current controlfile tag 'CONTROLFILE' format '/RMANBKP/str_%T_cont_%U';
  backup spfile tag 'SPFILE' format '/RMANBKP/str_%T_para_%U';
  crosscheck backup;
  delete noprompt backup completed before 'trunc(sysdate) -1';
  release channel ch1;
  release channel ch2;
  release channel ch3;
  release channel ch4;
}
exit
EOF

## RMAN Backup zip
cd /RMANBKP
zip -r str_full_backup_${YDATE}.zip str_${YDATE}* control/

## Archive zip
cd /ARC_STR
export ARCHFILE=`ls -l --time-style="+%Y%m%d" | grep ${YDATE} | awk '{print $7}'`
zip ${HOSTNAME}_arc_backup_${YDATE}.zip ${ARCHFILE}

## NFS Backup
cp /RMANBKP/str_full_backup_${YDATE}.zip /nfsbackup/str_full_backup_${YDATE}.zip
cp /ARC_STR/${HOSTNAME}_arc_backup_${YDATE}.zip /nfsbackup/${HOSTNAME}_arc_backup_${YDATE}.zip

## Remove zip 
rm -f /RMANBKP/str_full_backup_${YDATE}.zip
rm -f /ARC_STR/${HOSTNAME}_arc_backup_${YDATE}.zip

## Remove nfs Backup file
export WDATE=`date -d '8 day ago' '+%Y%m%d'`
find /nfsbackup/ -name "*${WDATE}.zip" -exec rm -f {} \\;

FILE

RMAN Backup zip은 변수 값으로 압축하고 Archive zip도 동일하게 압축한다. NFS 디렉터리에서 전체 백업한 압축 파일, 아카이브 로그 압축 파일을 cp로 복사하고 rm 명령으로 RMAN 백업 디렉터리와 아카이브 디렉터리 zip 압축 파일을 삭제한다. 추가로 nfs 백업 디렉터리의 8일 전 파일을 자동으로 삭제하게 만들었다.

11. shell 스크립트 권한 변경, crontab 추가

## shell 스크립트 권한 변경
## oracle 계정
cd /home/oracle/script
chmod 755 rman_backup.sh

--crontab 추가
crontab -e
## RMAN FULL BACKUP
00 02 * * * /home/oracle/script/rman_backup.sh

참고

https://www.youtube.com/watch?v=PA9VIjbYd4w&t=901s 

 

728x90

+ Recent posts