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后面写你自己的路径就可以了。