Linux에서 oracle hot backup 자동화 (crontab)

현스·2025년 2월 5일
0

backup script

목록 보기
4/11
post-thumbnail

일자별로 자동으로 비긴 백업을 수행하는 백업 스크립트

-- 로그 확인: /home/oracle/hot/script/total.log

-- 실행: sh main_backup.sh-- main_backup.sh를 crontab에 등록해 두면 아주 쉽게 주기적으로 백업을 수행 할 수 있습니다.
-- 1. main_backup.sh
-- 2. begin_backup.sh
-- 3. copy_backup.sh
-- 4. end_backup.sh
-- 5. status.sh

#main_backup.sh
#!/bin/bash

# Oracle 환경 변수 설정
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19c/db_home
export ORACLE_SID=orcl
export ORACLE_TERM=xterm
export PATH=$ORACLE_HOME/bin:$PATH
export PATH=$ORACLE_HOME/OPatch:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

# 환경 변수 확인 (디버깅 용도)
echo "ORACLE_HOME: $ORACLE_HOME"
echo "ORACLE_SID: $ORACLE_SID"

# SQL*Plus 로그인 테스트
sqlplus -s / as sysdba <<EOF
ALTER DATABASE BACKUP CONTROLFILE TO '/home/oracle/hot/backup1/control.bkp';
EXIT;
EOF

# 로그 파일 생성 (권한 문제 해결)
if [ ! -f /home/oracle/hot/script/total.log ]; then
    touch /home/oracle/hot/script/total.log
    chmod 666 /home/oracle/hot/script/total.log
fi

# 백업 시작 로그
echo "set begin backup mode--"
(time sh /home/oracle/hot/script/begin_backup.sh >> /home/oracle/hot/script/total.log) 2>&1
echo "end begin backup mode--"

# 파일 복사 시작
echo "start file copy.........."
(time sh /home/oracle/hot/script/copy_backup.sh >> /home/oracle/hot/script/total.log) 2>&1
echo "end file copy~"

# 백업 종료 로그
echo "set end backup mode~~"
(time sh /home/oracle/hot/script/end_backup.sh >> /home/oracle/hot/script/total.log) 2>&1
echo "complete hot backup~!"

#begin_backup.sh
sqlplus /nolog <<EOF1
conn / as sysdba
 
set head off
set feedback off
set time off
set timing off
set echo off
spool /tmp/online.tmp
select 'alter tablespace '||tablespace_name||' begin backup;' from dba_tablespaces where status='ONLINE' and contents!='TEMPORARY';
spool off
!cat /tmp/online.tmp | egrep -v spool | egrep -v SQL | egrep -v [2-4] > /home/oracle/hot/script/begin.sh
@/home/oracle/hot/script/begin.sh
!sh /home/oracle/hot/script/status.sh
exit
EOF1
#copy_backup.sh
sqlplus /nolog << EOF3
conn / as sysdba
set head off
set time off
set timing off
set feedback off
set echo off
set line 200
col name for a100
spool /tmp/cp.tmp
select 'cp -av '||name||' /home/oracle/hot/backup1/' from v\$datafile;
spool off
 
spool /tmp/control.tmp
alter session set nls_date_format='YYYY-MM-DD-HH24-MI-SS';
select 'alter database backup controlfile to '||'''/home/oracle/hot/backup1/'||sysdate||'.ctl'';' from dual;
spool off
!cat /tmp/cp.tmp | egrep -v SQL > /home/oracle/hot/script/cp.sh
!cat /tmp/control.tmp | egrep -v SQL > /home/oracle/hot/script/control.sql
 
!sh /home/oracle/hot/script/cp.sh
@/home/oracle/hot/script/control.sql
exit
EOF3
#end_backup.sh
sqlplus /nolog << EOF4
conn / as sysdba
 
set head off
set feedback off
set time off
set timing off
set echo off
spool /tmp/online.tmp
select 'alter tablespace '||tablespace_name||' end backup;' from dba_tablespaces where status='ONLINE' and contents!='TEMPORARY';
spool off
!cat /tmp/online.tmp | egrep -v spool | egrep -v SQL | egrep -v [2-4] > /home/oracle/hot/script/end.sh
@/home/oracle/hot/script/end.sh
!sh /home/oracle/hot/script/status.sh
exit
EOF4
#status.sh
sqlplus /nolog << EOF2
conn / as sysdba
 
set head on
set echo off
set feedback off
spool /tmp/status.tmp
set line 200
col name for a50
col status for a15
select a.file#,a.name,b.status,to_char(b.time,'YYYY-MM-DD:HH24:MI:SS') "Time" from v\$datafile a, v\$backup b where a.file#=b.file#;
spool off
exit
EOF2

-- 삭제 스크립트

# 스크립트 저장
/home/oracle/hot/script/cleanup_backup.sh
# 실행권한 부여
chmod +x /home/oracle/hot/script/cleanup_backup.sh

---cron tab 자동화 하는 방법

# 스크립트에 실행 권한 부여
chmod +x /home/oracle/hot/script/main_backup.sh
# crontab 설정
crontab -e

0 0 * * * find /home/oracle/hot/backup1/ -type f -mtime +30 -exec rm -f {} \;

# 30일 이상 된 파일을 매일 자정(00:00)에 자동 삭제

0 */12 * * * bash -c "source /home/oracle/.bash_profile; /home/oracle/hot/script/main_backup.sh >> /home/oracle/hot/cron_backup.log 2>&1"

# 0 */12 * * * → 매일 12시간 간격(00:00, 12:00)에 실행됨
/home/oracle/hot/backup1/: 실제 핫백업 파일이 저장된 경로.
-type f: 일반 파일만 삭제 대상.
-mtime +30: 30일 이상된 파일만 검색.
-exec rm -f {} \;: 찾은 파일을 강제로 삭제.
  • crontab 확인
crontab -l
profile
˗ˋˏ O R A C L E ˎˊ˗

0개의 댓글