2021. 7. 6. 13:36ㆍDB
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
# 논리백업 크론탭 내용 끝 #
'DB' 카테고리의 다른 글
[Oracle] 오라클 컬럼(Column) 추가, 삭제 방법 (컬럼 순서 변경) (0) | 2021.11.11 |
---|---|
(to 김책임) 오라클 insert 속도 향상 팁 (0) | 2021.11.05 |
Linux 서버에서 Oracle dump exp/imp 사용 (0) | 2021.07.06 |
오라클 한글 몇 바이트로 인식되고 있는지 확인하는 방법 (0) | 2021.06.29 |
복합키를 주키(Primary Key)로 사용한 테이블에 외래키(Foreign Key) 참조하는 방법 (재귀 참조) (0) | 2021.05.12 |