中小型数据库 RMAN CATALOG 备份恢复方案(一)
对于数据库的稳定性,高可用,跨平台以及海量数据库的处理,Oracle 数据库通常是大型数据库和大企业的首选。尽管如此,仍然不乏很多中小企业想要品尝一下Oracle腥味,因此在Oracle环境中也有不少中小型数据库。出于成本的考虑,通常有可能就搞个标准版了,跑在Linux上。谁叫Oracle太贵呢?对于中小企业而言,选择合理的才是最好的。对我们这些个搞DB的,贵的一定有贵的道理,我们也可以都进多几斗米。哈哈......典型的打工者的心态哟。言归正传,中小企业的成本限制了我们搞高可用,RAC和DG也就比较少了。最近就碰到这样的情形,就是能否模拟DataGuard来保护数据库。我们知道DataGuard可以实时将数据库从主库切换到备库,或者从备库再切换回主库,实现无缝对接,从而避免由于硬件故障所带来的数据损失。下文即是基于上面的情形来使用rman catalog方式从某种程度上模拟DataGuard来更大程度地保护数据。
1、模拟DataGuard可行性分析
      a、能否将生产数据库整个结构以相同的结构存在于备份服务器? 可以,热备,冷备,RMAN备份,方式多样化。首次选用冷备初始化数据库。
      b、抛开DG的什么逻辑物理Standy来考虑,即不考虑实现自动或手动failover。只考虑的Prod机器硬件故障,DB在备份服务器可用。可行。
      c、能否将数据库损失减小到最少?DG可以定时传送archivelog,自动apply,那我们也可以定时传送archivelog,不过自动apply有难度。
      d、对于定时传送的archivelog,能否最终应用的备份服务器?可以,不论是添加/减少表空间/数据文件,数据变化更是没有问题的了。
      e、数据丢失的程度取决于最后剩余未及时传送的archivelog以及Prod的redo log,这个会损失,没有办法,毕竟不是DG。
2、备份恢复方案规划  
    下面是数据库备份的方案规划
        系统环境: Linux,Oracle 10g Standard
        数据库环境: 主数据库位于Prod服务器,备份数据库位于Bak服务器,数据库容量<=200GB
        备份频度: 每天做一个level 0级备份,也可以根据需要每2天实现0级备份。当然,如果中型或大型,建议使用0,1,2级增量备份
        备份位置:Prod服务器放置备份文件,同时将当次的备份文件ftp到Bak服务器
        归档日志:定时将归档日志ftp到Bak服务器上与原数据库相同的归档位置
        还原频度:每天定时使用新的备份文件在Bak服务器上进行还原
        恢复频度:不作任何恢复操作,因为恢复操作为不完全恢复,且需要使用resetlogs打开数据库,会生成新的incarnation
        故障处理:如果Prod服务器主库损坏,则将剩余的archivelog及redo复制到Bak(如果可能的话),接下来在Bak服务器手动恢复数据库并open
        恢复目录数据库:建议对恢复目录数据库备份,方案多样不表
3、创建恢复目录数据库及其脚本
      由于Prod服务器数据库较多,因此创建恢复目录数据库。如果你的环境库较少,可以直接使用控制文件替代恢复目录。
      其次创建基于恢复目录数据库的备份与恢复的全局脚本供所有数据库调度。
      关于如何创建恢复目录数据库及恢复目录脚本,此处省略,请参考:
            RMAN catalog 的创建和使用            基于catalog 创建RMAN存储脚本 
            基于catalog 的RMAN 备份与恢复
