ADG架构搭建3 -- 一主一备ADG主备切换

article/2025/9/26 17:06:06

在这里插入图片描述
本文接该系列文章的上一篇:ADG架构搭建2 – 搭建一主一备ADG架构


前言

Oracle Dataguard的角色转换包含两类:Switchover和Failover。Switchover指主备之间角色转换,主库降为备库,备库升级为主库。而failover则是指主库出现问题时,备库切换为主库。

正文

一、物理Standby的Switchover(无损切换)

Switchover,无损切换一般是用用户手动触发或有计划的进行触发来进行主从库切换,比如软硬件升级等需求。
其执行分为两个阶段。第一步,primary库转换为standby角色;第二步,standby库转换为primary角色。

1.在主库(ruiadg1)执行
查询此时数据库的角色:

SQL> select name,DATABASE_ROLE from v$database;NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PRIMARY

检查归档日志有没有中断:

SQL> select status, GAP_STATUS from v$archive_dest_status where dest_id=2;STATUS    GAP_STATUS
--------- ------------------------
VALID      NO GAP

检查Primary库是否支持Switchover操作:

SQL> select switchover_status from v$database;SWITCHOVER_STATUS
--------------------
TO STANDBY

若得到“SESSION ACTIVE”或“TO STANDBY”信息就表明Primary库支持转换为Standby角色,否则就需要检查参数文件。

切换当前主库为备库:
切换完成后,数据库会被关闭

SQL> alter database commit to switchover to physical standby;

启动数据库到mount状态:
当前已经变成备库

SQL> startup mount

查询切换状态:
此时状态发生变化

SQL> select switchover_status from v$database;SWITCHOVER_STATUS
--------------------
RECOVERY NEEDED

查询此时数据库的角色:
角色为:PHYSICAL STANDBY

SQL> select DATABASE_ROLE from v$database;DATABASE_ROLE
----------------
PHYSICAL STANDBY

2.在备库(ruiadg2)执行
查数据库的角色:
在切换之前数据库的角色是:PHYSICAL STANDBY

SQL> select name,DATABASE_ROLE from v$database;NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PHYSICAL STANDBY

检查Standby库是否支持转换为Primary角色:
此时因为原来的主库已经切换到的备库,所以这个备库可以切换到主库了,状态为:TO PRIMARY

SQL> select switchover_status from v$database;SWITCHOVER_STATUS
--------------------
TO PRIMARY

此时待转换的Standby库switchover_status列值应该是“TO PRIMARY“如果不是就需要检查初始化参数文件。

切换备库到主库:
一旦切换到主库,数据库此时为mount状态

SQL> alter database commit to switchover to primary;

查数据库的角色:

SQL> select name,DATABASE_ROLE from v$database;NAME      DATABASE_ROLE
--------- ----------------
RUIADG      PRIMARY

打开数据库:

SQL> alter database open;

3.在新的备库(ruiadg1)执行
打开新的备库到只读:

SQL> alter database open;

在新的备库开启日志的应用:(启用Real-Time)

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

再次查询数据库的打开模式:
是:READ ONLY WITH APPLY

SQL> select open_mode from v$database;OPEN_MODE
--------------------
READ ONLY WITH APPLY

主备切换完成,在新的主库做数据变更,在新的备库做数据校验,是否同步。

4.主备库同步检查
在主库(ruiadg2)建表并插入数据

SQL> create table test1 (name varchar(20),age int);
SQL> insert into test1 values ('rui',20);
SQL> commit;

在主库(ruiadg2)手动切log

SQL> alter system switch logfile;

在备库(ruiadg1)查看数据同步状况

在主备库查看log是否同步

SQL>select max(sequence#) from v$archived_log;MAX(SEQUENCE#)
--------------16

此处检查两个结果值是否一致。
也可以直接到/home/oracle/arch_log下查看新生成的归档日志是否一致。

 

二、物理Standby的Failover(灾难性恢复)

Failover一般表示Primary数据库瘫痪或至少无法启动,这种转换已不能在Primary数据库上做任何操作,只要更改Standby数据库的角色为primary

注意:
1)Failover之后原primary数据库默认不再是Data Guard配置的一部分。
2)对于多Standby的情況,其他standby数据库不直接参与Failover的过程,因此这些数据库不需要做任何操作。
3)一般情況下,新的primary数据库配置后,要建立新的Standby数据库。

1.在主库(ruiadg2)执行
把主库关闭,模拟为主库损坏:

SQL> shutdown immediate;

2.在备库(ruiadg1)执行
检查确认是否有日志没有同步:

SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;no rows selected

