对于数据库的稳定性,高可用,跨平台以及海量数据库的处理,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 备份与恢复

  1. --下面列出恢复目录下部署的所有脚本
  2. --注,没有指定备份路径,使用缺省的闪回区
  3. RMAN> list global script names;
  4. List of Stored Scripts in Recovery Catalog
  5. Global Scripts
  6. Script Name
  7. Description
  8. -----------------------------------------------------------------------
  9. global_arch
  10. global_del_obso
  11. global_inc0
  12. global_restore
  13. RMAN> print global script global_arch;
  14. printing stored global script: global_arch
  15. {
  16. allocate channel ch1 type disk maxpiecesize=2g;
  17. allocate channel ch2 type disk maxpiecesize=2g;
  18. set limit channel ch1 readrate=10240;
  19. set limit channel ch1 kbytes=2048000;
  20. set limit channel ch2 readrate=10240;
  21. set limit channel ch2 kbytes=2048000;
  22. crosscheck archivelog all;
  23. delete noprompt archivelog all;
  24. sql " alter system archive log current";
  25. backup as compressed backupset archivelog all delete input tag='Archbk';
  26. release channel ch1;
  27. release channel ch2;
  28. }
  29. --Author : Robinson Cheng
  30. --Blog   : http://blog.csdn.net/robinson_0612
  31. RMAN> print global script global_del_obso;
  32. printing stored global script: global_del_obso
  33. {
  34. allocate channel ch1 device type disk;
  35. delete noprompt obsolete redundancy 1;
  36. release channel ch1;
  37. }
  38. RMAN> print global script global_inc0;
  39. printing stored global script: global_inc0
  40. {
  41. configure retention policy to redundancy 1;
  42. configure backup optimization on;
  43. configure controlfile autobackup on;
  44. allocate channel ch1 device type disk maxpiecesize=5g;
  45. allocate channel ch2 device type disk maxpiecesize=5g;
  46. set limit channel ch1 readrate=10240;
  47. set limit channel ch1 kbytes=4096000;
  48. set limit channel ch2 readrate=10240;
  49. set limit channel ch2 kbytes=4096000;
  50. backup as compressed backupset incremental level 0 database tag='Inc0';
  51. release channel ch1;
  52. release channel ch2;
  53. execute global script global_arch;
  54. execute global script global_del_obso;
  55. }
  56. RMAN> print global script global_restore;
  57. printing stored global script: global_restore
  58. {
  59. restore controlfile;
  60. sql 'alter database mount';
  61. crosscheck backup;
  62. delete noprompt expired backup;
  63. crosscheck copy;
  64. delete noprompt expired copy;
  65. allocate channel ch1 type disk;
  66. allocate channel ch2 type disk;
  67. restore database;
  68. release channel ch1;
  69. release channel ch2;
  70. shutdown immediate;
  71. }

