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

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

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


Oracle&nbsp;牛鹏社

 

相关参考
    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)

相关文章
【YashanDB知识库】OM仲裁节点故障后手工切换方案和yasom仲裁重新部署后重新纳管数据库集群方案
本文介绍了主备数据库集群的部署、OM仲裁故障切换及重新纳管的全过程。首先通过解压软件包并调整安装参数完成数据库集群部署,接着说明了在OM仲裁故障时的手动切换方案,包括关闭自动切换开关、登录备节点执行切换命令。最后详细描述了搭建新的yasom仲裁节点以重新纳管数据库集群的步骤,如生成配置文件、初始化进程、执行托管命令等,确保新旧系统无缝衔接,保障数据服务稳定性。
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
114 9
【YashanDB 知识库】OM 仲裁节点故障后手工切换方案和 yasom 仲裁重新部署后重新纳管数据库集群方案
本文介绍了一主一备数据库集群的部署步骤。首先在OM节点上传并解压软件包至指定路径,随后通过调整安装参数、执行安装和集群部署完成数据库设置。接着,在主备节点分别配置环境变量,并查看数据库状态以确认安装成功。最后,针对OM仲裁故障提供了手动切换方案,包括构造故障场景、关闭自动切换开关及使用SQL命令进行主备切换,确保系统高可用性。
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
368 82
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。

热门文章

最新文章