沒有返回结果就说明归档日志是连续的。
如果此查询有记录,需要把这些日志从主库拷贝到备库,并注册到数据库(加入到数据字典)中:

SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'xxx';

查询日志是否应用到最新状态:

SQL> select distinct thread#,applied,max(sequence#) over(partition by thread#) a from v$archived_log;THREAD#      APPLIED    A
---------- ----------1        YES    44

查看主备库日志序列号是否一致,若无法查询主库,就只能使用当前的归档日志文件了。

在备库做失败切换:

SQL> alter database recover managed standby database finish ;

SQL> alter database recover managed standby database finish force; 

Force关键字会停止当前活动的RFS进程,以便立即执行Failover。

切换备库的角色为primary:

SQL> alter database commit to switchover to primary;

启动新的主库(ruiadg1):

SQL> alter database open;

查看新主库的当前角色:

SQL> select name,DATABASE_ROLE from v$database;NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PRIMARY

3.Failover后的检查

将恢复后的原故障主库调整为备库

启动恢复后的原主库:

SQL> startup

说明:
如果此时在主库插入数据,然后手动切换log,会发现archive log会传至备库,但是未被应用。
而且进行如下查询,结果如下:

SQL> select name,DATABASE_ROLE from v$database;NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PRIMARYSQL> select status, GAP_STATUS from v$archive_dest_status where dest_id=2;STATUS    GAP_STATUS
--------- ------------------------
ERROR     RESOLVABLE GAPSQL> select switchover_status from v$database;SWITCHOVER_STATUS
--------------------
FAILED DESTINATIONSQL>  alter database commit to switchover to physical standby;alter database commit to switchover to physical standby
*
ERROR at line 1:
ORA-16416: No viable Physical Standby switchover targets available

正确处理方式如下:

--启动数据库至nomount状态
SQL> shutdown immediateSQL> startup nomount--同步数据
$  rman target sys/rui@ruiadg1 auxiliary sys/rui@ruiadg2RMAN> DUPLICATE TARGET DATABASE for standby FROM ACTIVE DATABASE nofilenamecheck;--启动数据库
SQL> alter database open;SQL> alter database recover managed standby database disconnect from session;--查看数据库当前角色
SQL> select name,DATABASE_ROLE from v$database;NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PHYSICAL STANDBY

4.数据同步测试
在主库(ruiadg1)建表并插入数据

SQL> create table test1 (name varchar(20),age int);
SQL> insert into test1 values ('rui',23);
SQL> commit;

在主库(ruiadg1)手动切log

SQL> alter system switch logfile;

在备库(ruiadg2)查看数据同步状况

在主备库查看log是否同步

