ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle Database Linux 계열 백업 쉘스크립트 & 크론탭
    DB 2021. 7. 6. 13:36
    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
    반응형
Designed by Tistory.