RMAN热备份
1 概述
Recovery Manager(RMAN)是一种用于备份(backup)、还原(restore)和恢复(recover)数据库 的 Oracle 工具。RMAN只能用于ORACLE8或更高的版本中。它能够备份整个数据库或数据库部件,如表空间、数据文件、控制文件、归档文件以 及Spfile参数文件。RMAN也允许您进行增量数据块级别的备份,增量RMAN备份是时间和空间有效的,因为他们只备份自上次备份以来有变化的那些数 据块。而且,通过RMAN提供的接口,第三方的备份与恢复软件如veritas将提供更强大的备份与恢复的管理功能。通过RMAN,也提供了其它更多功 能,如数据库的克隆、采用RMAN建立备用数据库、利用RMAN备份与移动裸设备(RAW)上的文件等工作将变得更方便简单。9i的RMAN通过增强的自 动配置与管理功能,以及特有的块级别的恢复,将使备份与恢复工作变得更加快捷与完美。9i的RMAN有如下特征特性:
·自动的备份与恢复
·方便的备份归档日志
·自动检测新的数据文件
·支持增量备份
·最大限度的减少备份与恢复的错误
·减少恢复的时间
·在热备份中不会产生额外的redo日志
·腐烂数据块的自动检测
·并行的备份与恢复操作
·在线备份时,表空间不用置于备份模式
可以看到,在以上的一些特性中,显示了RMAN强大的功能与好处,以上功能的实现,是因为RMAN是块级别的备份与恢复,备份与恢复发生在数据库块级别,可以通过比较数据块而获得一致性的数据块,可以避免备份没有用过的块,可以检验块是否腐烂等块级别的问题。
2 启动与运行RMAN要求
2.1 进程与内存要求
更多的进程的需要
大池的分配
2.2 基本环境变量需求
ORACLE_SID, ORACLE_HOME, PATH, NLS_LANG, 如果用到了基于时间的备份与 恢复,需要另外设置NLS_DATE_FORMAT
2.3 权限要求
需要SYSDBA系统权限,如果是本地,可以采用OS认证,远程需要采用密码文件认证
2.4 版本要求
·RMAN 工具版本与目标数据库必须是同一个版本,如果使用了恢复目录,还需要注意
·创建RMAN 恢复目录的脚本版本必须等于或大于恢复目录所在数据库的版本
·创建RMAN 恢复目录的脚本版本必须等于或大于目标数据库的版本
3 RMAN的自动配置
Oracle 9i可以配置一些参数如通道,备份保持策略等信息,通过一次设定可以多次使用,
而且,设置中的信息不影响脚本中的重新设置。RMAN 默认的配置参数,通过show all 就
可以看出来。
RMAN> show all;
RMAN configuration parameters are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/orabackup/rmanbk/%F';
CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
RMAN configuration has no stored or default parameters
RMAN configuration has no stored or default parameters
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/oracle/product/9.2/dbs/snapcf_gdtel1.f'; # default
3.1 备份策略保持
CONFIGURE RETENTION POLICY TO REDUNDANCY 3;
保持最少3个冗余备份集
3.2 通道配置与自动通道分配
通过CONFIGURE 配置自动分配的通道,而且可以通过数字来指定不同的通道分配情
况。
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/orabackup/rmanbk/%U‘
CONFIGURE CHANNEL n DEVICE TYPE DISK FORMAT '/orabackup/rmanbk/%U‘
也可以通过手工来进行RMAN通道的配置
allocate channel cq type disk format='/orabackup/rmanbk/%U '
3.3 控制文件自动备份
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/orabackup/rmanbk/%F';
3.4 设置并行备份
可以设置并行备份的并行数,以加快备份的速度,一般并行数为CPU的个数,因目前数据量不大,暂时不对并行数进行设置
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
3.5 配置默认IO 设备类型
备份IO 设备类型可以是磁盘或者磁带,在默认的情况下是磁盘,可以通过如下的命令进行重新配置。
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE DEFAULT DEVICE TYPE TO SBT;
目前将采用磁盘备份,建议加入磁带进行长期备份
3.6 配置多个备份的拷贝数目
如果觉得单个备份集不放心,可以设置多个备份集的拷贝,如
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 2;
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 2;
目前主要是在本地备份,同时在异地保存备份来保证备份集的可用性,配置多个备份的拷贝会导致备份性能的降低,故暂时不作多个备份的拷贝
4 用RMAN备份
RMAN可以用来备份主或备用数据库,如表空间、数据文件、归档日志、控制文件、服务
器文件与备份集。
4.1 文件拷贝
原始文件的拷贝,有点类似于OS热备份,可以拷贝整个数据文件到另外一个地点,但是结果仅仅只能写入到硬盘,而且单独的文件是分开的。因本备份方案主要是针对RAC裸设备进行备份,为了保证备份的可靠性,故不采用文件拷贝的方式
4.2 全备份
全备份,对数据库中spfile,controlfile,datafile,archivelogfile
数据库全备份脚本:
run {
backup database include current controlfile format '/orabackup/rmanbk/%U_%s.bak';
sql 'alter system archive log current' ;
ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel1' ;
ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel2' ;
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup archivelog all delete input format '/orabackup/rmanbk/%U_%s.bak';
}
4.3 多级增量备份
多级增量备份是指第N级的备份只需要备份最后一次同级或N-1级备份以后发生的改变的数据。可以通过下图来说明:
上图是一个增量备份的例子,即在第一个星期天做一个增量的0级备份,然后在星期一,星期二做一个增量的2级备份,在星期三做一个增量的1级备份,然后类 推。假设现在在星期五数据库需要做恢复,则可以先恢复第一个星期天的0级备份,,然后恢复星期三的1级备份,再恢复星期四和星期五的2级备份就可以完成数 据库的恢复。
1、 零级备份脚本
run {
backup database incremental level 0 format '/orabackup/rmanbk/%U_%s.bak';
sql 'alter system archive log current' ;
ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel1' ;
ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel2' ;
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup archivelog all delete input format '/orabackup/rmanbk/%U_%s.bak';
}
2、 一级备份脚本
run {
backup database incremental level 1 format '/orabackup/rmanbk/%U_%s.bak';
sql 'alter system archive log current' ;
ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel1' ;
ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel2' ;
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup archivelog all delete input format '/orabackup/rmanbk/%U_%s.bak';
}
3、 二级备份脚本
run {
backup database incremental level 2 format '/orabackup/rmanbk/%U_%s.bak';
sql 'alter system archive log current' ;
ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel1' ; #2 NODES RAC SYSTEM
ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel2' ;
sql 'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup archivelog all delete input format '/orabackup/rmanbk/%U_%s.bak';
}
4.4 备份检查
我们可以通过Validate命令来检查是否能备份,如数据文件是否存在,是否存在坏块 不被备份,如:
BACKUP VALIDATE DATABASE;
BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
4.5 重新启动备份
对于异常结束了的备份,很多人可能不想再重新开始备份了吧,特别是备份到90%以上,因为异常原因终止了该备份,那怎么办呢?RMAN 提供一个重新开始备份的方法,通过简单的命令,你就可以只备份那不到10%的数据了。
RMAN> BACKUP NOT BACKED UP SINCE TIME 'SYSDATE-14'
2> DATABASE PLUS ARCHIVELOG;
5 自动备份脚本
5.1 全备份自动脚本
rmanbackup_full.sh
#!/bin/sh
#set env
export ORACLE_HOME=/oracle/product/9.2
export ORACLE_SID=gdtel1
export NLS_LANG="AMERICAN_AMERICA.zhs16gbk"
export PATH=$PATH:$ORACLE_HOME/bin:/sbin:/usr/sbin
echo "-----------------------------start-----------------------------";date
#backup start
$ORACLE_HOME/bin/rman < connect target delete noprompt obsolete; backup database include current controlfile format '/orabackup/rmanbk/%U_%s.bak'; run{ ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel1' ; ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel2' ; sql 'ALTER SYSTEM ARCHIVE LOG CURRENT'; backup archivelog all delete input format '/orabackup/rmanbk/%U_%s.bak'; } list backup; exit; EOF echo "------------------------------end------------------------------";date 5.2 0级备份自动脚本 #!/bin/sh #set env export ORACLE_HOME=/oracle/product/9.2 export ORACLE_SID=gdtel1 export NLS_LANG="AMERICAN_AMERICA.zhs16gbk" export PATH=$PATH:$ORACLE_HOME/bin:/sbin:/usr/sbin echo "-----------------------------start-----------------------------";date #backup start $ORACLE_HOME/bin/rman < connect target delete noprompt obsolete; backup database incremental level 0 format '/orabackup/rmanbk/%U_%s.bak' ; run{ ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel1' ; ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel2' ; sql 'ALTER SYSTEM ARCHIVE LOG CURRENT'; backup archivelog all delete input format '/orabackup/rmanbk/%U_%s.bak'; } list backup; exit; EOF echo "------------------------------end------------------------------";date 5.3 1级备份自动脚本 #!/bin/sh #set env export ORACLE_HOME=/oracle/product/9.2 export ORACLE_SID=gdtel1 export NLS_LANG="AMERICAN_AMERICA.zhs16gbk" export PATH=$PATH:$ORACLE_HOME/bin:/sbin:/usr/sbin echo "-----------------------------start-----------------------------";date #backup start $ORACLE_HOME/bin/rman < connect target delete noprompt obsolete; backup database incremental level 0 format '/orabackup/rmanbk/%U_%s.bak'; run{ ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel1' ; ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel2' ; sql 'ALTER SYSTEM ARCHIVE LOG CURRENT'; backup archivelog all delete input format '/orabackup/rmanbk/%U_%s.bak'; } list backup; exit; EOF echo "------------------------------end------------------------------";date 5.4 2级备份自动脚本 #!/bin/sh #set env export ORACLE_HOME=/oracle/product/9.2 export ORACLE_SID=gdtel1 export NLS_LANG="AMERICAN_AMERICA.zhs16gbk" export PATH=$PATH:$ORACLE_HOME/bin:/sbin:/usr/sbin echo "-----------------------------start-----------------------------";date #backup start $ORACLE_HOME/bin/rman < connect target delete noprompt obsolete; backup database incremental level 0 format '/orabackup/rmanbk/%U_%s.bak'; run{ ALLOCATE CHANNEL node_c1 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel1' ; #2NODES RAC SYSTEM ALLOCATE CHANNEL node_c2 DEVICE TYPE DISK CONNECT 'sys/sys@gdtel2' ; sql 'ALTER SYSTEM ARCHIVE LOG CURRENT'; backup archivelog all delete input format '/orabackup/rmanbk/%U_%s.bak'; } list backup; exit; EOF echo "------------------------------end------------------------------";date 5.5 脚本部署 2、 挂接分区到 /orabackup 3、 修改文件在服务器启动的时候自动挂接 4、 建立以下目录 脚本存放目录:/orabackup/bin; 备份数据存放目录:/orabackup/rmanbk/ 备份日志存放目录:/orabackup/logs 5.5.3 编写cron.backup脚本 00 00 * * 0 /orabackup/bin/rmanbk_level0.sh #周日晚做0级备份 00 00 * * 1 /orabackup/bin/rmanbk_level0.sh #周一晚做2级备份 00 00 * * 2 /orabackup/bin/rmanbk_level0.sh #周二晚做2级备份 00 00 * * 3 /orabackup/bin/rmanbk_level0.sh #周三晚做1级备份 00 00 * * 4 /orabackup/bin/rmanbk_level0.sh #周四晚做2级备份 00 00 * * 5 /orabackup/bin/rmanbk_level0.sh #周五晚做2级备份 00 00 * * 6 /orabackup/bin/rmanbk_full.sh #周六晚做全备份 之间的空格请使用键盘的TAB键隔开,否则不起作用,另外:运行命令的目录请按脚本存放的实际目录进行修改 5.5.4 执行自动运行计划 修改:crontab –e
rmanbackup_level0.sh
rmanbackup_level1.sh
rmanbackup_level2.sh
5.5.1 使用oracle用户登录系统
5.5.2 系统目录准备
1、 准备orabackup分区,该分区要尽可能大,以容纳更多的备份数据
分钟 小时 月 日 星期 执行的命令
$crontab –u oracle cron.backup