SQL>select max(sequence#) from v$archived_log;

经测试,可实现数据同步


至此,已完成ADG的Switchover和Failover切换演示。
希望这篇文章能给大家带来帮助。

在这里插入图片描述


上一篇:ADG架构搭建2 – 搭建一主一备ADG架构
下一篇:ADG架构搭建4 – 一主两备ADG架构搭建


http://chatgpt.dhexx.cn/article/9m56X58l.shtml

相关文章

RAC+ADG(单节点ADG)

RACADG有两种存储数据文件的形式,一个是将DG的数据文件放在ASM上,另一个是将数据文件放在本地磁盘上 本实验做的是数据放在本地磁盘上。 在搭建RACDG之前,请确保RAC是没有问题的 1.检查集群状态 grid用户下执行: crsctl status r…

ADG架构搭建1--Oracle安装

本系列文章将会带领大家从零完成一个Oracle ADG架构的搭建。 本片文章为系列文章的第一篇。 前言 本文将带领大家完成两台服务的Oracle安装。 正文 版本说明: Oracle版本 Oracle Database 12c Release 1 (12.1.0.2.0) - Enterprise Edition 操作系统版本 Red Hat …

Oracle ADG 与 DG 的区别

首先,DG(Data Guard,数据卫士)不是一个备份恢复的工具,然而,DG却拥有备份的功能,在物理DG下它可以和主库一模一样,但是它存在的目的并不仅仅是为了备份恢复数据,应该说它…

ADG架构搭建5 -- 一主两备ADG主备切换

本文接该系列文章的上一篇:ADG架构搭建4 – 搭建一主两备ADG架构 前言 在《ADG架构搭建3 – 一主一备ADG主备切换》一文中,已经带领大家完成了一主一备ADG的主备切换,相信大家对该部分内容已有所了解。本文将对《ADG架构搭建4 – 搭建一主两…

第一章 ADG基本知识

Oracle Data Guard 配置可以包含一个主数据库和多达 30 个目标。 备用数据库是主数据库的事务一致副本。 当主数据库是 CDB 时,代理配置中的所有备用数据库也必须是 CDB。 备用数据库的类型如下: 物理备用数据库 提供物理上相同的主数据库副本&#xf…

完成端口使用总结

前言 本文不是全面介绍完成端口的,只是简单介绍了一下完成端口和几个常用概念。本文主要关注完成端口关闭时资源释放问题。 基础介绍 完成端口——可能是Win32下最复杂的一种I/O模型,Win32下最复杂的内核对象。它通过指定数量的线程对重叠I/O请求进行管理,以便为已经完成的…

WinSock完成端口I/O模型

关于重叠I/O,参考《WinSock重叠I/O模型》;关于完成端口的概念及内部机制,参考译文《深度探索I/O完成端口》。 完成端口对象取代了 WSAAsyncSelect 中的消息驱动和 WSAEventSelect 中的事件对象,当然完成端口模型的内部机制要比 WS…

Windows 完成端口编程

Windows 完成端口编程 本文为转载, 原文地址: http://xingzhesun.blogbus.com/logs/3925649.html Table of Contents 1 基本概念 2 OVERLAPPED数据结构 3 完成端口的内部机制 3.1 创建完成端口 3.2 完成端口线程的工作原理 3.3 线程间数据传递 3.4 线程的安全退出 1 基本…

完成端口IOCP详解

本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚….. 这篇文档我非常详细并且图文并茂的介绍了…

Win socket编程--IOCP完成端口模型

引言 要想编写一个高性能的服务器应用程序,必须实现一个高效的线程模型。让太少或者太多的服务器线程来处理客户的请求,都可能导致性能问题。例如,如果一个服务器创建单个线程来处理所有的请求,那么客户端可能长期等待而得不到响…

深度探索I/O完成端口

引言 要想编写一个高性能的服务器应用程序,必须实现一个高效的线程模型。让太少或者太多的服务器线程来处理客户的请求,都可能导致性能问题。例如,如果一个服务器创建单个线程来处理所有的请求,那么客户端可能长期等待而得不到响…

Windows中I/O完成端口机制详解

Windows中I/O完成端口机制详解 引言 要想编写一个高性能的服务器应用程序,必须实现一个高效的线程模型。让太少或者太多的服务器线程来处理客户的请求,都可能导致性能问题。例如,如果一个服务器创建单个线程来处理所有的请求,那么…

c++使用完成端口实现服务器的高性能并发

如何使用c,借助完成端口完成大并发服务器的搭建,是今天要讨论的问题,套路如下: 套路总结一下: 创建完成端口 依据CPU核数创建一定数量的线程 线程中不断调用GetQueuedCompletionStatus检查完成端口状态,分别给予处理 创建一个…

C#高性能大容量SOCKET并发完成端口例子(有C#客户端)完整实例源码

遥望星空 好好干,有前途! 博客园首页新随笔联系管理订阅 随笔- 1082 文章- 0 评论- 151 C#高性能大容量SOCKET并发(转) C#高性能大容量SOCKET并发(零):代码结构说明 C#高性能大容量SOCKET并发(一…

完成端口学习笔记(一):完成端口+控制台 实现文件拷贝

最近在整理手里一个项目的后台服务端归档程序,重新梳理了一下有关“完成端口”的知识,发现还是有很多模棱两可的地方,下面记录一下再次学习的点滴,该篇博文还会有后续的补充章节,不知道什么时间会再补充^_^。 IO概念 还…

Socket编程模型之完成端口模型

转载请注明来源:http://blog.csdn.net/caoshiying?viewmodecontents 一、回顾重叠IO模型 用完成例程来实现重叠I/O比用事件通知简单得多。在这个模型中,主线程只用不停的接受连接即可;辅助线程判断有没有新的客户端连接被建立,如…

完成端口(IOCP)详解[2/2](转载)

版权声明:本文为CSDN博主「PiggyXP」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/piggyxp/article/details/6922277 五 使用完成端口的基本流程 说了这么多的废话&a…

Windows io完成端口

Windows 提供一种称为I/O完成端口(I/O Completion Port)机制,能够让I/O的完成处理交由一个专门的线程池来完成,而线程池的线程数量是一个可配置的参数。这种做法将I/O请求的发起动作与完成处理分离到了不同的线程中。 I/O完成端口是内核对象。个人的感觉…

完成端口(Completion Port)详解

http://blog.csdn.net/piggyxp/article/details/6922277 手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解 ----- By PiggyXP(小猪) 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔&#xf…

完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解 ----- By PiggyXP(小猪) 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后&…