Oracle Database Linux 계열 백업 쉘스크립트 & 크론탭

2021. 7. 6. 13:36DB

728x90
반응형

Oracle Database 백업 방법

저는 물리/논리 백업을 수행하는 Shell Script를 각각 만든 후에

crontab에 등록해서 자동으로 매일 돌아가게끔 구성을 해놓습니다.

 

우선 .bash_profile 내용을 먼저 소개하고

이어서 script, crontab 등록 방법을 설명드릴게요.

 

궁금하신 사항이 있으시면 댓글 남겨주세요.

 

 

$ cat ~/.bash_profile

 

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi

# User specific environment and startup programs

umask 022

 

export ORACLE_HOSTNAME=triana

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/19.0.0.1

export ORACLE_SID=triana

export ORACLE_UNQNAME=triana

export ORACLE_SERVICE=triana

export ORACLE_TERM=xterm

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

export DISPLAY=X.X.X.X:0   # 오라클 설치용으로 사용한 Display  환경변수. #

export PATH=$PATH:$HOME/.local/bin:$HOME/bin:$ORACLE_HOME/bin

 

stty erase ^H

 

export ADUMP=$ORACLE_BASE/admin/triana/adump

export BDUMP=/u01/app/oracle/diag/rdbms/triana/triana/trace

 

PS1=oracle@`hostname`:'${PWD}> '

 

alias oh='cd $ORACLE_HOME'

alias alert='vi $BDUMP/alert_triana.log'

alias alertf='tail -30f $BDUMP/alert_triana.log'

alias bdump='cd $BDUMP'

alias oralog='cd $ORACLE_HOME/oramon/src/event'

alias log='cd $ORACLE_HOME/oramon/log'

alias sd='sqlplus / as sysdba'

alias cl='clear'

alias oradata='cd /u01/app/oracle/oradata/triana'

alias ds='$ORACLE_HOME/oramon/src/event/lth/d.sh'

alias rpt='cd $ORACLE_HOME/oramon/src/event/lth'

export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949

그 다음은 Shell Script 내용과 Crontab 내용 입니다.

1-1. 물리백업 : RMAN 전체 백업 쉘스크립트(전체백업/주간)

$ cat /data/rman_bck/rman_bck.sh

#!/bin/ksh

. ~/.bash_profile

export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'

LOG=/data/rman_bck/log/rman_`/bin/date +'%Y%m%d'`.log

BCK_PATH=/data/rman_bck/bckdata

#######################################

## delete archive log file

#######################################

/usr/bin/find /archive/ -name "*.arc" -mtime +20 -exec /bin/rm {} \;      # 21일 후 아카이브 로그 삭제 #

#######################################

## delete & move backup piece #기본적으로 이 스크립트는 매주 일요일마다 돌아가게 설정됨. #

#######################################

date >> $BCK_PATH/rman_bck.log    # 백업 시작 전 지난주 백업 파일을 old 경로로 이동 #

