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

相关参考
    RMAN 数据库克隆文件位置转换方法

基于RMAN的异机数据库克隆(rman duplicate)

基于 RMAN 的同机数据库克隆

基于用户管理的同机数据库克隆

基于RMAN从活动数据库异机克隆(rman duplicate from active DB)

RMAN duplicate from active 时遭遇 ORA-17627 ORA-12154

Oracle 冷备份

Oracle 热备份

Oracle 备份恢复概念

Oracle 实例恢复

Oracle 基于用户管理恢复的处理

SYSTEM 表空间管理及备份恢复

SYSAUX表空间管理及恢复

Oracle 基于备份控制文件的恢复(unsing backup controlfile)

RMAN 概述及其体系结构

RMAN 配置、监控与管理

RMAN 备份详解

RMAN 还原与恢复

RMAN catalog 的创建和使用

基于catalog 创建RMAN存储脚本

基于catalog 的RMAN 备份与恢复

RMAN 备份路径困惑

自定义 RMAN 显示的日期时间格式

只读表空间的备份与恢复

Oracle 基于用户管理的不完全恢复

理解 using backup controlfile

使用RMAN实现异机备份恢复(WIN平台)

使用RMAN迁移文件系统数据库到ASM

基于Linux下 Oracle 备份策略(RMAN)

Linux 下RMAN备份shell脚本

使用RMAN迁移数据库到异机

RMAN 提示符下执行SQL语句

Oracle 基于 RMAN 的不完全恢复(incomplete recovery by RMAN)

rman 还原归档日志(restore archivelog)

中小型数据库 RMAN CATALOG 备份恢复方案(一)相关推荐

  1. Green Plum 非并行备份恢复方案

    Green Plum 非并行备份恢复方案 环境 centos 7 主 145.170.41.153(master) root/123456 145.170.41.154(segment) root/1 ...

  2. oracle日志备份少数据库,oracle 账号锁定日志Oracle数据库全量备份恢复和部分备份恢复...

    Oracle数据库全量备份恢复和部分备份恢复 今天又遇到了Oracle数据库序列的问题,索性来个全库的备份和恢复.如下 imp/exp 方式 表模式备份: ­ oracle@sencloudServe ...

  3. mysql数据库备份注意,Tips: MySQL数据库使用mysqldump备份恢复时的注意事项

    Tips: MySQL数据库使用mysqldump备份恢复时的注意事项背景mysqldump采坑点1. -E, -R, --triggers2. drop table3. --set-gtid-pur ...

  4. “免费”容器存储及备份恢复方案

    云原生时代为什么还需要本地存储? 云原生时代,对于有存储应用的容器化上云,一般的解决思路是"计算存储分离",计算层通过容器技术实现弹性伸缩,而相应的存储层也需要配合进行" ...

  5. Kubernetes 上免费的容器存储及容灾备份恢复方案

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 云原生时代为什么还需要本地存储? 云原生时代,对于有存储应用的容器化上云,一般的解决思路是"计算存储分离 ...

  6. 赛门铁克新版备份恢复方案Backup Exec 15 知多少

    话题背景: 继支付宝光纤5月27日被挖断断网后,携程在第二天也遭遇不明攻击,网站和App陷入瘫痪,无法正常使用.事故频发的5月再一次为企业敲响了警钟,之前并不怎么被人提起的备份容灾能力,也引起了大家的 ...

  7. 数据库备份/恢复方案

    利用SQL语言,实现数据库的备份/恢复的功能 体现了SQL Server中的四个知识点: 1.   获取SQL Server服务器上的默认目录 2.   备份SQL语句的使用 3.   恢复SQL语句 ...

  8. OCP学习——数据库整库备份恢复实验

    数据库版本信息:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.7.0.0.0 一. ...

  9. oracle catalog表,RMAN catalog备份

    Oracle开启归档模式 1.开启归档 sqlplus>shutdown immediate;(启动归档前先要停止数据库) sqlplus>startup mount;(数据库以mount ...

最新文章

  1. 理清那么多个OO(面向对象)
  2. 4.4MSSQLServer常用版本介绍
  3. Django Mysql SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
  4. Maven问题总结 - 2
  5. 春节特惠活动┃不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...
  6. 【Shiro】Unsatisfied dependency expressed through method 'securityManager' parameter 3
  7. 二分法python上机实验报告_二分查找-Python刷题笔记
  8. Selenium3+python 加载Firefox配置
  9. python包的使用(一)——WordCloud词云
  10. 【Codeforces Round #291 (Div. 2) C】Watto and Mechanism【Trie树、Hash】
  11. 基于python的数据挖掘实验报告_数据挖掘实验报告
  12. 手机怎么投屏到电脑?小技能分享
  13. 计算机添加启动程序,电脑如何设置开机启动项
  14. QML Label/Text 文本居中显示
  15. AWS中负载均衡器类型
  16. 零基础计算机入门,分享人人可以参考的路线,私藏的干货视频和书单,为你的程序员生涯助力,呐喊!
  17. 企业微信上传临时素材文件
  18. 控制IE浏览器升级降级
  19. ​LeetCode刷题实战623:在二叉树中增加一行
  20. MySQL的索引是如何实现的

热门文章

  1. 计算机二级c语言学后感,计算机等级考试心得体会
  2. php 视频设置参数设置,AnyChat SDK知识中心 - 如何设置合适的视频质量参数?
  3. 铜线宽度与通过电流的关系
  4. Fundebug上线了!
  5. 有没有什么录音翻译软件?快来看看这篇文章
  6. Linux服务器 上传web后验证码乱码问题解决
  7. matlab中偶分量怎么表示,如何在matlab中画出一个函数的奇分量偶分量
  8. IDEA 常用快捷键以及调试
  9. 09-Node.js—express框架
  10. scala调用java可变参数函数