Physical Standby Database Failover
1、物理standby failover 切换
故障转移时在一些糟糕的事情发生时执行的计划外事件,需要将生产库移动到DR站点。有意思的是,这时候人们通常忙来忙去,试图弄明白发生了什么,需要做些什么才能使数据库恢复过来。客户打来电话询问系统核实才能恢复,高级管理人员在走廊徘徊,追究是谁范了错误。对于DBA来说,没有什么事情比时空的备用站点更可怕,并且在需要备用站点前,我们也不知道它是否奏效。如果故障转移失败,DBA们将会失去奖金,甚至职业生涯因此中断。
所以我们在系统建立初期,就要有周密的后援计划。一旦出现问题,做到手不忙,心不慌。大显身手的时候到了。但此前需要有一番详尽实验做支撑,亲自动手很重要!
Step 1冲刷任何没有从主数据库发送到备用数据库的的重做
如果主数据库不能被Mounted,那可能就要将没有发送的归档和当前的日志从主库发送到备用数据库。如果这个操作时成功的,零数据丢失将是可能的,即使它没有在最大保护模式中。
确信redo apply是活动的在目标备用数据库上。
Mount,不要要打开主数据库。如果主数据库不能被mounted,跳至step 2.
执行如下SQL语句在primary database:
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;
Target_db_name为目标备份库的DB_UNIQUE_NAME,它将会受到冲刷过来的重做。该语句只在11G R2中被支持。
如果该语句完成却没有错误,跳至step 5.如果执行过程出错,或者它没有有停下,因为你不能等待很长时间直到这个语句执行完,继续 step 2.
Step 2核实备份库中最近从主数据库发送过来的归档日志文件。
查询V$ARCHIVED_log视图在目标备份库中,获取每个线程实例归档过来的最大序列号。
例如:
SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) over(partition by thread#) as last from v$archived_log;
THREAD LAST
---------- ----------
1 517
2 412
如果可能,拷贝每个主数据库归档重做日志到备份库,如果那些日志不在备份库上。并且注册它。它必须被做在每个重做线程上。
例如:
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '<from your list>';
Step 3认定和处理任何的归档重做日志间隔(archived redo log gaps)
查询V$archive_gap视图在目标备份库上,决定这是否有任何的重做间隔。
For example:
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
1 90 92
可以看到存在重做间隔,需要线程1归档来的90、91、92号日志,如果可能,拷贝这些缺失的归档重做文件到目标重做数据库上。然后在每个线程节点上注册他们。
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
Step 4重复步骤3直到重做间隔被解决
步骤3中仅仅是最高的间隔。在解决间隔后,你必须重复这个查询直到间隔没有。
如果间隔没有被解决,一些数据的丢失将会丢失在故障转移期间。
Step 5停止Redo Apply
执行如下SQL语句在目标备份库上:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Step 6完成所有重做数据的应用
执行如下SQL语句在目标备份库上:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
如果该语句执行没有错误,行进到Step 7.
如果错误发生,一些接受到的重做数据没有被应用。尝试解决这些错误的原因并且重新确定这些错误状态在行进至下一步之前。
如果错误状况不能解决,故障切换也能进行(伴随一些数据丢失),执行下列SQL语句在standby databse:
SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
此时是进行强制的切换,跳至步骤9,当这个激活状态被完成了。
Step 7确定目标备份库已经准备变成了一个主数据
执行如下语句确认数据库状态:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TOPRIMARY
1 row selected
如果这个值是TOPRIMARY或者SESSIONS ACTIVE表明主数据库是可以切换成Standby role的。如果是其他的值将不可以执行切换,
Step 8切换物理备份库到主数据库角色
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
Step 9打开新的主数据库
SQL> ALTER DATABASE OPEN;
Step 10备份新的主数据库
Oracle推荐对新的主数据库做一个全库备份。
Step 11在物理standby database上重启Redo Apply
For example:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE -
> DISCONNECT FROM SESSION;
Step 12在可选择的情况下,重建失败的主数据库。
在故障切换后,源主数据库可能转换成一个物理standby数据库或者从新的主数据库的备份重建。
一旦源主数据库以Standby Role在运行,一次切换又可以把它重建回Primary role。
2、FAILOVER切换实录
SQL> alter system flush redo to 'HAINAN';
alter system flush redo to 'HAINAN'
*
ERROR at line 1:
ORA-16442: ALTER SYSTEM FLUSH REDO TO STANDBY succeeded, but some redo has not
been applied.
以上的步骤要花费N久的时间等待。
查看主备库上的alert日志:
主库上有大量的如下日志:
Fri Jul 12 11:23:22 2013
ARC4: Archiving disabled
LOG_ARCHIVE_DEST_2 is a potential flush redo target
LOG_ARCHIVE_DEST_2 is a potential flush redo target
LOG_ARCHIVE_DEST_2 is a potential flush redo target
LOG_ARCHIVE_DEST_2 is a potential flush redo target
备库上有如下的大量日志:
Fri Jul 12 11:23:30 2013
Standby switchover readiness check: Checking whether recoveryapplied all redo..
Physical Standby applied all the redo from the primary.
Standby switchover readiness check: Checking whether recoveryapplied all redo..
Physical Standby applied all the redo from the primary.
由此可见,应该是主库对备库的每个归档进行校验,要花费大量时间的。所以在系统建立初期,就要考虑的两条重要信息是公司需要实现的恢复点目标(recovery point objective,RPO)和恢复时间目标(recovery time objective,RTO)。
虽然看到了succeeded字样,但还是按照有错误处理,官网搜索了ORA-16442下,竟然没有结果,新特新还是有缺点的,往下走。
SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) over(partition by thread#) as last from v$archived_log;
THREAD LAST
---------- ----------
2 415
1 519
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
no rows selected
主库上查询,得到同样的结果,说明日志均被应用,由于我应用了standby log,并且开启了real time 应用,实际中丢失数据的概率大大被降低了,这也是oracle推荐的用法。
SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) over(partition by thread#) as last from v$archived_log;
THREAD LAST
---------- ----------
2 415
1 519
备库上继续执行如下操作:
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
no rows selected
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
Database altered.
SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
Database altered.
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
NOT ALLOWED
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN
*
ERROR at line 1:
ORA-01109: database not open
SQL> select status from V$instance;
STATUS
------------
MOUNTED
SQL> alter database open;
Database altered.
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN
*
ERROR at line 1:
ORA-16109: failed to apply log data from previous primary
SQL> select status from V$instance;
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
FAILED DESTINATION
SELECT SWITCHOVER_STATUS,OPEN_MODE,DATABASE_ROLE,PROTECTION_MODE FROM V$DATABASE;BASE;
SWITCHOVER_STATUS OPEN_MODE DATABASE_ROLE PROTECTION_MODE
-------------------- -------------------- ---------------- --------------------
FAILED DESTINATION READ WRITE PRIMARY MAXIMUM PERFORMANCE
查看最初的是NOT ALLOWED,切换后变成了FAILED DESTINATION,但数据库可以write并且是primary的了。
重启数据库:
SQL> startup force
ORACLE instance started.
Total System Global Area 943669248 bytes
Fixed Size 2234000 bytes
Variable Size 264243568 bytes
Database Buffers 671088640 bytes
Redo Buffers 6103040 bytes
Database mounted.
Database opened.
SQL> select status from v$instance;
STATUS
------------
OPEN
查看alert日志:
Fri Jul 12 14:05:14 2013
PING[ARC5]: Heartbeat failed to connect to standby 'beijing'. Error is 16009.
PING[ARC5]: Heartbeat failed to connect to standby 'beijing'. Error is 16009.
PING[ARC5]: Heartbeat failed to connect to standby 'beijing'. Error is 16009.
Fri Jul 12 14:06:14 2013
PING[ARC5]: Heartbeat failed to connect to standby 'beijing'. Error is 16009.
PING[ARC5]: Heartbeat failed to connect to standby 'beijing'. Error is 16009.
出现大量的ORA-16009错误,它不断的去尝试连接beijing这个standby database,由于我做的是failover,此时standby是关闭的。
SQL> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2 string SERVICE=beijing ASYNC VALID_FO
R=(ONLINE_LOGFILES,PRIMARY_ROL
E) DB_UNIQUE_NAME=beijing
SQL> alter system set log_archive_dest_2='' scope=spfile;
System altered.
SQL> startup force
SQL> show parameter log_archive_dest_2
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2 string
取消远程归档路径,错误消除。
Physical Standby Database Failover的更多相关文章
- Flashing Back a Failed Primary Database into a Physical Standby Database(闪回FAILOVER失败的物理备库)
文档操作依据来自官方网址:https://docs.oracle.com/cd/E11882_01/server.112/e41134/scenarios.htm#SBYDB4888 闪回FAILOV ...
- 【原】Configuring Oracle Data Guard In Physical Standby Database
作者:david_zhang@sh [转载时请以超链接形式标明文章] http://www.cnblogs.com/david-zhang-index/p/5042640.html参照文档:https ...
- Creating a Physical Standby Database 11g
1.Environment Item Primary database standby database Platform Redhat 5.4 Redhat 5.4 Hostname gc1 gc2 ...
- 转 Logs are not shipped to the physical standby database
http://www.oracle-ckpt.com/dataguard_troubleshoot_snapper/ ######sample primay scripts: spool dg_Pri ...
- Oracle_Data_Gard Create a physical standby database
创建之前要对DG的环境有一个总体的规划和了解. 规划 IP 192.168.3.161 192.16 ...
- ORACLE 11gR2 DG(Physical Standby)日常维护02
环境:RHEL 6.5 + Oracle 11.2.0.4 三.监控DG的状态 3.1监控DG备库的状态 3.2监控主库传输日志链路的状态 四.备库切换为snapshot standby 4.1备库切 ...
- 聊聊Oracle 11g的Snapshot Standby Database(上)
Oracle 11g是Data Guard的重要里程碑版本.在11g中,Active DataGuard.Advanced Compression等特性大大丰富了Data Guard的功能和在实践领域 ...
- oracle 10g standby database 实时应用 redo 数据
-------physical standby database: real-time apply 须要配置 standby redo log: 启用实时应用, 日志应用服务会直接应用接收的redo ...
- Data Guard Physical Standby - RAC Primary to RAC Standby 使用第二个网络 (Doc ID 1349977.1)
Data Guard Physical Standby - RAC Primary to RAC Standby using a second network (Doc ID 1349977.1) A ...
随机推荐
- MVC验证10-到底用哪种方式实现客户端服务端双重异步验证
原文:MVC验证10-到底用哪种方式实现客户端服务端双重异步验证 本篇将通过一个案例来体验使用MVC的Ajax.BeginForm或jQuery来实现异步提交,并在客户端和服务端双双获得验证.希望能梳 ...
- Pki原则
核心提示: 公开密钥和公开密钥证明书,产生的私钥client要么server证书.加密的公共密钥才能解密私钥文件只.私钥只能解密公开的加密文件.公众认为,它是开放的.所有的人都能够得到它.私人还表明, ...
- u-boot学习(两):u-boot简要分析
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 看到不错的文章.不要加入收藏夹, ...
- js获取编辑框游标的位置
代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- Repository在DDD中的应用
Repository在DDD中的应用2014-10-09 08:55 by Jesse Liu, 98 阅读, 0 评论, 收藏, 编辑 概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值 ...
- cocos2d的-X- luaproject的LUA脚本加密
2014/1/26 更新 近期又发现了一个非常easy的方法,事实上coco2dx已经给我们提供设置loader的方法. 注意:有个局限性,在非android平台下调用pEngine->exec ...
- 老调重弹--面向对象设计原则--S.O.L.I.D设计原则
SRP - 单一职责原则 全称:Single Responsibility Principle 定义:每一个上下文对象(类.函数.变量等等)的定义应该仅仅包含单一的职责 描述:对象提供单一职责的高度封 ...
- [转]C# and the using Statement in 3 seconds and a bug in Reflector
Using() Statement in 3 seconds and a bug in Reflector The boring, known accross the board definition ...
- DEBUG不能进断点 “exited with code -1073741515”
需要把相关的DLL文件加入到项目对应的DEBUG路径下 IDE :Qt Creator 系统:Win7
- Bootstrap 网格系统
自版本 2.3.2 起,Bootstrap 提供了两种类型的网格,默认网格系统和流动网格系统.默认的网格系统是 940px 宽和 12 列.本文主要讲解第一种. 首先让我们看,怎么来应用默认网格系统 ...