/bin/rm -v /data/rman_bck_old/*.rman >> $BCK_PATH/rman_bck.log   # 백업 시작 전 2주 전 백업 삭제 #

/bin/mv -v $BCK_PATH/*.rman /data/rman_bck_old >> $BCK_PATH/rman_bck.log

echo "====================================" >> $BCK_PATH/rman_bck.log

#######################################

## crosscheck, delete expired backup # 물리 파일을 먼저 지우고 Control 파일에 기록된 메타데이터도 #

####################################### # 삭제하기 위해서 crosscheck 수행 #

rman target / nocatalog << EOF >> $LOG 2>&1

 

run {

allocate channel c1 type disk;

crosscheck backup; # 물리 전체 백업 파일이 없는 논리 기록 식별 #

crosscheck archivelog all COMPLETED before 'sysdate-1/24'; # 아카이브 파일이 없는 논리 기록 식별 #

delete noprompt expired backup; # 식별된 expired backupset 기록 삭제 #

delete noprompt expired archivelog all; # 식별된 expired archivelog 기록 삭제 #

delete noprompt archivelog until time 'sysdate-22'; # 22일 이상 지난 아카이브 로그 삭제 #

backup format '$BCK_PATH/dbf_%U_%T.rman'(database); # 데이터베이스 전체 백업(backupset) 수행 #

sql 'alter system archive log current'; # 백업 수행 후 백업 진행 간 쌓인 redo log 아카이브화 #

release channel c1;

}

exit

EOF

#######################################

## start rman archive log backup

#######################################

rman target / nocatalog << EOF2 >> $LOG 2>&1

run {

allocate channel c1 type disk;

sql 'alter system archive log current';

backup # 25시간 전부터 백업이 수행될 때까지의 모든 아카이브로그 백업 #

 (archivelog

  from time 'sysdate-(1+1/24)'  until time 'sysdate - 3/1440'

  format '$BCK_PATH/arc_%U_%T.rman'

 );

release channel c1;

}

 

EOF2

# RMAN 전체 백업 스크립트 내용 끝 #

1-2 물리백업 : RMAN 전체 백업 크론탭 설정

$ crontab -l

##############################

### RMAN Backup            ###

##############################

10 20  *  *  0  /data/rman_bck/rman_bck.sh > /dev/null 2>&1

# 아래부터는 일일백업(아카이브 로그백업) 내용 #

1-3 물리백업 : RMAN 아카이브 로그 백업 쉘스크립트(아카이브/일일)

$ cat /data/rman_bck/archive_bck.sh

#!/bin/ksh

. ~/.bash_profile

export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'

LOG=/data/rman_bck/log/rman_`/bin/date +'%Y%m%d'`.log

BCK_PATH=/data/rman_bck/bckdata

#######################################

## delete archive log file  # 8일 이상 지난 아카이브 로그 파일 삭제 #

#######################################

/usr/bin/find /archive/ -name "*.arc" -mtime +7 -exec /bin/rm {} \;

#######################################

## crosscheck, delete expired backup   # 실제 파일 존재 여부와 Control 파일 내 논리기록 비교 #

#######################################

rman target / nocatalog << EOF >> $LOG 2>&1

run {

allocate channel c1 type disk;

crosscheck backup;

crosscheck archivelog all COMPLETED before 'sysdate-1/24';

delete noprompt expired backup;

delete noprompt expired archivelog all;

delete noprompt archivelog until time 'sysdate-22';

sql 'alter system archive log current';

release channel c1;

}

exit

EOF

#######################################

## start rman backup   # 26시간 전부터 현재까지의 아카이브 로그 백업 #

#######################################

rman target / nocatalog << EOF2 >> $LOG 2>&1

run {

allocate channel c1 type disk;

sql 'alter system archive log current';

backup

 (archivelog

  from time 'sysdate-(1+2/24)'  until time 'sysdate - 3/1440'

  format '$BCK_PATH/arc_%U_%T.rman'

 );

release channel c1;

}

exit

EOF2

# RMAN 아카이브 로그 백업 스크립트 내용 끝 #

1-4. 물리백업 : RMAN 아카이브 백업 크론탭 설정

$ crontab -l

##############################

### RMAN Backup            ###

##############################

10 20  *  *  1,2,3,4,5,6  /data/rman_bck/archive_bck.sh > /dev/null 2>&1

# 물리백업 RMAN 아카이브 백업 크론탭 내용 끝 #

2-1. 물리백업 : 수동백업을 이용한 백업 스크립트

#!/bin/bash

_BCK_DIR=/oracle/app/oracle/product/11.2.0/dbhome_1/oralog/bck

_LOGFILE=$_BCK_DIR/backup_`date +%y%m%d`.log

. ~/.bash_profile

rm $_BCK_DIR/*.tmp

rm $_BCK_DIR/*.sql

rm $_BCK_DIR/*.lst

echo Hot Backup start : `date` > $_LOGFILE

$ORACLE_HOME/bin/sqlplus "/as sysdba" <> $_LOGFILE

set echo off

prompt #######################

prompt ## BEGIN/END Scripts ##

prompt #######################

set lines 132 pages 1000 trims on heading off feedback off time on

select 'alter tablespace ' || tablespace_name || ' begin backup;'

from dba_tablespaces where contents!='TEMPORARY';

spo $_BCK_DIR/bbackup.tmp

/

spo off

select 'alter tablespace ' || tablespace_name || ' end backup;'

from dba_tablespaces where contents!='TEMPORARY';

spo $_BCK_DIR/ebackup.tmp

/

spo off

prompt ###################

prompt ## DATAFILE LIST ##

prompt ###################

 

col file_name for a50

col dest for a50

col jjj for a100

 

select

file_name || ' ' || '/home/orabackup/datafile/'||substr(file_name, instr(file_name, '/',-1)+1, length(file_name)) jjj

from dba_data_files

order by 1;

spo $_BCK_DIR/file.tmp

/

spo off

exit

EOF0

cat $_BCK_DIR/bbackup.tmp | grep alter | grep -v SQL > $_BCK_DIR/bbackup.sql

##echo exit >> $_BCK_DIR/bbackup.sql

cat $_BCK_DIR/ebackup.tmp | grep alter | grep -v SQL > $_BCK_DIR/ebackup.sql

##echo exit >> $_BCK_DIR/ebackup.sql

sed -e '1,2d' -e '$d' $_BCK_DIR/file.tmp > $_BCK_DIR/file.lst

tail -v $_BCK_DIR/*up.sql >> $_LOGFILE

$ORACLE_HOME/bin/sqlplus "/as sysdba" <> $_LOGFILE

prompt ##################

prompt ## BEGIN backup ##

prompt ##################

alter system switch logfile;

@$_BCK_DIR/bbackup.sql

exit

EOF1

awk '{print $2}' $_BCK_DIR/file.lst | while read DEL_LIST

do

ftp -n <open X.X.X.X  # 원격지 백업 파일 저장용 서버에 접속하여 지난 주 백업을 삭제 #

user [username] *********

passive

del $DEL_LIST

bye

EOF2

done

echo ###################### >> $_LOGFILE

echo ## UPLOAD DATAFILES ## >> $_LOGFILE

echo ###################### >> $_LOGFILE

echo `date` >> $_LOGFILE

 

cat $_BCK_DIR/file.lst | while read FILE_LIST

do

ftp -n <open X.X.X.X  # 원격지 백업 파일 저장용 서버를 열어 이번주 백업 파일 전송 #

user [username] *********

passive

ha

bi

prompt

put $FILE_LIST

bye

EOF3

done

$ORACLE_HOME/bin/sqlplus "/as sysdba" <> $_LOGFILE

prompt ################

prompt ## END backup ##

prompt ################

@$_BCK_DIR/ebackup.sql

alter system switch logfile;

alter database backup controlfile to trace  as '$_BCK_DIR/control.trc' reuse;

alter database backup controlfile to '$_BCK_DIR/control_bck.ctl' reuse;

exit

EOF4

 

ftp -n <open X.X.X.X  # 원격지 백업 파일 저장용 서버에 CONTROL에 대한 백업 파일(.trc) 전송 #

user [username] *********

passive

ha

bi

prompt

lcd $_BCK_DIR

cd /home/orabackup

mput control*

bye

EOF5

 

echo ######################## >> $_LOGFILE

echo ## Archive log backup ## >> $_LOGFILE

echo ######################## >> $_LOGFILE

echo `date` >> $_LOGFILE

 

find /oraarch/*.dbf -name '1_*_772932672.dbf' -mtime -9 | sort $8 >  # DB ID or Archive 파일명 수정 #

 

$_BCK_DIR/arc_file.lst

tar -cv -T $_BCK_DIR/arc_file.lst -f /oraarch/arclog_`date +%y%m%d`.tar  >> $_LOGFILE

gzip /oraarch/arclog_`date +%y%m%d`.tar

 

ftp -n <open X.X.X.X  # 원격지 백업 파일 저장용 서버에 묶은 Archive Log 파일 전송 #

user [username] *********

passive

ha

bi

prompt

lcd /oraarch

cd /home/orabackup/arch

prompt

mdel arclog_*.tar.gz

prompt

put arclog_`date +%y%m%d`.tar.gz

bye

EOF6

 

find /oraarch -name '1_*_772932672.dbf' -mtime +32 -exec rm -f {} \;

 

echo Hot Backup end : `date` >> $_LOGFILE

 

 

 # 물리백업 수동 스크립트 내용 끝 #

 

 

 

2-2 물리백업 : 수동백업을 이용한 백업 크론탭

 

 

$ crontab -l

############################

##  Oracle On-line Backup  #

############################

30 3 * * 0 /oracle/app/oracle/product/11.2.0/dbhome_1/oralog/bck/hot_bck.sh >> /dev/null

 

 # 물리백업 수동 크론탭 내용 끝 #

 

 

 

 

3-1. 논리백업 : datapump을 이용한 백업 쉘스크립트

 

 

 

$ cat /share/backup/dump/backup.sh

 

#!/bin/bash

 

#######################################

###  Oracle Data Pump Export Backup ###

#######################################

_DATE=`date '+%Y%m%d%H'`

_BCK=/share/backup/dump

_BCK_OLD=/share/backup/dump_bck

 

. ~/.bash_profile

find ${_BCK}/ -name 'full_*.tar.gz' -mtime +6 -exec mv {} ${_BCK_OLD} \;

find ${_BCK}/ -name 'full_*.log' -mtime +6 -exec mv {} ${_BCK_OLD} \;

find ${_BCK_OLD}/ -name 'full_*.tar.gz' -mtime +20 -exec rm {} \;

find ${_BCK_OLD}/ -name 'full_*.dmp.gz' -mtime +20 -exec rm {} \;

 

rm -r ${_BCK}/full_*_f

 

$ORACLE_HOME/bin/expdp triana/triana directory=everyday schemas=triana parallel=8 dumpfile=full%U.dmp logfile=full_${_DATE}.log    # DB 유저 패스워드 입력, Directory Object 설정 필요 #

 

mkdir -p ${_BCK}/full_${_DATE}_f

mv ${_BCK}/full??.dmp ${_BCK}/full_${_DATE}_f

tar -zcvf ${_BCK}/full_${_DATE}.tar.gz ${_BCK}/full_${_DATE}_f

 

date >> ${_BCK}/full_${_DATE}.log

 

 # 논리백업 스크립트 내용 끝 #

 

 

 

3-2. 논리백업 : Datapump 백업을 이용한 백업 크론탭

 

 

$ crontab -l

 

#######################################

###  Oracle Data Pump Export Backup ###

#######################################

30 12,18 * * * /share/backup/dump/backup.sh > /share/backup/dump/backup.log

 

 # 논리백업 크론탭 내용 끝 #

728x90
반응형