- --下面列出恢复目录下部署的所有脚本
 - --注,没有指定备份路径,使用缺省的闪回区
 - RMAN> list global script names;
 - List of Stored Scripts in Recovery Catalog
 - Global Scripts
 - Script Name
 - Description
 - -----------------------------------------------------------------------
 - global_arch
 - global_del_obso
 - global_inc0
 - global_restore
 - RMAN> print global script global_arch;
 - printing stored global script: global_arch
 - {
 - allocate channel ch1 type disk maxpiecesize=2g;
 - allocate channel ch2 type disk maxpiecesize=2g;
 - set limit channel ch1 readrate=10240;
 - set limit channel ch1 kbytes=2048000;
 - set limit channel ch2 readrate=10240;
 - set limit channel ch2 kbytes=2048000;
 - crosscheck archivelog all;
 - delete noprompt archivelog all;
 - sql " alter system archive log current";
 - backup as compressed backupset archivelog all delete input tag='Archbk';
 - release channel ch1;
 - release channel ch2;
 - }
 - --Author : Robinson Cheng
 - --Blog : http://blog.csdn.net/robinson_0612
 - RMAN> print global script global_del_obso;
 - printing stored global script: global_del_obso
 - {
 - allocate channel ch1 device type disk;
 - delete noprompt obsolete redundancy 1;
 - release channel ch1;
 - }
 - RMAN> print global script global_inc0;
 - printing stored global script: global_inc0
 - {
 - configure retention policy to redundancy 1;
 - configure backup optimization on;
 - configure controlfile autobackup on;
 - allocate channel ch1 device type disk maxpiecesize=5g;
 - allocate channel ch2 device type disk maxpiecesize=5g;
 - set limit channel ch1 readrate=10240;
 - set limit channel ch1 kbytes=4096000;
 - set limit channel ch2 readrate=10240;
 - set limit channel ch2 kbytes=4096000;
 - backup as compressed backupset incremental level 0 database tag='Inc0';
 - release channel ch1;
 - release channel ch2;
 - execute global script global_arch;
 - execute global script global_del_obso;
 - }
 - RMAN> print global script global_restore;
 - printing stored global script: global_restore
 - {
 - restore controlfile;
 - sql 'alter database mount';
 - crosscheck backup;
 - delete noprompt expired backup;
 - crosscheck copy;
 - delete noprompt expired copy;
 - allocate channel ch1 type disk;
 - allocate channel ch2 type disk;
 - restore database;
 - release channel ch1;
 - release channel ch2;
 - shutdown immediate;
 - }
 
4、创建RMAN备份shell脚本
- oracle@BKDB01p:/u02/database/common/rman_scripts> more db_bak_rman_catalog.sh
 - ##===========================================================
 - ## File name: db_bak_rman_catalog.sh
 - ## Usage: db_bak_rman_catalog.sh <$ORACLE_SID>
 - ## Desc:
 - ## The script uses to backup database with level 0.
 - ## Author: Robinson
 - ## Blog : http://blog.csdn.net/robinson_0612
 - ##============================================================
 - #!/bin/bash
 - # User specific environment and startup programs
 - if [ -f ~/.bash_profile ];
 - then
 - . ~/.bash_profile
 - fi
 - # --------------------------
 - # Check SID
 - # --------------------------
 - if [ -z "${1}" ];then
 - echo "Usage: "
 - echo " `basename $0` ORACLE_SID"
 - exit 1
 - fi
 - # -------------------------------
 - # Set environment here
 - # -------------------------------
 - ORACLE_SID=${1}; export ORACLE_SID
 - TIMESTAMP=`date +%Y%m%d%H%M`; export TIMESTAMP
 - LOG_DIR=/u02/database/${ORACLE_SID}/backup export LOG_DIR
 - RMAN_LOG=${LOG_DIR}/${ORACLE_SID}_bak_${TIMESTAMP}.log
 - SSH_LOG=${LOG_DIR}/${ORACLE_SID}_bak_full_${TIMESTAMP}.log
 - MAIL_DIR=/users/oracle/sendEmail-v1.56
 - MAIL_FM=oracle@BKDB01p
 - RETENTION=5
 - echo "----------------------------------------------------------------" >>${SSH_LOG}
 - echo "Step 1. Start rman to backup at `date`." >>${SSH_LOG}
 - echo "----------------------------------------------------------------" >>${SSH_LOG}
 - $ORACLE_HOME/bin/rman log=${RMAN_LOG} <<EOF
 - connect target sys/xxx@${ORACLE_SID}
 - connect catalog rman_user/xxx@CATADB
 - resync catalog;
 - run {execute global script global_inc0;}
 - exit;
 - EOF
 - RV=$?
 - cat ${RMAN_LOG}>>${SSH_LOG}
 - echo "" >>${SSH_LOG}
 - echo "=====>MSG1: RMAN backup end at `date`." >>${SSH_LOG}
 - if [ $RV -ne "0" ]; then
 - echo "" >>${SSH_LOG}
 - echo "=====>MSG2: RMAN backup error at `date`." >>${SSH_LOG}
 - $MAIL_DIR/sendEmail -f $MAIL_FM -u "Failed RMAN backup for $ORACLE_SID on `hostname`." -t dba@12306.com -o message-file=${SSH_LOG}
 - exit
 - else
 - echo "" >>${SSH_LOG}
 - echo "=====>MSG2: No error found during RMAN backup peroid at `date`" >>${SSH_LOG}
 - rm -rf ${RMAN_LOG} 2>/dev/null
 - fi
 - echo "-------------------------------------------------------------------------" >>${SSH_LOG}
 - echo "Step 2. Start ftp backupset to backup server at `date`." >>${SSH_LOG}
 - echo "-------------------------------------------------------------------------" >>${SSH_LOG}
 - SRC_DB_BAK_DIR=/u02/database/${ORACLE_SID}/flash_recovery_area/${ORACLE_SID}
 - SRC_ADD=10.1.2.101
 - TARG_DB_BAK_DIR=/u02/database/${ORACLE_SID}/flash_recovery_area
 - RSYN_LOG=${LOG_DIR}/rsync_${TIMESTAMP}.log
 - # rsync is used to ftp backup set to bak server.
 - rsync -avzSH --progress --delete-after oracle@${SRC_ADD}:${SRC_DB_BAK_DIR} ${TARG_DB_BAK_DIR} >${RSYN_LOG} 2>&1
 - RV=$?
 - cat ${RSYN_LOG}>>${SSH_LOG}
 - if [ $RV -ne "0" ]; then
 - echo "" >>${SSH_LOG}
 - echo "=====>MSG3: FTP backupset error at `date`." >>${SSH_LOG}
 - MAIL_SUB="Failed archive log sync for $ORACLE_SID on `hostname` at `date`."
 - $MAIL_DIR/sendEmail -f $MAIL_FM -u $MAIL_SUB -t dba@12306.com -o message-file=${SSH_LOG}
 - exit
 - else
 - echo "" >>${SSH_LOG}
 - echo -e "=====>MSG3: No error found during FTP peroid." >>${SSH_LOG}
 - rm -rf $FTP_LOG 2>/dev/null
 - fi
 - echo "-------------------------------------------------------------------------" >>${SSH_LOG}
 - echo "Step 3. RMAN backup and ftp backupset finished at `date`." >>${SSH_LOG}
 - echo "-------------------------------------------------------------------------" >>${SSH_LOG}
 - MAIL_SUB="Sucessful completed for ${ORACLE_SID} RMAN backup and ftp backupset at `date`."
 - $MAIL_DIR/sendEmail -f $MAIL_FM -u $MAIL_SUB -t dba@12306.com -o message-file=${SSH_LOG}
 - # ------------------------------------------------
 - # Removing files older than $RETENTION parameter
 - # ------------------------------------------------
 - find ${LOG_DIR} -name "*.*" -mtime +$RETENTION -exec rm {} \;
 - exit
 
