问题背景

  • 适用情况:

    操作系统: redhat 6.5

    数据库: oracle 11g r2

    问题描述: failover后原主库无法恢复和启动或者丢失主备关系

  • 优点
  1. 不需要对primary数据库停机
  2. 执行简单
  • 实施前准备工作

  1.测试dumplicate

  2.测试环境数据库利用dumplicate重建stanby数据库

实施步骤

  • 备份新主库

注意备份脚本,应该备份到服务器的本地磁盘而不是带库。

rman_backup.sh备份本地脚本:

#!/bin/sh

#oracle environment...........

export ORACLE_BASE=/data/oracle/app

export ORACLE_HOME=$ORACLE_BASE/oracle/product/11.2.0/dbhome_1

export ORACLE_SID=orcl_stby

export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

day=`date -u +%Y%m%d `

cd /data/bak/rman_backup

rman target / nocatalog log=/data/bak/rman_backup/rman_backup$day.log <<EOF

crosscheck archivelog all;

crosscheck backup;

delete noprompt expired archivelog all;

delete noprompt expired backup;

run{ allocate channel c1 type disk;

allocate channel c2 type disk;

backup database format '/data/bak/rman_backup/%d_full_%T%s%p.bck';

sql "alter system archive log current";

backup archivelog all format '/data/bak/rman_backup/%d_arc_%T%s%p.bck';

backup current controlfile format = '/data/bak/rman_backup/controlfile%T%s%p.bck';

release channel c1;

release channel c2;

}

exit;

EOF

  • 删除原主库

这一步以后,后面步骤都约定改原主库叫“备库”,新主库叫“主库”。

1.关闭数据库;

SQL>shutdown immediate;

2.以restrict方式重新打开数据库,并启动到mount状态;

sqlplus / as sysdba

SQL>startup restrict mount;    --> # 只有拥有sysdba角色权限的用户才可以登录数据库,普通用户则不可以(防止有其他用户对数据库进行访问)

3.再次确认数据库名,以防止误删除,本次要删除的是orcl;

SQL>select name from v$database;

4.使用drop database语句;

SQL>drop database;  --> # (10g及以后版本适用)
                    # 它只删除了数据库文件(控制文件、数据文件、日志文件、spfile),但并不删除$ORACLE_BASE/admin/$ORACLE_SID目录下的文件 也不会删除初始化参数文件及密码文件,归档日志也不会被删掉。

SQL> shutdown immediate;

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

SQL> exit

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