4、创建RMAN备份shell脚本

  1. oracle@BKDB01p:/u02/database/common/rman_scripts> more db_bak_rman_catalog.sh
  2. ##===========================================================
  3. ##   File name: db_bak_rman_catalog.sh
  4. ##   Usage: db_bak_rman_catalog.sh <$ORACLE_SID>
  5. ##   Desc:
  6. ##        The script uses to backup database with level 0.
  7. ##   Author: Robinson
  8. ##   Blog  : http://blog.csdn.net/robinson_0612
  9. ##============================================================
  10. #!/bin/bash
  11. # User specific environment and startup programs
  12. if [ -f ~/.bash_profile ];
  13. then
  14. . ~/.bash_profile
  15. fi
  16. # --------------------------
  17. #   Check SID
  18. # --------------------------
  19. if [ -z "${1}" ];then
  20. echo "Usage: "
  21. echo "      `basename $0` ORACLE_SID"
  22. exit 1
  23. fi
  24. # -------------------------------
  25. #  Set environment here
  26. # -------------------------------
  27. ORACLE_SID=${1};                                    export ORACLE_SID
  28. TIMESTAMP=`date +%Y%m%d%H%M`;                       export TIMESTAMP
  29. LOG_DIR=/u02/database/${ORACLE_SID}/backup          export LOG_DIR
  30. RMAN_LOG=${LOG_DIR}/${ORACLE_SID}_bak_${TIMESTAMP}.log
  31. SSH_LOG=${LOG_DIR}/${ORACLE_SID}_bak_full_${TIMESTAMP}.log
  32. MAIL_DIR=/users/oracle/sendEmail-v1.56
  33. MAIL_FM=oracle@BKDB01p
  34. RETENTION=5
  35. echo "----------------------------------------------------------------" >>${SSH_LOG}
  36. echo "Step 1. Start rman to backup at `date`."                          >>${SSH_LOG}
  37. echo "----------------------------------------------------------------" >>${SSH_LOG}
  38. $ORACLE_HOME/bin/rman log=${RMAN_LOG} <<EOF
  39. connect target sys/xxx@${ORACLE_SID}
  40. connect catalog rman_user/xxx@CATADB
  41. resync catalog;
  42. run {execute global script global_inc0;}
  43. exit;
  44. EOF
  45. RV=$?
  46. cat ${RMAN_LOG}>>${SSH_LOG}
  47. echo ""        >>${SSH_LOG}
  48. echo "=====>MSG1: RMAN backup end at `date`." >>${SSH_LOG}
  49. if [ $RV -ne "0" ]; then
  50. echo "" >>${SSH_LOG}
  51. echo "=====>MSG2: RMAN backup error at `date`." >>${SSH_LOG}
  52. $MAIL_DIR/sendEmail -f $MAIL_FM -u "Failed RMAN backup for $ORACLE_SID on `hostname`." -t dba@12306.com -o message-file=${SSH_LOG}
  53. exit
  54. else
  55. echo "" >>${SSH_LOG}
  56. echo "=====>MSG2: No error found during RMAN backup peroid at `date`" >>${SSH_LOG}
  57. rm -rf ${RMAN_LOG} 2>/dev/null
  58. fi
  59. echo "-------------------------------------------------------------------------" >>${SSH_LOG}
  60. echo "Step 2. Start ftp backupset to backup server at `date`."                   >>${SSH_LOG}
  61. echo "-------------------------------------------------------------------------" >>${SSH_LOG}
  62. SRC_DB_BAK_DIR=/u02/database/${ORACLE_SID}/flash_recovery_area/${ORACLE_SID}
  63. SRC_ADD=10.1.2.101
  64. TARG_DB_BAK_DIR=/u02/database/${ORACLE_SID}/flash_recovery_area
  65. RSYN_LOG=${LOG_DIR}/rsync_${TIMESTAMP}.log
  66. # rsync is used to ftp backup set to bak server.
  67. rsync -avzSH --progress --delete-after oracle@${SRC_ADD}:${SRC_DB_BAK_DIR} ${TARG_DB_BAK_DIR} >${RSYN_LOG} 2>&1
  68. RV=$?
  69. cat ${RSYN_LOG}>>${SSH_LOG}
  70. if [ $RV -ne "0" ]; then
  71. echo ""                                                    >>${SSH_LOG}
  72. echo "=====>MSG3: FTP backupset error at `date`."          >>${SSH_LOG}
  73. MAIL_SUB="Failed archive log sync for $ORACLE_SID on `hostname` at `date`."
  74. $MAIL_DIR/sendEmail -f $MAIL_FM -u $MAIL_SUB -t dba@12306.com -o message-file=${SSH_LOG}
  75. exit
  76. else
  77. echo ""                                                 >>${SSH_LOG}
  78. echo -e "=====>MSG3: No error found during FTP peroid." >>${SSH_LOG}
  79. rm -rf $FTP_LOG 2>/dev/null
  80. fi
  81. echo "-------------------------------------------------------------------------"  >>${SSH_LOG}
  82. echo "Step 3. RMAN backup and ftp backupset finished at `date`."                  >>${SSH_LOG}
  83. echo "-------------------------------------------------------------------------"  >>${SSH_LOG}
  84. MAIL_SUB="Sucessful completed for ${ORACLE_SID} RMAN backup and ftp backupset at `date`."
  85. $MAIL_DIR/sendEmail -f $MAIL_FM -u $MAIL_SUB -t dba@12306.com -o message-file=${SSH_LOG}
  86. # ------------------------------------------------
  87. # Removing files older than $RETENTION parameter
  88. # ------------------------------------------------
  89. find ${LOG_DIR} -name "*.*" -mtime +$RETENTION -exec rm {} \;
  90. exit

