天天看点

基于Linux下 Oracle 备份策略(RMAN)

基于linux下 oracle 备份策略(rman)

--**********************************

-- 基于linux下 oracle 备份策略(rman)

    对于 oracle 数据库的备份与恢复,尽管存在热备,冷备以及逻辑备份之外,使用最多的莫过于使用rman进行备份与恢复。而制定rman备份策略则是基于数据库丢失的容忍程度,即恢复策略来制定。在下面的备份策略中,给出的是一个通用的备份策略。在该备份策略中,使用了nocatalog方式来保持备份脚本以及备份信息。在实际环境中应根据具体的情况对此进行相应的调整。因为我现在目前接手的是一台单实例,一台rac,所以么有必要做catalog方式。

一、步骤

1.确认备份可用空间以及备份路径,根据需要创建相应文件夹

    2.创建通用的脚本用于删除过旧的备份和备份控制文件以及备份归档日志

        global_del_obso      --删除过旧的备份

        global_bkctl         --备份控制文件

        global_arch          --备份归档日志

    3.创建0,1级差异增量备份

        这三个脚本中均包含第2步的3个脚本,先调用global_del,然后做增量备份,最后备份归档日志global_arch和控制文件global_bkctl

    4.创建inc0.rcv,inc1.rcv

        文件内容包含调用 @@/<dir>/connect.rcv以及run{execute globalscript

scriptname;}exit;

    5.编辑第4步的三个文件分别为inc0.sh,inc1.sh

        nohup $oracle_home/bin/rman cmdfile=/u03/bk/scripts/inc1.rcv log=/u03/bk/scripts/inc0.logappend &

    6.使用crontab制定备份计划   

二、具体实现

    演示环境:

        系统:            rhel release 5.4 (final)

+oracle 11.2.3

        目标数据库:      qbjmes

        恢复目录数据库:  

        备份目录:       

/u03/bk

        连接脚本所在路径:

        注:监听需要配置好且已启动

 1.连接脚本

        connect.rcv文件内容

        connect nocatalog

rman target /

2.建立通用脚本

        --删除不必要的备份

run

{

allocatechannel ch1 device type disk;

crosscheck archivelog all;

                delete noprompt

expired archivelog all;

obsolete recovery window of 7days; 

                releasechannel

ch1;

            }

       --备份控制文件脚本

                allocate channel

ch1 device type disk;

                backup as compressed

backupset

                current controlfile reuse

                format='/u03/bk/backupctl.ctl'

                tag='bkctl';

            release channel ch1;

--备份归档日志脚本

            run

           allocate channel

            allocate channelch2

device type disk;

            sql"alter

system archive log current";   --归档当前的联机日志

            set limit channelch1

readrate=10240;        --(读取速率10m)             

            set limit channel

ch1 kbytes=4096000;        --(备份片的大小)    

            backup ascompressed

            format='/u03/bk/arch_%d_%u'

            tag='bkarch'

            archivelog all deleteinput;

            release channel ch2;

    3.创建0,1级差异增量备份脚本(注:每个脚本备份前会执行删除过旧的备份,脚本尾部会调用另外两个脚本来备份归档日志及控制文件)

        --创建0级增量备份

           run

            allocate channelch1

            set limit channel

ch1 readrate=10240;

kbytes=4096000;

            set limit channelch2

readrate=10240;

            incremental level 0 database

            format='/u03/bk/inc0_%d_%u'

            tag='inc0';

            release channel ch2;

        --创建1级增量备份        

            run

ch2 device type disk;

           set limit channel

                set limit channel

ch1 kbytes=4096000;

ch2 readrate=10240;

ch2 kbytes=4096000;

                incrementallevel 1 database

                format='/u03/bk/inc1_%d_%u'

                tag='inc1';

ch2;

            }

--查看备份完成情况

            listbackupset

