共享一个多实例的ORACLE数据库备份脚本

来源:互联网 发布:spring书籍推荐 知乎 编辑:程序博客网 时间:2024/06/06 05:39

首先说一下我的环境ORACLE 10gR2

机器运行三个实例 aaa bbb ccc

每周周一一个完全备份,周四一个差异备份,其他每天都执行增量备份

脚本的大概结构大概是:

首先判断是不是周一,如果是,就循环所有的DBSID,执行完全备份

备份内容有:数据文件,归档日志文件,控制文件和pfile

然后判断是不是周四,如果是,就循环DBSID,执行差异备份

备份内容有:数据文件,归档日志文件和控制文件

其他也就是二三五六七每天都执行增量备份

别分内容是:数据文件,归档日志文件和控制文件


脚本内容如下

#!/bin/bash

#lsnrctl status|grep Service|egrep -v "XDB|XPT|Summary"|awk '{print $2}'    #如果动态获得服务名的话就用这个,然后设置变量,下边在for循环中不用手动定义DBSID

source ~/.bash_profile

export SERVICES="AAA BBB CCC"
export DATETIME=`date +%Y%m%d`
export WEEKTIME=`date +%u`
export BACKDATADIR=/home/oracle/rman_backup/$DATETIME
export BACKLOGDIR=/home/oracle/rman_log/$DATETIME

if [ $WEEKTIME -eq 1 ] ;   #判断是否是周一
then
    for DBSID in $SERVICES    #这儿循环的DBSID其实是SERVER NAME,只是我的库名SID名和SERVER NAME都一样所以这儿就循环SID即可
    do
        if [ ! -d $BACKLOGDIR/$DBSID ] ;          #判断rman的日志目录是否存在,如果不存在就创建之
        then
            mkdir -p $BACKLOGDIR/$DBSID
        fi
        if [ ! -d $BACKDATADIR/$DBSID ] ;        #判断rman的data备份目录是否存在,如果不存在就创建之
        then
            mkdir -p $BACKDATADIR/$DBSID
        fi
        
        rman target sys/"2I4#5Y8*jklH"@$DBSID nocatalog  log=$BACKLOGDIR/$DBSID/${DBSID}_level0_$DATETIME.log<<EOF
        run {allocate channel d1 type disk;
        allocate channel d2 type disk;
        backup incremental level 0 database format '$BACKDATADIR/$DBSID/${DBSID}_leve0_%d_%s_%p_%U_%T.dbf'       #备份数据库
        tag='level 0' include current controlfile;
        sql 'alter system archive log current';                                                                                                                                                  #强制归档
        backup archivelog all format '$BACKDATADIR/$DBSID/${DBSID}_log_%d_%s_%p_%U_%T.arc' delete all input;         #备份并删除归档日志文件
        release channel d2;
        release channel d1;}
        backup current controlfile format '$BACKDATADIR/$DBSID/${DBSID}CTRL.bak';                                                     #备份控制文件
        delete archivelog all completed before 'sysdate-7';                                                         #删除7天前的归档日志,理论上来说,这句是空操作,可以删除
        run {crosscheck backup;                                                           #核对所有的备份标出expired
        delete noprompt expired backup;                                            #删除状态为expired的备份文件
        delete noprompt obsolete;}                                                       #删除超出保存策略的备份
        sql "create pfile=''$BACKDATADIR/$DBSID/pfile$DBSID.ora'' from spfile";                          #备份pfile,以备不时之需
EOF
done

elif [ $WEEKTIME -eq 4 ] ;                          #判断是否是周四如果是就执行差异备份LEVE2 下边的备份内容和周一的就查pfile的备份,这儿就不再赘述
then
        for DBSID in $SERVICES
        do
                if [ ! -d $BACKLOGDIR/$DBSID ] ;
                then
                        mkdir -p $BACKLOGDIR/$DBSID
                fi
                if [ ! -d $BACKDATADIR/$DBSID ] ;
                then
                        mkdir -p $BACKDATADIR/$DBSID
                fi

                echo "rman target sys/"2I4#5Y8*jklH"@$DBSID nocatalog  log=$BACKLOGDIR/$DBSID/${DBSID}_level2_$DATETIME.log<<EOF
                run {allocate channel d1 type disk;
                allocate channel d2 type disk;
                backup incremental level 2 database format '$BACKDATADIR/$DBSID/${DBSID}_leve2_%d_%s_%p_%U_%T.dbf'
                tag='level 2' include current controlfile;
                sql 'alter system archive log current';
                backup archivelog all format '$BACKDATADIR/$DBSID/${DBSID}_log_%d_%s_%p_%U_%T.arc' delete all input;
                release channel d2;
                release channel d1;}
        backup current controlfile format '$BACKDATADIR/$DBSID/${DBSID}CTRL.bak';
                delete archivelog all completed before 'sysdate-7';
                run {crosscheck backup;
                delete noprompt expired backup;
                delete noprompt obsolete;}
EOF"
done

else                                     #如果是不是周一和周四就执行增量备份 LEVE 1
        for DBSID in $SERVICES
        do
                if [ ! -d $BACKLOGDIR/$DBSID ] ;
                then
                        mkdir -p $BACKLOGDIR/$DBSID
                fi
                if [ ! -d $BACKDATADIR/$DBSID ] ;
                then
                        mkdir -p $BACKDATADIR/$DBSID
                fi

               rman target sys/"2I4#5Y8*jklH"@$DBSID nocatalog  log=$BACKLOGDIR/$DBSID/${DBSID}_level1_$DATETIME.log<<EOF
                run {allocate channel d1 type disk;
                allocate channel d2 type disk;
                backup incremental level 1 database format '$BACKDATADIR/$DBSID/${DBSID}_leve1_%d_%s_%p_%U_%T.dbf'
                tag='level 1' include current controlfile;
                sql 'alter system archive log current';
                backup archivelog all format '$BACKDATADIR/$DBSID/${DBSID}_log_%d_%s_%p_%U_%T.arc' delete all input;
                release channel d2;
                release channel d1;}
        backup current controlfile format '$BACKDATADIR/$DBSID/${DBSID}CTRL.bak';
                delete archivelog all completed before 'sysdate-7';
                run {crosscheck backup;
                delete noprompt expired backup;
                delete noprompt obsolete;}
EOF
done

fi

#我这儿采用rsync的方式进行传到别的机器上,以保万一
rsync -vzrtopg --progress $BACKDATADIR/ 192.168.119.10::dbbak/192.168.119.5/$DATETIME    #传输rman备份集

rsync -vzrtopg --progress $BACKLOGDIR 192.168.119.10::dbbaklog/192.168.119.5/$DATETIME  #传输rman备份log

find /home/oracle/rman_backup/  -mtime +8 -exec rm -rf {} \;     #删除备份目录中8天前的垃圾文件

find /home/oracle/rman_log/  -mtime +8 -exec rm -rf {} \;     #删除备份目录中8天前的rman日志



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

本文有笔者原创

作者:john

转载请注明出处


原创粉丝点击