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

article/2025/9/26 18:10:42

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


前言

在《ADG架构搭建3 – 一主一备ADG主备切换》一文中,已经带领大家完成了一主一备ADG的主备切换,相信大家对该部分内容已有所了解。本文将对《ADG架构搭建4 – 搭建一主两备ADG架构》中搭建的一主两备架构进行主备切换的演示。

正文

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

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

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

当前各数据库角色及切换目标说明如下:

数据库IPtnsname原角色目标角色
192.168.10.13ruiadg1RrimaryStandby
192.168.10.14ruiadg2StandbyRrimary
192.168.10.15ruiadg3StandbyStandby

1.迁移前检查

确认主备库的角色:

--主库(ruiadg1)执行
SQL> select name,DATABASE_ROLE from v$database;NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PRIMARY--两备库执行
SQL> select name,DATABASE_ROLE from v$database;NAME      DATABASE_ROLE
--------- ----------------
RUIADG    PHYSICAL STANDBY

检查主备库间有没有延迟:

--主库(ruiadg1)执行
SQL> select value from v$dataguard_stats where name='transport lag';no rows selectedSQL> select value from v$dataguard_stats where name='apply lag';no rows selected

补充:如果有,检查最新归档到的日志号及是否有gap,命令如下:

SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BY thread#) AS LAST from V$ARCHIVED_LOG; SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;

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

--主库(ruiadg1)执行
SQL> select status, GAP_STATUS from v$archive_dest_status where dest_id=2;STATUS    GAP_STATUS
--------- ------------------------
VALID     NO GAPSQL> select status, GAP_STATUS from v$archive_dest_status where dest_id=3;STATUS    GAP_STATUS
--------- ------------------------
VALID     NO GAP

2.执行切换

检查主库(ruiadg1)是否支持Switchover操作:

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

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

切换当前主库(ruiadg1)为物理备库:
切换完成后,数据库会被关闭

SQL> alter database commit to switchover to physical standby;

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

SQL> startup mount

查询数据库(ruiadg1)切换状态:
此时状态发生变化

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

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

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

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

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

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

补充:如果发现not allowed状态,若能确定切换前主从是同步的,可以忽略Not Allowed 状态直接进行switchover。

将备库1(ruiadg2)切换为主库:
一旦切换到主库,数据库此时为mount状态

SQL> alter database commit to switchover to primary;Database altered.

查备库1(ruiadg2)修改后的角色:

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

打开新主库/原备库1(ruiadg2):

SQL> alter database open;

打开原主库/新备库1(ruiadg1)到只读:

SQL> alter database open read only;
或
SQL> alter database open;

在原主库/新备库1(ruiadg1)开启日志的应用:

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

3.切换后验证

新主库(ruiadg2)构造测试数据:

SQL>insert into test1 values ('rui',32);
SQL>commit;

手动切换新主库(ruiadg2)log:

SQL> alter system switch logfile;

检查两备库数据是否同步:

select * from test1;

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

SQL> select distinct thread#,applied,max(sequence#) over(partition by thread#) a from v$archived_log;

经验证,数据同步无异常。

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

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

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

当前各数据库角色及切换目标说明如下:

数据库IPtnsname原角色目标角色
192.168.10.13ruiadg1StandbyRrimary
192.168.10.14ruiadg2RrimaryStandby
192.168.10.15ruiadg3StandbyStandby

1.主库故障模拟

把主库(ruiadg2)关闭,模拟为主库损坏

SQL> shutdown immediate;

2.切换前准备

检查两备库是否有日志没有同步:

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

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

SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'xxx';

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

--备库1(ruiadg1)
SQL>  select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;THREAD#          A
---------- ----------1         44--备库2(ruiadg3)
SQL>  select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;THREAD#          A
---------- ----------1         42

3.主备切换

在备库1(ruiadg1)做失败切换:

SQL> alter database recover managed standby database finish ;Database altered.

切换备库1(ruiadg1)的角色为primary:

SQL> alter database commit to switchover to primary;Database altered.

启动新主库/原备库1(ruiadg1):

SQL> alter database open;Database altered.

查看新主库/原备库1(ruiadg1)当前角色:

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

4.原主库(ruiadg2)处理

前面已经说到,Failover之后原主库默认不再是Data Guard配置的一部分。所以,在将ruiadg1切换为主库后,原主库(ruiadg2)需要重新做数据同步,使其称为ADG的备库。

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

5.数据同步测试

在新主库(ruiadg1)执行如下操作:

SQL>insert into test1 values ('rui',36);
SQL>commit;

在新主库(ruiadg1)手动切log:

SQL>alter system switch logfile;

检查主备库数据是否同步:

select * from test1;

经检查,主库数据已同步至两备库。
在这里插入图片描述


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


http://chatgpt.dhexx.cn/article/bMJ93gUE.shtml

相关文章

第一章 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(小猪) 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后&…

树同构-树哈希

树同构-树哈希 题目描述 题解 对于无根树,由于数据范围较小,可以直接以每个点为根dfs一次,维护其树哈希的值,然后用并查集维护 (若数据范围大一些,可以以树的重心跑dfs) 代码实现 #include&…

2.3 树的同构(树,c)

树的同构 树的同构输入格式:输出格式:输入样例1(对应图1):输出样例1:输入样例2(对应图2):输出样例2: 题意理解输入两棵二叉树的信息,判断是否同构(对应图1) 求解思路二叉…

03-树1 树的同构

题目 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 图1 图2 现给…

『树同构的判定(树Hash)』CF718D:Andrew and Chemistry

题目描述 题解 这道题目的难点在于如何判断树的同构,这就是所谓的树的哈希。 我们假设需要求解以x为根的子树的hash值,我们可以将子树的hash值存储到vector内,排序以后用map来判断重复。这个写法十分简单。具体如下: int dfs(i…