summary;

    4.建立shell脚本,让linux自动执行脚本

        a. vi inc0.rcv,inc1.rcv   

           --注意不同的文件执行不同的备份脚本

        @@/u03/bk/scripts/connect.rcv       --(rman下的脚本去调用其他脚本用@@符号)(调用脚本不需要分号)

            run{

            execute globalscript

gloal_inc0;

            exit;

        b. 编辑shell文件   

            vi inc0.sh

                nohup  $oracle_home/bin/rman 

cmdfile=/u03/bk/scripts/inc0.rcvlog=/u03/bk/scripts/inc0.logappend &

            vi inc1.sh

                nohup  $oracle_home/bin/rman 

cmdfile=/u03/bk/scripts/inc1.rcvlog=/u03/bk/scripts/inc0.logappend &

            --注意:nohup与&表示将脚本放入后台执行

        c.使用crontab建立一个备份计划

        crontab -e  

            #min    hour    date 

mon  day(星期)   command

            10        3     

*     *   0          /u03/bk/scripts/inc0.sh

*     *   1          /u03/bk/scripts/inc1.sh

*     *   2          /u03/bk/scripts/inc1.sh

            10        3     

*     *   3          /u03/bk/scripts/inc1.sh

*     *   4          /u03/bk/scripts/inc1.sh

*     *   5          /u03/bk/scripts/inc1.sh

*     *   6          /u03/bk/scripts/inc1.sh

        d.重启crontab服务(如果没有启动)

            # /sbin/service crond status  --用于检查crontab 服务状态

            # /sbin/service crond stop //关闭服务

            # /sbin/service crond restart //重启服务

            # /sbin/service crond reload //重新载入配置

            使crontab服务在系统启动的时候自动启动:

                在/etc/rc.d/rc.local这个脚本的末尾加上:

                /sbin/service crond start

        e.从上面的备份策略来看,即

            周日执行0级增量备份,相当于全备

            周一,周二,周三,周四,周五,周六执行1级增量备份

        f.编辑好的shell 脚本测试

            chmod 755*.sh         --给shell脚本加权限

            测试脚本  例如./inc0.sh

三、总结

    1.backup controlfile in each scripts

tail (在脚本的尾部备份控制文件)

    2.delete

obsolete backupset in each scripts

threshold(删除旧的备份)

    3.switch logfile before backup database;

(在数据库备份以前切换日志,备份联机重做日志)

    4.chmod

u+x*.sh

后续:

1、配置rman

configure controlfile autobackup on;

configure controlfile autobackup format fordevice type disk to '/u02/backup/%f';

configure channel 1 device type diskformat   '/u02/rman/dt1/dt1_%u_%t';

configure channel 2 device type diskformat   '/u02/rman/dt2/dt2_%u_%t';

configure compression algorithm 'low'

2、计划任务:

[oracle@qbjmes ~]$ crontab -l

10 3 * * 0 /u03/bk/scripts/lv0.sh

10 3 * * 1 /u03/bk/scripts/lv1.sh

10 3 * * 2 /u03/bk/scripts/lv1.sh

10 3 * * 3 /u03/bk/scripts/lv1.sh

10 3 * * 4 /u03/bk/scripts/lv1.sh

10 3 * * 5 /u03/bk/scripts/lv1.sh

10 3 * * 6 /u03/bk/scripts/lv1.sh

[oracle@qbjmes ~]$

3、新建目录

mkdir /u03/bk/scripts/

chown -r /u03

4、shell脚本

lv0.sh

#!/bin/bash

source /home/oracle/.bash_profile

rman target / log=/u02/backup/db_lv0_`date+%y%m%d`.log <<eof

configure retention policy to recoverywindow of 7 days;

run{

allocate channel disk1 type disk;

allocate channel disk2 type disk;

backup incremental level 0 database includecurrent controlfile format '/u02/backup/db_level0_data_%d_%t_%s'

plus archivelog format'/u02/backup/db_level0_arch_%d_%t_%s'delete all input;

delete noprompt obsolete;

crosscheck backup;

delete noprompt expired backup;

release channel disk1;

release channel disk2;

}

exit;

eof

lv1:

rman target / log=/u02/backup/db_lv1_`date+%y%m%d`.log <<eof

backup incremental level 1 database includecurrent controlfile format '/u02/backup/db_level1_data_%d_%t_%s'

plus archivelog format'/u02/backup/db_level1_arch_%d_%t_%s'delete all input;

6、新建一个拷贝scpuser

 useradd -m -u 2201 -g oinstall -gdba,oper,asmdba -d /home/scpuser -s /bin/bash scpuser

7、交换钥匙

ssh-keygen ssh-copy-id

8、拷贝

crontab -e 自动任务

10 4 * * 0 scp /u02/backup/*[email protected]:/data/meslog/0

10 4 * * 1 scp /u02/backup/*[email protected]:/data/meslog/1

10 4 * * 2 scp /u02/backup/*[email protected]:/data/meslog/2

10 4 * * 3 scp /u02/backup/*[email protected]:/data/meslog/3

10 4 * * 4 scp /u02/backup/*[email protected]:/data/meslog/4

10 4 * * 5 scp /u02/backup/*[email protected]:/data/meslog/5

7、新建一个删除rmuser

 useradd -m -u 3301 -g oinstall -gdba,oper,asmdba -d /home/scpuser -s /bin/bash rmuser

8、交换钥匙

9、授权

 chmod -r 777 /u02/backup

10、删除

[rmuser@qbjmes ~]$ crontab -l

10 5 * * 0 rm /u02/backup/*

10 5 * * 1 rm /u02/backup/*

10 5 * * 2 rm /u02/backup/*

10 5 * * 3 rm /u02/backup/*

10 5 * * 4 rm /u02/backup/*

10 5 * * 5 rm /u02/backup/*

10 5 * * 6 rm /u02/backup/*

5、重启cron自动任务

/etc/init.d/cronttabrestart

通过收集网络资源整理获得,结合公司实际的情况改成这样,比较基础,还请赐教。