5、自动FTP archivelog脚本

  1. oracle@BKDB01p:/u02/database/common/rman_scripts> more autoftp_arch.sh
  2. #!/bin/bash
  3. ORACLE_SID=${1};                        export ORACLE_SID
  4. TIMESTAMP=`date +%Y%m%d%H%M`;           export TIMESTAMP
  5. LOG_DIR=/u02/database/${ORACLE_SID}/backup
  6. #Define FTP variable
  7. SRC_DB_BAK_DIR=/u02/database/${ORACLE_SID}/archive
  8. SRC_ADD=10.1.2.101
  9. TARG_DB_BAK_DIR=/u02/database/${ORACLE_SID}
  10. RSYN_LOG=${LOG_DIR}/rsync_arc_${TIMESTAMP}.log
  11. RSYN_ERR_LOG=${LOG_DIR}/rsync_arc_${TIMESTAMP}_err.log
  12. rsync -avzSH --progress --delete-after oracle@${SRC_ADD}:${SRC_DB_BAK_DIR} ${TARG_DB_BAK_DIR} >${RSYN_LOG} 2>${RSYN_ERR_LOG}
  13. RV=$?
  14. if [ ! -s ${RSYN_ERR_LOG} ];then
  15. rm -rf ${RSYN_ERR_LOG} 2>/dev/null
  16. else
  17. mail -s "Failed FTP archive log for $ORACLE_SID on `hostname`" dba@12306.com <${SYN_ERR_LOG}
  18. fi
  19. 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 备份恢复方案(一)的更多相关文章

  1. 中小型数据库 RMAN CATALOG 备份恢复方案(二)

    中小型数据库呈现的是数据库并发少,数据库容量小,版本功能受限以及N多单实例等特点.尽管如此,数据库的损失程度也会存在零丢失的情形.企业不愿意花太多的钱又要保证数据库的可靠稳定,可是苦煞了我这些搞DB的 ...

  2. RMAN catalog备份恢复方案

    对于数据库的稳定性,高可用,跨平台以及海量数据库的处理,Oracle 数据库通常是大型数据库和大企业的首选.尽管如此,仍然不乏很多中小企业想要品尝一下Oracle腥味,因此在Oracle环境中也有不少 ...

  3. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  4. 阿里RDS数据库 全量备份恢复到本地MYSQL

    阿里RDS数据库 全量备份恢复到本地MYSQL   1.首先下载RDS的全量备份 下载完成后上传到服务器备用   2.安装MySQL 5.6 首先删除机上其他的MySQL版本 检查系统是否安装其他版本 ...

  5. RMAN常用备份恢复命令汇总

    RMAN命令 1.独立命令  RMAN>shutdown immediate  RMAN>startup  RMAN>backup format 'd:\backup\%d_%s.b ...

  6. MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战

    本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...

  7. 怎样使用 RMAN 增量备份恢复 data guard log gap(日志断档)

    主库查询最小scn 信息: SQL> col current_scn for 999999999999999 SQL>  SELECT CURRENT_SCN FROM V$DATABAS ...

  8. Elasticsearch系列---生产数据备份恢复方案

    前言 生产环境中运行的组件,只要有数据存储,定时备份.灾难恢复是必修课,mysql数据库的备份方案已经非常成熟,Elasticsearch也同样有成熟的数据备份.恢复方案,我们来了解一下. 概要 本篇 ...

  9. MySQL实时在线备份恢复方案

    开源Linux 长按二维码加关注~ 上一篇:2020年MySQL数据库面试题总结 快照和复制技术的结合可以保证我们得到一个实时的在线MySQL备份解决方案. 当主库发生误操作时,只需要恢复备库上的快照 ...

随机推荐

  1. Codeforces Round #335 (Div. 2) C. Sorting Railway Cars 连续LIS

    C. Sorting Railway Cars   An infinitely long railway has a train consisting of n cars, numbered from ...

  2. Gradle Goodness: Rename Ant Task Names When Importing Ant Build File

    Migrating from Ant to Gradle is very easy with the importBuild method from AntBuilder. We only have ...

  3. hdu 4159 Indomie (DP,数学概率)

    推出数学公式: #include<stdio.h> #include<string.h> __int64 C(int m,int n) { __int64 tmp=; if(m ...

  4. Spring框架学习之第9节

    aop编程 aop(aspect oriented programming)面向切面(方面)编程,是所有对象或者是一类对象编程,核心是(在不增加代码的基础上,还增加新功能) 汇编(伪机器指令 mov ...

  5. C++虚函数的缺陷

    MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数内存开销太大.在Qt中也没有采用C++中的虚函数机制,原因与此相同,其实这里还有更深层次上的原因,大体说来,多态的底层实现机制只有 ...

  6. Android笔记——JDK实现WebService服务

    以天气预报为例,国家气象局计算的天气信息后在其服务器Server通过WebService对外暴露天气信息数据,客户端无论是java平台,ios平台,c#平台都可以通过WebService获取数据.体现 ...

  7. Mysql笔记——DML

    数据操纵语言DML(Data Manipulation Language),用户通过它可以实现对数据库的基本操作. ========================== 1 插入数据 语法:INSER ...

  8. POJ3020——Antenna Placement(二分图的最大匹配)

    Antenna Placement DescriptionThe Global Aerial Research Centre has been allotted the task of buildin ...

  9. java post 请求

    新公司的分词为post调用方式,以前还没用过post,这次上网查了下,比较简单,但还是写篇博客记录下,代码为网上找的,非原创. package com.chuntent.tool; import ja ...

  10. slot signal机制

    有一个比较 经典的实现:http://sigslot.sourceforge.net/很精简的 signal slot的实现,跨平台.webrtc项目在用,我在自己项目里也用了.这个源码有2000多行 ...