Oracle DataGuard

article/2025/9/29 16:07:36

一、DataGuard介绍

DataGuard是Oracle的一种高可用性数据库方案,主要用于数据容灾和读写分离。

数据库角色
Primary:主库
Standby:备库

Standby类型
物理standby:redolog以介质恢复的方式实现同步。用于数据备份(11G也可以读写分离)。
逻辑standby:redolog以sql的方式实现同步。用于数据备份和读写分离。

切换模式
switchover:正常切换,主备正常场景时切换,无数据丢失。
failover:应急切换,主库异常无法恢复时切换,最大保护模式或最高可用模式下无数据丢失。

保护模式
最大保护(Maximum Protection):最高级别的数据安全。primay上的事务在commit前必须确认redo已经传递到至少一个standby上,该模式能保证零数据丢失。(不太会用)

最高性能(Maximum Performance):最高级别的性能。primay上的事务在commit后redo才异步写到standby,primary故障时可能丢失数据。(性能较高,对备库数据一致性要求较低,主库坏了只能尽量恢复主库,因为备库会丢数据)

最高可用(Maximum Availability):在正常情况下,最大可用模式和最大保护模式一样;在standby不可用时,最大可用模式自动变为最大性能模式。(可用性较高,主库坏了用备,备库坏了用主,都不会丢数据)

打开模式

MOUNTED:数据库已挂载未打开。

READ WRITE:读写模式打开。

READ ONLY:备库只读打开,主库更新不会实时同步到备库。

READ ONLY WITH APPLY:备库只读打开,主库更新实时同步到备库。

常用sql

--启停数据库
shutdown immediate;
startup mount;
alter database open;--查询数据库角色和保护模式
select database_role,switchover_status from v$database;
--切换备库为主库(切换后,主库为mount状态)
--TO PRIMARY
alter database commit to switchover to primary; 
--SESSIONS ACTIVE
alter database commit to switchover to primary with session shutdown; 
--切换主库为备库(切换后,备库为shutdown状态)
--TO STANDBY
alter database commit to switchover to physical standby;
--SESSIONS ACTIVE
alter database commit to switchover to physical standby with session shutdown;--查询数据库打开模式
select open_mode from v$database;
--开启数据同步(mount模式执行READ ONLY,open模式执行READ ONLY WITH APPLY)
alter database recover managed standby database using current logfile disconnect from session;
--关闭数据同步(必须先关闭,才可以执行alter database open打开数据库)
alter database recover managed standby database cancel;
--主库异常无法恢复时,异常切换时备库需执行下列命令
alter database recover managed standby database finish;
alter database recover managed standby database finish force;--查询数据库保护模式
select protection_mode from v$database;
--更改数据库保护模式
alter database set standby database to maximize protection; --最大保护
alter database set standby database to maximize performance; --最高性能
alter database set standby database to maximize availability; --最高可用

二、DataGuard安装配置

参考:

https://blog.csdn.net/xiezuoyong/article/details/83862885
http://blog.itpub.net/31500837/viewspace-2146643/

三、DataGuard角色切换

数据库切换状态

主库状态(switchover_status)

NOT ALLOWED:未找到备库。

TO STANDBY:当前主机已就绪,可切换为备机。

SESSIONS ACTIVE:当前主机存在活动会话,但也可切换为备机。

RESOLVABLE GAP:备库未开启数据同步,导致主备数据有差异。

备库状态(switchover_status)

NOT ALLOWED:主库还未执行switchover,不允许切换为主。

TO PRIMARY:当前备机已就绪,可切换为主机。

SESSIONS ACTIVE:当前备机存在活动会话,但页可切换为主机。

RECOVERY NEEDED:当前未开启数据同步。

正常切换(switchover)

参考:https://www.cnblogs.com/hftian/p/9327638.html

主备切换

1.主库切换为备库,如下图:

--1.查询主库状态为TO STANDBY或SESSIONS ACTIVE
select database_role,switchover_status from v$database;
--2.切换主库角色为备库
alter database commit to switchover to physical standby;
alter database commit to switchover to physical standby with session shutdown;
--3.重启数据库到open模式
startup
--4.开启redo同步
alter database recover managed standby database using current logfile disconnect from session;
--5.查询数据库状态已经是TO PRIMARY(主库成功切换为备库)
select database_role,switchover_status from v$database;
--6.查询数据库打开模式为READ ONLY WITH APPLY(读写分离,redo实时同步)
select open_mode from v$database;

 此时,主库已经切换为备库,下面可以在所有备库选择一个切换为主库。

 2.备库切换为主库,如下图:

--1.查询备库状态为TO PRIMARY或SESSIONS ACTIVE
select database_role,switchover_status from v$database;
--2.切换备库角色为主库
alter database commit to switchover to primary;
alter database commit to switchover to primary with session shutdown;
--3.打开数据库(切换完后为mount状态)
alter database open;
--4.查询数据库状态为TO STANDBY(表示切换完成)
select database_role,switchover_status from v$database;

至此,正常切换完成,可在主库insert/update数据看是否实时可在备库中select到。

应急切换(failover)

参考:https://www.cnblogs.com/ivictor/p/3645570.html

1.模拟主库不可用,如下图,直接关闭主数据库:

shutdown immediate;

2. 切换备库为主库,如下图:

--1.查询备库状态NOT ALLOWED
select database_role,switchover_status from v$database;
--2.执行sql停止同步并应用所有redo
alter database recover managed standby database cancel;
alter database recover managed standby database finish;
--3.切换备库为主库
alter database commit to switchover to primary;
alter database commit to switchover to primary with session shutdown;
--4.打开数据库(切换完后为mount状态)
alter database open;
--5.查询数据库状态为TO STANDBY(表示切换完成)
select database_role,switchover_status from v$database;

至此,应急切换完成,备库可正常使用了。

4.若原主库故障解决,参考前面DataGuard安装部分利用RMAN将主库恢复到备库。

另外两种恢复方式参考:https://www.cnblogs.com/ivictor/p/3645570.html


http://chatgpt.dhexx.cn/article/7NFqB021.shtml

相关文章

Data Guard原理

文章来源于网络整理 DG通过提供冗余数据来提供数据保护 1.常用于异地容灾和小企业的高可用解决方案 2.虽然可以在Standby机器上执行只读查询,从而分散Primary数据库的性能压力,但是绝不是性能解决方案 DataGuard介绍 在DG环境中,至少会有两…

基于Java的员工工资管理系统

​ 源码编号:F-A15 项目类型:Java SE项目(awtswing) 项目名称:基于Java的员工工资管理系统(EmployeeSalary) 用户类型:双角色(员工、管理员) 主要技术:ja…

Java工程师工资水平出炉!真厉害了

Java因为其十分适用于企业级开发的特点,所以一直是国内大厂最主要使用的语言之一,也是应用最广泛的编程语言。 也由于Java主要用于开发企业级应用,市场需求同比其他语言来说会更大一些,自然它的起薪也相对较高,因而很多…

Java培训出来后一般多少工资

学完Java培训出来后一般多少工资呢?这是很多人都比较关心的一个问题,小编在这里告诉大家,java技术这个岗位分为初级、中级和高级,每个等级的工资情况也是不一样,来看看下面的详细介绍。 Java培训出来后一般多少工资?Java程序员薪…

2022上海Java工资收入概览

微信公众号,关注:georgezheng 越来越多的人选择从事IT,接触计算机互联网,除了学习复杂庞大的知识体系,也比较关注各地区Java工资收入,我收集了上海的信息做一次整理,数据来源职友集和平…

Java基础(员工工资管理系统)

项目介绍: 某公司的雇员分为以下若⼲类: SalariedEmployee:拿固定⼯资的员⼯。 HourlyEmployee:按⼩时拿⼯资的员⼯,每⽉⼯作超出160⼩时的部分按照1.5倍⼯资发放 SalesEmployee:销售⼈员,⼯资由⽉销售额和…

2020年5大一线城市Java薪资水平汇总,你还差多少呢?