5、自动FTP archivelog脚本
- oracle@BKDB01p:/u02/database/common/rman_scripts> more autoftp_arch.sh
 - #!/bin/bash
 - ORACLE_SID=${1}; export ORACLE_SID
 - TIMESTAMP=`date +%Y%m%d%H%M`; export TIMESTAMP
 - LOG_DIR=/u02/database/${ORACLE_SID}/backup
 - #Define FTP variable
 - SRC_DB_BAK_DIR=/u02/database/${ORACLE_SID}/archive
 - SRC_ADD=10.1.2.101
 - TARG_DB_BAK_DIR=/u02/database/${ORACLE_SID}
 - RSYN_LOG=${LOG_DIR}/rsync_arc_${TIMESTAMP}.log
 - RSYN_ERR_LOG=${LOG_DIR}/rsync_arc_${TIMESTAMP}_err.log
 - rsync -avzSH --progress --delete-after oracle@${SRC_ADD}:${SRC_DB_BAK_DIR} ${TARG_DB_BAK_DIR} >${RSYN_LOG} 2>${RSYN_ERR_LOG}
 - RV=$?
 - if [ ! -s ${RSYN_ERR_LOG} ];then
 - rm -rf ${RSYN_ERR_LOG} 2>/dev/null
 - else
 - mail -s "Failed FTP archive log for $ORACLE_SID on `hostname`" dba@12306.com <${SYN_ERR_LOG}
 - fi
 - exit
 
6、部署备份脚本到crontab
      如果你的数据库比较少,则直接将上面的备份脚本与自动FTP archivelog脚本部署到crontab。
      如果你的数据库比较多,建议将上面的脚本封装到另外的一个文件,然后部署到crontab。
      如下面的full_bak_by_rman.sh实际上是包含了多个db_bak_rman_catalog.sh <$ORACLE_SID> ,后面的多个full开头的使用类是的原理。
#Rman backup and restore database
      0 1 * * 1-6 /u02/database/common/rman_scripts/full_bak_by_rman.sh
      0 3 * * 1-6 /u02/database/common/rman_scripts/full_resotre_by_rman.sh  #这个是用来还原的脚本