[oracle@uatecsdb ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 23 14:52:03 2017

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup restrict mount;

ORACLE instance started.

Total System Global Area 6747725824 bytes

Fixed Size                 2213976 bytes

Variable Size        5100275624 bytes

Database Buffers  1610612736 bytes

Redo Buffers           34623488 bytes

Database mounted.

SQL> select name from v$database;

NAME

---------

ORCL

SQL> drop database;

Database dropped.

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> exit

[oracle@uatecsdb ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 23 14:56:20 2017

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to an idle instance.

SQL>

  • 备库准备startup nomount

准备pfile配置文件,最好是原来构建DataGuard时创建的的pfile。

注意把pfile改成init$ORACLE_SID.ora的格式(initorcl.ora),并且放到/data/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/目录下:

SQL>startup nomount;

  • rman连接主库和备库

执行RMAN连接前,先确认以下几项是否有问题:

1.防火墙关闭

2.tnsnames.ora,各自服务器须能监听对方

3.sys密码最好一致

4.db_file_name_convert和log_file_name_convert,若目录不一致,pfile需要制定这两个参数

由于之前都构建过DataGuard所以,这几项在生产环境不受影响.

rman target sys/yourpassword@orcl_stby auxiliary sys/yourpassword@orcl

使用duplicate命令重建standby数据库

因为主备库的路径相同,使用下面命令:

RMAN>duplicate target database for standby from active database nofilenamecheck;

  • 验证数据库

打开备库:

SQL>alter database open;    #这一步可能报错,暂时不管,最后再测试是否可以open

SQL>CREATE SPFILE FROM PFILE='/data/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initorcl.ora';

SQL>select status from v$instance;

SQL>select open_mode from v$database;

查看主库:

SQL>select status from v$instance;

SQL>select open_mode from v$database;

查看GAP_STATUS

SQL>SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;

如果状态是DEFER

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2='ENABLE' SCOPE=BOTH;

启动实时同步:

SQL>alter database recover managed standby database using current logfile disconnect from session;

SQL>select process,thread#,status from v$managed_standby;

SQL>SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG;

SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE;

  • 恢复DMGRL关系

DGMGRL>show database verbose orcl;

查询数据库状态还是Database Status:SHUTDOWN

登录备库,启动dg_broker:

SQL> show parameter dg_broker_start;

NAME                                 TYPE                   VALUE

------------------------------------ ---------------------- ------------------------------

dg_broker_start                      boolean                FALSE

SQL> alter system set dg_broker_start = true scope=both;

System altered.

SQL>!ps -ef|grep dmon

  • 遗留疑问

本次测试仅仅持续了3个多小时,导致新归档了15个归档日志,duplicat完成后,启用LOG_ARCHIVE_DEST_STATE_2,只恢复了6个,虽然LOG各项指标检查没有问题,数据库也可以open,但是数据是否会存在一致性问题?

生产环境因为一个小时一个归档,整个操作来说3个小时就可以完成,所以倒不用担心日志缺失的问题。

  • 生产过程正式实施新发现和解决的问题

1.生产实施的时候发现主库log_archive_dest_2状态是INACTIVE,应该是上回failover后没有完整完成,所以导致主库丢失了log_archive_dest_2

SQL> SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;

STATUS     GAP_STATUS

--------- ------------------------

INACTIVE

然后执行以下SQL,补回log_archive_dest_2参数即可:

alter system set log_archive_dest_2='SERVICE=orcl LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl' scope=both;

gap状态变为RESOLVABLE GAP,切换日志后,即变为NO GAP。

2.BROKER主备数据库状态配置都不对,需要重建BROKER

a.删除原来的configuration

DISABLE FAST_START FAILOVER FORCE;

(1)观察器上

disable configuration;

remove database orcl;

remove database orcl_stby;

remove configuration;

(2)在两个库上

alter system set dg_broker_start = false scope=both;

show parameter broker;

重命名/data/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/下的

dr1orcl_stby.dat和dr2orcl_stby.dat文件

(3)在两个库上

alter system set dg_broker_start = true scope=both;

b.重建configuration

DGMGRL> create configuration DG_orcl as primary database is orcl_stby connect identifier is orcl_stby;

DGMGRL> add database orcl as connect identifier is orcl maintained as physical;

DGMGRL> show database orcl_stby;

DGMGRL> show database orcl;

DGMGRL> show database verbose orcl_stby;

DGMGRL> edit database 'orcl' set property 'ArchiveLagTarget'='0';

DGMGRL> edit database 'orcl' set property 'LogArchiveMinSucceedDest'='1';

DGMGRL> edit database 'orcl_stby' set property 'DelayMins'='0';

DGMGRL> edit database 'orcl' set property 'DelayMins'='0';

DGMGRL> enable configuration;

DGMGRL> show configuration;

c.启用FAST_START FAILOVER

DGMGRL> EDIT CONFIGURATION SET PROPERTY FastStartFailoverLagLimit=1800;

DGMGRL> EDIT CONFIGURATION SET PROPERTY FastStartFailoverThreshold = 15;

GMGRL> EDIT DATABASE orcl_stby SET PROPERTY FastStartFailoverTarget='orcl';

Property "faststartfailovertarget" updated

DGMGRL> EDIT DATABASE orcl SET PROPERTY FastStartFailoverTarget='orcl_stby';

Property "faststartfailovertarget" updated

SHOW DATABASE ORCL LOGXPTMODE

SHOW DATABASE ORCL_STBY LOGXPTMODE

EDIT DATABASE ORCL SET PROPERTY LOGXPTMODE='SYNC';

EDIT DATABASE ORCL_STBY SET PROPERTY LOGXPTMODE='SYNC';

EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;

ENABLE FAST_START FAILOVER;

SHOW FAST_START FAILOVER;

SHOW CONFIGURATION VERBOSE;

利用rman duplicate重建oracle dataguard standby数据库的更多相关文章

  1. [Oracle][DataGuard]Standby数据库文件有损坏时的处理方法

    需要参考: [Oracle]Recovering the primary database's datafile using the physical standby, and vice versa ...

  2. Oracle Dataguard Standby Redo Log的两个实验

    在Data Guard环境中,Standby Redo Log是一个比较特殊的日志类型.从最新的DG安装指导中,都推荐在Primary和Standby端,都配置Standby Redo Log. 简单 ...

  3. duplicate命令创建physical standby数据库报RMAN-03015 ORA-17628

    The following error is reported trying to create a Physical Standby database using "duplicate f ...

  4. Oracle 11gR2 使用RMAN Duplicate复制数据库

    Oracle 11gR2 使用RMAN Duplicate复制数据库     前言:     上周刚做完一个项目,用户要求RAC的数据库可以自己主动备份到另外一个单节点上,单节点可以正常拿起来就能用. ...

  5. Oracle Dataguard的原理与基本配置

    最近集团在做灾备方案,用于Oracle的高可用性,在不影响主库性能的前提下,我们选择使用DG的"最大性能"模式.   DG是Oracle数据库自带的数据同步功能,其基本原理是将日志 ...

  6. Oracle DataGuard搭建(二)

    三.配置备库 创建catalog数据库 用dbca创建数据库,用oracle自带模板,不用em,启用归档,同一管理密码oracle,global name:dbcat1.node249.gewara, ...

  7. Oracle DataGuard 11g 双机实验

    |操作系统 | release 6.7 | release 6.7 | |主机名 | stuaapp01 | stuaapp02 ||IP | 192.168.20.234 | 192.168.20. ...

  8. 9. Oracle DataGuard的介绍

    一. Oracle DataGuard简介 Oracle DataGuard:简称DG.是由一个Primary Database(主库)和一个或者多个Standby Database(备库)组成.对O ...

  9. ORACLE Physical Standby DG搭建

    主库: 一:强制force logging: alter database force logging; 二:开启主库的归档模式 三:主库添加standby redo log,比redo日志组多一组: ...

随机推荐

  1. 洛谷题解 P1315 【观光公交】

    这道题很多人都用的模拟(或者暴力),今天我就写一个"标准"的贪心发给大家.(我这段代码差点超时···也差点超内存···) 主要思路:通过贪心求得最小值即可,把加速器用到乘客最多的两 ...

  2. iBATIS typeHandler selectKey

    typeHandler 是针对把数据库里面的某列的数据类型转换的应用程序中的数据类型,简单的说就是把 type=>dbType  反之把dbType=>type. 例如数据库某列的内容是l ...

  3. Datediff的使用(统计本日,昨日,本周,本月)

    //统计本日,昨日,本周,本月添加的产品总数 //日期            DateTime DT = DateTime.Now;            string day=DT.Date.ToS ...

  4. ORACLE11G R2 RAC的进程启动流程

    简要说明ORACLE11GR2 RAC的进程启动流程: 1.启动流程概览图: 二.RAC启动流程的梳理: 第一层:OHASD 启动:(OHASD派生) 1.CSSDAGENT负责启动CSSD的AGEN ...

  5. EDF转TXT,EDF转mat,rec转TXT eeg

    https://files.cnblogs.com/files/myohao/edfsample.zip

  6. JavaScript中为什么使用立即执行函数来封装模块?

    最近在学习JavaScript基础,在学习到面向对象编程时,学习到在JavaScript中实现模块化的方法,其中一个重要的点是如何封装私有变量. 实现封装私有变量的方法主要是: 使用构造函数 func ...

  7. 《HTTP权威指南》读书笔记(一)

    1.因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都搭上了名为MIME类型的数据格式标签.WEB服务器会为所有HTTP对象数据附加一个MIME类型.当Web浏览器从服务器中 ...

  8. ORB_SLAM2安装

    进入工程目录,我们发现有两个sh文件,一个是build.sh另一个是build_ros.sh. 这两个都可以进行ORB_SLAM2的安装,我们先来看一下build.sh echo "Conf ...

  9. 约瑟夫斯问题-java版数组解法和链表解法

    10个人围成一圈,从1到10编号,从1开始数,数到3或3的倍数的位置,则该位置的人出局,求最后剩下哪一个号? 数组解法: 数组存放数组:a[10]存在1到10编号人 数组遍历到尾部又从头遍历:遍历数组 ...

  10. laravel session使用 转自http://blog.csdn.net/angle_hearts/article/details/53923782

    use Symfony\Component\HttpFoundation\Session\Session;//存储session $session = new Session;$session-> ...