程序员作为薪资最高的行业之一,一直是很多人转行的热门首选行业。Java程序员又在所有程序员中占比最大, 因此,Java程序员的薪资就能够很好的代表行业的薪资水准。 今天就为大家整理5大热门城市的Java薪资情况,看看你还差多少,你又想拿多少?或者你希望去哪个城市发展呢?…

Redis LRU

一:Redis内存驱逐的几种策略 检测易失数据(可能会过期的数据集server.db[i].expires ) ① volatile-lru:挑选最近最少使用的数据淘汰 ② volatile-lfu:挑选最近使用次数最少的数据淘汰 ③ volatile-ttl&#xff1a…

LRU链表及LRU缓存

注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2 1、 关于LRU LRU即Least recently used,也就是最近最少使用,一般用作缓存淘汰上,它的核心思想是——如果一个数据在最近一段时间没有被访问到&…

14.1 LRU链表

在最近几十年操作系统的发展过程中,有很多页面交换算法,其中每个算法都有各自的优点和缺点。linux内核中采用的页面交换算法主要是LRU算法和第二次机会法(second chance)。 LRU链表 LRU是least recently used(最近最少使用)的缩写…

mysql lru_MySQL · 源码分析 · InnoDB LRU List刷脏改进之路

之前的一篇内核月报MySQL 引擎特性 InnoDB Buffer Pool 中对InnoDB Buffer pool的整体进行了详细的介绍。文章已经提到了LRU List以及刷脏的工作原理。本篇文章着重从MySQL 5.7源码层面对LRU List刷脏的工作原理,以及Percona针对MySQL LRU Flush的一些性能问题所做…

图解LRU算法

目录 一、什么是LRU算法? 二、基于双向链表Map实现LRU算法 1. 用双向链表看成cache缓存, 数据存放在链表上的每个节点上。 2. 用Map记录访问cache的历史, 只要访问了 cache就将节点放置Map里。 3. 图解移动节点和淘汰策略过程 三、完整代码 四、借助LinkedHashMap实现 一…

mysql lru_浅析MySQL的lru链表

一、简述传统的LRU链表 LRU:Least Recently Used 相信大家对LRU链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是LRU链表,甚至是让你手写一个LRU链表。 想必你已经知道了MySQL的Buffer Pool机制以及MyS…

LRU实现算法

转载自:https://www.cnblogs.com/Dhouse/p/8615481.html 四种实现方式 LRU 1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过&#x…

Redis LRU算法

一、配置Redis内存淘汰策略 maxmemory 100mbmaxmemory-policy allkeys-lrumaxmemory-samples 5注意:Redis的LRU算法并非完整的实现,而是近似LRU的算法,详细介绍点击这里 二、LRU实现原理 1、双向链表 哈希表 1、哈希表:查找快&…

LRU链表介绍

文章目录 1. 简介2. LRU 组织 2.1 LRU 链表2.2 LRU Cache2.3 LRU 移动操作 2.3.1 page 加入 LRU2.3.2 其他 LRU 移动操作3. LRU 回收 3.1 LRU 更新3.2 Swappiness3.3 反向映射3.4 代码实现 3.4.1 struct scan_control3.4.2 shrink_node()3.4.3 shrink_list()3.4.4 shrink_acti…

LRU页面回收

内存回收算法总是会在一定的时间将一些内存回收, 内存回收算法是通过LRU链表对page页面进行管理的,对于那些新的页面会将其插入到LRU链表头,回收时将返回LRU链表末尾的元素,代表老化程度最高的页面 基本数据结构 typedef struct…

利用数组实现lru

LRU主要包含两个函数,第一个插入一个页面,第二个获得一个页面 主要思路如下,当插入页面的时候,所有的页面向后移动一个单位(若果多出来一个元素舍弃掉),然后把这个页面放到数组首元素 当获得一…

什么是LRU(最近最少使用)算法?

一、什么是LRU? LRU(Least Recently Used),最近最少使用。 是一种【内存管理】算法。 LRU算法基于一种假设: 长期不被使用的数据,在未来被用到的几率也不大。因此,当数据所占内存达到一定阈值时…

什么是LRU算法

什么是LRU LRU 英文全称(Least recently used,最近最少使用)属于典型的内存管理算法。 内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于…