#Auto ftp archive log from prod to bak server
      */16 7-20 * *  1-6 /u02/database/common/rman_scripts/full_autoftp_arch.sh
转:http://blog.csdn.net/leshami/article/details/9815271
中小型数据库 RMAN CATALOG 备份恢复方案(一)的更多相关文章
- 中小型数据库 RMAN CATALOG 备份恢复方案(二)
		
中小型数据库呈现的是数据库并发少,数据库容量小,版本功能受限以及N多单实例等特点.尽管如此,数据库的损失程度也会存在零丢失的情形.企业不愿意花太多的钱又要保证数据库的可靠稳定,可是苦煞了我这些搞DB的 ...
 - RMAN catalog备份恢复方案
		
对于数据库的稳定性,高可用,跨平台以及海量数据库的处理,Oracle 数据库通常是大型数据库和大企业的首选.尽管如此,仍然不乏很多中小企业想要品尝一下Oracle腥味,因此在Oracle环境中也有不少 ...
 - MySQL 系列(四)主从复制、备份恢复方案生产环境实战
		
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
 - 阿里RDS数据库 全量备份恢复到本地MYSQL
		
阿里RDS数据库 全量备份恢复到本地MYSQL 1.首先下载RDS的全量备份 下载完成后上传到服务器备用 2.安装MySQL 5.6 首先删除机上其他的MySQL版本 检查系统是否安装其他版本 ...
 - RMAN常用备份恢复命令汇总
		
RMAN命令 1.独立命令 RMAN>shutdown immediate RMAN>startup RMAN>backup format 'd:\backup\%d_%s.b ...
 - MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战
		
本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...
 - 怎样使用 RMAN 增量备份恢复 data guard log gap(日志断档)
		
主库查询最小scn 信息: SQL> col current_scn for 999999999999999 SQL> SELECT CURRENT_SCN FROM V$DATABAS ...
 - Elasticsearch系列---生产数据备份恢复方案
		
前言 生产环境中运行的组件,只要有数据存储,定时备份.灾难恢复是必修课,mysql数据库的备份方案已经非常成熟,Elasticsearch也同样有成熟的数据备份.恢复方案,我们来了解一下. 概要 本篇 ...
 - MySQL实时在线备份恢复方案
		
开源Linux 长按二维码加关注~ 上一篇:2020年MySQL数据库面试题总结 快照和复制技术的结合可以保证我们得到一个实时的在线MySQL备份解决方案. 当主库发生误操作时,只需要恢复备库上的快照 ...
 
随机推荐
- lintcode:最小编辑距离
			
最小编辑距离 给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 插入一个字符 删除一个字符 替换一个字符 样例 给出 work1=&quo ...
 - Why you have so few friends?
			
Why you have so few friends?十个原因告诉你:为什么你的朋友那么少1. You Complain A Lot 你总是抱怨 If you’re constantly compl ...
 - JavaWeb项目开发案例精粹-第4章博客网站系统-006View层
			
1.showAllArticle.jsp <%@ page language="java" contentType="text/html; charset=gb23 ...
 - Ubuntu rsync同步
			
>服务器端:Ubuntu 9.10 - 192.168.1.3客户端:Ubuntu 10.04 - 192.168.1.73 我们先来设置一下服务器端的配置 1.ubuntu系统安装完之后,rs ...
 - Java笔记——equals和==的区别
			
摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...
 - 【web性能】让css更简洁、高效
			
用了这么多年的CSS,现在才明白CSS的真正匹配原理,不知道你是否也跟我一样? 看1个简单的CSS: DIV#divBox p span.red{color:red;},按习惯我们对这个CSS 的 ...
 - Android AlarmManager类的应用(实现闹钟功能)
			
1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...
 - Linux实用命令
			
0. 基本命令 1. 压缩 解压 tar -zcvf a.tar.gz a #把a压缩成a.tar.gz tar -zxvf a.tar.gz #把a.tar.gz解压成a 2. vim小结 2.1 ...
 - flex 4 transition
			
<s:transitions> <s:Transition fromState="default"> <s:Parallel> <mx:R ...
 - 正则表达式验证工具类RegexUtils.java
			
Java 表单注册常用正则表达式验证工具类,常用正则表达式大集合. 1. 电话号码 2. 邮编 3. QQ 4. E-mail 5. 手机号码 6. URL 7. 是否为数字 8. 是否为中文 9. ...