RMAN是Oracle提供的一个数据库备份和恢复工具,利用rman可以比较方便的对数据库进行备份。Oracle 数据库可运行在归档和非归档模式下,这两者的区别就在于对redo log的处理。归档模式下,当一个redo log  写满之后,就会把这个redo log里的内容写入归档文件,等写完之后,这个redo log  就可以继续使用,如果是非归档模式下,redo log 就被直接覆盖了。 数据库的恢复一般都需要归档文件,这里面记录了对数据库的操作,所以生产数据库一般都运行在归档模式下,以防数据的丢失。

一、设置ORACLE的RMAN备份准备工作:
1、查看数据库现有运行模式
sql>select name,log_mode from v$database;
NAME    LOG_MODE
--------  ------------
BIGSUN   NOARCHIVELOG   #非归档模式
也可以通过下面的语句进行查看
sql> archive log list ;(conn / as sysdba)
Database log mode       No Archive Mode
Automatic archival      Disabled    #非归档模式
Archive destination      /export/data/oracle/product/10.0.0.2/dbs/arch
Oldest online log sequence         28613
Current log sequence     28615
非归档模式的数据库需要改为归档模式,才能进行RMAN备份。步骤如下:
1. SQL> alter system set log_archive_dest_1='location=/oracle/oracle10g/log/archive_log';
该语句含义是确定归档日志的路径,实际上Oracle 10g可以生成多份一样的日志,保存多个位置,以防不测

例如再添加一个日志位置可使用以下语句
SQL>alter system set log_archive_dest_2='location=/oracle/oracle10g/log2/archive_log';

2.关闭数据库
SQL> shutdown immediate

3.启动数据mount状态:
SQL> startup mount;

4、修改数据库为归档模式:
SQL> alter database archivelog;

5、打开数据库,查询:
SQL> alter database open; 

修改日志文件命名格式:
SQL> alter system set log_archive_max_processes = 5;
SQL> alter system set log_archive_format = "archive_%t_%s_%r.log" scope=spfile;

修改完成后可以查看日志模式是否修改成功!

sql>select name,log_mode from v$database;
NAME    LOG_MODE
--------  ------------
BIGSUN   ARCHIVELOG   #归档模式

二、用脚本实现RMAN自动备份。

注: level 0 全备份; level 1  差量备份; level 2 增量备份

首先在linux oracle服务器的/data/rmanbak/script/目录下新建3个脚本文件,并赋予每个脚本执行权限。

bakl0.sh 脚本

RUN_STR="
BAK_LEVEL=0
export BAK_LEVEL
ORACLE_HOME=/opt/app/oracle/10.2.0
export ORACLE_HOME
ORACLE_SID=orcl
export ORACLE_SID
RMAN_LOG_FILE=${0}.out
echo Script $0 >> $RMAN_LOG_FILE 
echo ==== started on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE           
chmod 666 $RMAN_LOG_FILE
$RMAN nocatalog target sys/admin  msglog $RMAN_LOG_FILE append << EOF

run{

allocate channel c1 type disk;

backup incremental level 0 format "/data/rmanbak/inc0_%u_%T" tag monday_inc0 database;

release channel c1;

}

bakl1.sh 脚本

RUN_STR="
BAK_LEVEL=1
export BAK_LEVEL
ORACLE_HOME=/opt/app/oracle/10.2.0
export ORACLE_HOME
ORACLE_SID=orcl
export ORACLE_SID
RMAN_LOG_FILE=${0}.out
echo Script $0 >> $RMAN_LOG_FILE 
echo ==== started on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE           
chmod 666 $RMAN_LOG_FILE
$RMAN nocatalog target sys/admin  msglog $RMAN_LOG_FILE append << EOF

run{

allocate channel c1 type disk;

backup incremental level 1 format "/data/rmanbak/inc1_%u_%T" tag monday_inc0 database;

release channel c1;

}

bakl2.sh 脚本
 
RUN_STR="
BAK_LEVEL=2
export BAK_LEVEL
ORACLE_HOME=/opt/app/oracle/10.2.0
export ORACLE_HOME
ORACLE_SID=orcl
export ORACLE_SID
RMAN_LOG_FILE=${0}.out
echo Script $0 >> $RMAN_LOG_FILE 
echo ==== started on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE           
chmod 666 $RMAN_LOG_FILE
$RMAN nocatalog target sys/admin  msglog $RMAN_LOG_FILE append << EOF

run{

allocate channel c1 type disk;

backup incremental level 2 format "/data/rmanbak/inc2_%u_%T" tag monday_inc0 database;

release channel c1;

}
 

其二、编辑oracle用户的自动执行任务计划

crontab -e -u oracle

30 23 * * 0 rman target / msglog=/data/rmanbak/rman_bk_'date '+%Y%m%d%H%M%S''.log

cmdfile=/data/rmanbak/script/bakl0.sh

30 23 * * 1 rman target / msglog=/data/rmanbak/bakl0.log cmdfile=/data/rmanbak/script/bakl2.sh

30 23 * * 2 rman target / msglog=/data/rmanbak/bakl0.log cmdfile=/data/rmanbak/script/bakl2.sh

30 23 * * 3 rman target / msglog=/data/rmanbak/bakl0.log cmdfile=/data/rmanbak/script/bakl1.sh

30 23 * * 4 rman target / msglog=/data/rmanbak/bakl0.log cmdfile=/data/rmanbak/script/bakl2.sh

30 23 * * 5 rman target / msglog=/data/rmanbak/bakl0.log cmdfile=/data/rmanbak/script/bakl2.sh

30 23 * * 6 rman target / msglog=/data/rmanbak/bakl0.log cmdfile=/data/rmanbak/script/bakl2.sh

最后重启crontab  命令 : #service crond restart
 
三、定期删除备份的归档文件

 比如归档文件需要保存15天。我们可以写一个shell 脚本(del_archive_backup.sh
)如下,然后添加到crontab 里定时执行就可以删除过期的归档文件了。
                                     
                  #!/bin/ksh
                 
                  PATH=/usr/bin:/usr/ucb:/etc:.:/usr/X/bin:/bin
                  export PATH
                  find /data/arch/incremental_hotbackup -mtime +15 -name "arch_*"
                  -exec rm {} \;

                  注:find后面写你自己的路径就可以了。