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
RMAN catalog备份恢复方案的更多相关文章
- 中小型数据库 RMAN CATALOG 备份恢复方案(二)
中小型数据库呈现的是数据库并发少,数据库容量小,版本功能受限以及N多单实例等特点.尽管如此,数据库的损失程度也会存在零丢失的情形.企业不愿意花太多的钱又要保证数据库的可靠稳定,可是苦煞了我这些搞DB的 ...
- 中小型数据库 RMAN CATALOG 备份恢复方案(一)
对于数据库的稳定性,高可用,跨平台以及海量数据库的处理,Oracle 数据库通常是大型数据库和大企业的首选.尽管如此,仍然不乏很多中小企业想要品尝一下Oracle腥味,因此在Oracle环境中也有不少 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- RMAN常用备份恢复命令汇总
RMAN命令 1.独立命令 RMAN>shutdown immediate RMAN>startup RMAN>backup format 'd:\backup\%d_%s.b ...
- 怎样使用 RMAN 增量备份恢复 data guard log gap(日志断档)
主库查询最小scn 信息: SQL> col current_scn for 999999999999999 SQL> SELECT CURRENT_SCN FROM V$DATABAS ...
- MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战
本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...
- Elasticsearch系列---生产数据备份恢复方案
前言 生产环境中运行的组件,只要有数据存储,定时备份.灾难恢复是必修课,mysql数据库的备份方案已经非常成熟,Elasticsearch也同样有成熟的数据备份.恢复方案,我们来了解一下. 概要 本篇 ...
- MySQL实时在线备份恢复方案
开源Linux 长按二维码加关注~ 上一篇:2020年MySQL数据库面试题总结 快照和复制技术的结合可以保证我们得到一个实时的在线MySQL备份解决方案. 当主库发生误操作时,只需要恢复备库上的快照 ...
- oracle rman catalog备份和恢复
1.丢失控制文件 启动数据库至nomount状态:restore controlfile from autobackup/restore controlfile from '+data/ba ...
随机推荐
- 父子进程间通信模型实现(popen)
0.FILE *popen(const char *command, const char *type); popen 函数相当于做了以下几件事: 1.创建一个无名管道文件 2. fork() 3.在 ...
- 找不到 com.google.zxing.ResultMetadataType 异常解决
在 https://github.com/zxing/zxing 下载二维码扫描 将 android 导入,code打成jar包运行时 报 06-14 23:43:08.690: E/AndroidR ...
- SQLite3中自增主键
SQLite清空表并将自增列归零 SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容. 但SQLite不支持这个语句.在SQLite中直接使用 DELETE FROM TableNa ...
- 【bzoj3110】[Zjoi2013]K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...
- iOS 10 的适配问题-b
随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使 ...
- 机器学习基石的泛化理论及VC维部分整理(第六讲)
第六讲 第五讲主要讲了机器学习可能性,两个问题,(1)\(E_{in} 要和 E_{out}\) 有很接近,(2)\(E_{in}\)要足够小. 对于第一个假设,根据Hoefding's Inequa ...
- Extjs4.2——Panel
一.Panel的border属性: 示例: Ext.create('Ext.panel.Panel', { title: 'Hello', width: 200, height:100, border ...
- js和HTML结合(补充知识:如何防止文件缓存的js代码)
来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(二) 使用html标签<script>可以把js嵌入到html页面中,让脚本 ...
- uva 11151
求最长回文串 就是将字符串翻转后求最长公子列..... #include <cstdio> #include <cstdlib> #include <algorithm ...
- jmeter 响应结果分析一
转自:http://www.cnblogs.com/Carrie_Liang/archive/2008/11/05/1327604.html Jmeter测试结果分析这一篇,我打算分成上下两部分.上篇 ...