首页 > 数据库 >Oracle DG概念与进程(转)

Oracle DG概念与进程(转)

时间:2023-03-09 10:22:05浏览次数:29  
标签:Standby DG 数据库 Primary 进程 应用 Oracle 日志 REDO

Oracle比较熟知的高可用架构:DG,RAC等。
RAC:解决单点故障和进行负载均衡
DG:通过冗余数据来提供数据保护(日志同步机制),分散主数据库性能压力

一.data guard 架构
DG包括:日志发送,日志接受,日志应用三个方面。
1.日志发送(redo send)
primary database 会源源不断的产生redo logs,这些日志需要发送到standby database。就需要primary database中的LGWR或者ARCH进程来完成。
1.1使用ARCH进程
a.primary database不断产生redo logs,这些被LGWR进程写到联机日志中。
b.当一组联机日志被写满,会发生日志切换并且会出发本地归档。LOG_ARCHIVE_DEST_1。完成本地归档,联机日志就可以被覆盖重用。
c.ARCH进程通过NET把归档日志发送给STD database 的RFS(remote file server)
d.std database将RFS接受到的进程写入到归档日志。
e.std databse中的MRP或者LSP进程在standby database上应用这些日志,进而同步数据。
缺陷:必须发生归档才能传送日志。
1.2 使用LGWR进程的SYNC方式
a.pri database产生的redo日志要同时写入到日志文件和网络(LNSn进程),再由此进程把日志发送到远程的目的地。
b.LGWR必须等待写入本地日志文件操作和通过LNSn进程的网络传送都成功,PRI数据库上的事务才能提交。
c.std database的RFS进程把接收到的日志写入到standby redo log日志中。
d.primary database的日志切换也会触发standby database上的日志切换,即standby database对standby redolog的归档,然后触发std database的MPR或LSP进程恢复归档日志。
**因为primary database的redo是实时传递的,于是standby database端可以使用两种恢复方法:实时恢复和归档恢复
1.3 使用LGWR进程的ASYNC方式
LGWR的SYNC方法的可能问题在于,如果日志发送给standby database过程失败,LGWR进程就会报错。也就是说pri database的LGWR进程依赖于网络状况。
a.pri database产生了redo日志之后,LGWR把日志同时提交给日志文件和本地LNS进程,但是LGWR只需成功写入日志文件就可以,不必等待LNSn进程的网络传送成功。
b.LNSn进程异步地把日志内容发送到standby database。多个LNSn进程可以并发发送。
c.pri database的online redo log写满后发生log switch触发归档操作,也触发standby database 对standby redo log的归档;然后触发MRP或者LSP进程恢复归档日志。
** alter system set log_archive_dest_2 = 'SERVICE=ST LGWR ASYNC ' scope=both;

2.日志接收(redo receive)
standby database的RFS进程接收到日志后,就把日志写到standby redo log或者archived log文件中,具体写入哪个文件,取决于pri的日志传送方式和standby databse的位置。
如果写到standby redo log文件中,则当pri database发生日志切换时,也会触发standby database上的的standby redo log的日志切换,并把这个standby redo log归档。如果是写到
archived log,那么这个动作本身也可以看作是个归档操作。
**在日志接收中,需要注意的是归档日志会被放在什么位置:
a.如果配置了STANDBY_ARCHIVE_DEST参数,则使用该参数指定的目录。
b. 如果某个LOG_ARCHIVE_DEST_n参数明确定义了VALID_FOR=(STANDBY_LOGFILE,*)选项,则使用这个参数指定的目录。
c.如果数据库的COMPATIBLE参数大于等于10.0,则选取任意一个LOG_ARCHIVE_DEST_n的值。
d.如果STANDBY_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n参数都没有配置,使用缺省的STANDBY_ARCHIVE_DEST参数值缺省值是$ORACLE_HOME/dbs/arc.

3.日志应用(redo apply)
日志应用服务,就是在standby database上重演primary database日志,从而实现两个数据库的数据同步。根据Standby Database重演日志方式的不同,可分为物理Standby(Physical Standby)和逻辑Standby(Logical Standby)。Physical Standby使用的是Media Recovery 技术,在数据块级别进行恢复,这种方式没有数据类型的限制,可以保证两个数据库完全一致。Physical Standby数据库只能在Mount 状态下进行恢复,也可以是打开,但只能已只读方式打开,并且打开时不能执行恢复操作。
Logical Standby 使用的是Logminer 技术,通过把日志内容还原成SQL 语句,然后SQL引擎执行这些语句,Logminer Standby不支持所有数据类型,可以在视图DBA_LOGSTDBY_UNSUPPORTED 中查看不支持的数据类型,如果使用了这种数据类型,则不能保证数据库完全一致。Logical Standby数据库可以在恢复的同时进行读写操作。
Standby数据库的相关进程读取接收到的REDO数据(可能来自于Standby端的归档文件,也可能来自于Standby Redologs),再将其写入Standby数据库。保存之后数据又是怎么生成的呢?两种方式:物理Standby通过REDO应用,逻辑Standby通过SQL应用。
根据redo apply发生的时间可以分成两种;
a.实时应用。使用standby redo log, 每当日志被写入standby redo log时, 就会触发恢复,使用这种方式的好处在于可以减少数据库切换(switchover或者failor)的时间,因为切换时间主要是在剩余日志的恢复上。
b.归档时应用。这种方式在pri database发生日志切换,触发standby database归档操作,归档完成后触发恢复。(默认)
启用real-time(Select recovery_mode from v$archive_dest_status;):
物理:Alter database recover managed standby database using current logfile;
逻辑:Alter database start logical standby apply immediate;

二、数据保护模式
1. 最大保护(Maximum Protection)
这种模式能够确保绝无数据丢失。要实现这一步当然是有代价的,它要求所有的事务在提交前其REDO不仅被写入到本地的Online Redologs,还要同时写入到Standby数据库的Standby Redologs,并确认REDO数据至少在一个Standby数据库中可用(如果有多个的话),然后才会在Primary数据库上提交。如果出现了什么故障导致Standby数据库不可用的话(比如网络中断),Primary数据库会被Shutdown,以防止数据丢失。
(使用这种方式要求Standby Database必须配置Standby RedoLog,而Primary Database必须使用LGWR,SYNC,AFFIRM方式归档到Standby Database.)
2. 最高可用性(Maximum availability)
这种模式在不影响Primary数据库可用前提下,提供最高级别的数据保护策略。其实现方式与最大保护模式类似,也是要求本地事务在提交前必须至少写入一台Standby数据库的Standby Redologs中,不过与最大保护模式不同的是,如果出现故障导致Standby数据库无法访问,Primary数据库并不会被Shutdown,而是自动转为最高性能模式,等Standby数据库恢复正常之后,Primary数据库又会自动转换成最高可用性模式。这种方式虽然会尽量避免数据丢失,但不能绝对保证数据完全一致。这种方式要求Standby Database 必须配置Standby Redo Log,而Primary Database必须使用LGWR,SYNC,AFFIRM 方式归档到Standby Database。
3.最高性能(Maximum performance)
缺省模式。这种模式在不影响Primary数据库性能前提下,提供最高级别的数据保护策略。事务可以随时提交,当前Primary数据库的REDO数据至少需要写入一个Standby数据库,
不过这种写入可以是不同步的。如果网络条件理想的话,这种模式能够提供类似最高可用性的数据保护,而仅对Primary数据库的性能有轻微影响。这也是创建Standby数据库时,系统的默认保护模式。(这种方式可以使用LGWR ASYNC 或者 ARCH 进程实现,Standby Database也不要求使用Standby Redo Log)
4. 修改数据保护模式步骤
a.关闭数据库,重启到Mount 状态,如果是RAC,需要关闭所有实例,然后只启动一个实例到mount状态。
b.ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION | AVAILABILITY | PERFORMANCE};
c.打开数据库:alter database open;
d.确认修改数据保护模式:select protection_mode,protection_level from v$database;

三. 自动裂缝检测和解决
当Primary Database的某些日志没有成功发送到Standby Database,这时候发生了归档裂缝(Archive Gap)。缺失的这些日志就是裂缝(Gap)。Data Guard能够自动检测,解决归档裂缝,不需要DBA的介入。这需要配置FAL_CLIENT,FAL_SERVER 这两个参数(FAL: Fetch Archive Log)。从FAL 这个名字可以看出,这个过程是Standby Database主动发起的“取”日志的过程,Standby Database 就是FAL_CLIENT. 它是从FAL_SERVER中取这些Gap, 10g中,这个FAL_SERVER可以是Primary Database, 也可以是其他的Standby Database。FAL_CLIENT和FAL_SERVER两个参数都是Oracle Net Name。FAL_CLIENT 通过网络向FAL_SERVER发送请求,FAL_SERVER通过网络向FAL_CLIENT发送缺失的日志。 但是这两个连接不一定是一个连接。 因此FAL_CLIENT向FAL_SERVER发送请求时,会携带FAL_CLIENT参数值,用来告诉FAL_SERVER应该向哪里发送缺少的日志。这个参数值也是一个Oracle Net Name,这个Name是在FAL_SERVER上定义的,用来指向FAL_CLIENT。
DBA手动解决:
SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
ALTER DATABASE REGISTER LOGFILE '路径';

四. 指定日志发送对象
1.VALID_FOR属性指定传输及接收对象
LOG_ARCHIVE_DEST_n参数中的VALID_FOR属性,用来指定传输的内容。从字面理解VALID_FOR就是基于那谁有效,该属性有两个参数值需要指定:REDO_LOG_TYPE和DATABASE_ROLE,我们基本上可以将其理解为:发送指定角色生成的指定类型的日志文件,该参数的主要目的是为了确保,一旦发生角色切换操作后数据库的正常运转。其中,REDO_LOG_TYPE和DATABASE_ROLE两个参数可供选择的参数值如下:
REDO_LOG_TYPE:可设置为ONLINE_LOGFILE、STANDBY_LOGFILE、ALL_LOGFILES。
DATABASE_ROLE:可设置为PRIMARY_ROLE、STANDBY_ROLE、ALL_ROLES。
注意:VALID_FOR参数默认值是:VALID_FOR=(ALL_LOGFILES,ALL_ROLES)。
推荐手动设置该参数而不要使用默认值,在某些情况下默认的参数值不一定合适,如逻辑Standby在默认情况下就处于OPEN READ WRITE模式,不仅有REDO数据而且还包含多种日志文件(Online Redologs、Archived Redologs及Standby Redologs)。默认情况下,逻辑Standby数据库生成的归档文件和接收到的归档文件在相同的路径下,这既不便于管理,也极有可能带来一些隐患。建议对每个LOG_ARCHIVE_DEST_n参数设置合适的VALID_FOR属性。本地生成的归档文件和接收到的归档文件最好分别保存于不同路径下。
2.通过DB_UNIQUE_NAME属性指定数据库
DB_UNIQUE_NAME属性是10g版本新增加的一个关键字,在之前版本并没有这一说法。该属性的作用是指定唯一的Oracle数据库名称,也正因有了DB_UNIQUE_NAME,REDO数据在传输过程中才能确认传输到DBA希望被传输到的数据库上。当然要确保REDO数据被传输到指定服务器,除了在LOG_ARCHIVE_DEST_n参数中指定正确DB_UNIQUE_NAME属性之外,还有一个初始化参数LOG_ARCHIVE_CONFIG也需要进行正确的配置。该参数除了指定Data Guard环境中的唯一数据库名外,还包括几个属性,用来控制REDO数据的传输和接收:SEND:允许数据库发送数据到远端。
RECEIVE:允许Standby接收来自其他数据库的数据。
NOSEND,NORECEIVE:自然就是禁止喽。

五、Data Guard环境应配置的初始化参数
下列参数为Primary角色相关的初始化参数
DB_NAME:注意保持同一个Data Guard中所有数据库DB_NAME相同
DB_UNIQUE_NAME:为每一个数据库指定一个唯一的名称,该参数一经指定不会再发生变化,除非DBA主动修改它
LOG_ARCHIVE_CONFIG:该参数用来控制从远端数据库接收或发送REDO数据,通过DG_CONFIG属性罗列同一个Data Guard中所有DB_UNIQUE_NAME(含Primary数据库
和Standby数据库),以逗号分隔,SEND/NOSEND属性控制是否可以发送,RECEIVE/NORECEIVE属性控制是否能够接收。
例如:LOG_ARCHIVE_CONFIG='DG_CONFIG=(DavePre,DaveDG)'
LOG_ARCHIVE_DEST_n:归档文件的生成路径。该参数非常重要,并且属性和子参数也特别多(可以直接查询Oracle官方文档。Data Guard白皮书第14章专门介绍了该参数各属性及子参数的功能和设置)。例如:LOG_ARCHIVE_DEST_1='LOCATION=l:/oracle/oradata/Dave VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=DavePre'.
LOG_ARCHIVE_DEST_STATE_n:是否允许REDO传输服务传输REDO数据到指定的路径。该参数共拥有4个属性值,功能各不相同。
REMOTE_LOGIN_PASSWORDFILE:推荐设置参数值为EXCLUSIVE或者SHARED,注意保证相同Data Guard配置中所有DB服务器SYS密码相同
以下参数为与Standby角色相关的参数(建议在Primary数据库的初始化参数中也进行设置,这样即使发 生角色切换,新的Standby也能直接正常运行):
FAL_SERVER:指定一个Net服务名,该参数值对应的数据库应为Primary角色。当本地数据库为Standby角色时,如果发现存在归档中断的情况,该参数用来指定获取中断的归档文件的服务器。例如:FAL(Fetch Archived Log)_SERVER=DavePre。FAL_SERVER参数支持多个参数值的哟,相互间以逗号分隔。
FAL_CLIENT:又指定一个Net服务名,该参数对应数据库应为Standby角色。当本地数据库以Primary角色运行时,向参数值中指定的站点发送中断的归档文件。
DB_FILE_NAME_CONVERT:Standby数据库的数据文件路径与Primary数据库数据文件路径不一致时,可以通过设置DB_FILE_NAME_CONVERT参数的方式让其自动转换。该参数值应该成对出现,前面的值表示转换前的形式,后面的值表示转换后的形式。
LOG_FILE_NAME_CONVERT:使用方式与上相同,只不过LOG_FILE_NAME_CONVERT专用来转换日志文件路径。
STANDBY_FILE_MANAGEMENT:如果Primary数据库数据文件发生修改(如新建、重命名等)则按照本参数的设置在Standby数据库中作相应修改。设为AUTO表示自动管理。设为MANUAL表示需要手工管理。例如:STANDBY_FILE_MANAGEMENT=AUTO

对于归档失败的处理,LOG_ARCHIVE_DEST_n参数有几个属性,可以用来控制归档过程中出现故障时应该采取的措施。
1.REOPEN 指定时间后再次尝试归档
使用REOPEN=seconds(默认为300秒)属性,在指定时间重复尝试向归档目的地进行归档操作,如果该参数值设置为0,则一旦失败就不会再尝试重新连接并发送,直到下次REDO数据再被归档时会重新尝试。
例如,设置REOPEN为100秒:LOG_ARCHIVE_DEST_2='SERVICE=DavePrimary LGWR ASYNC REOPEN=100'
2.ALTERNATE 指定替补的归档目的地
ALTERNATE属性定义一个替补的归档目的地,所谓替补就是一旦主归档目的地因各种原因无法使用,则临时向ALTERNATE属性中指定的路径写。
例如:LOG_ARCHIVE_DEST_1='LOCATION=/disk1 ALTERNATE=LOG_ARCHIVE_DEST_2'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_2='LOCATION=/disk2'
LOG_ARCHIVE_DEST_STATE_2=ALTERNATE
上述参数设置归档路径为/disk1,当/disk1路径下无法成功归档时,自动尝试向/disk2路径下归档文件。
从功能上来看,REOPEN与ALTERNATE是有一定重复的,不过需要注意一点,REOPEN属性比ALTERNATE属性的优先级要高,如果你指定REOPEN属性的值>0,则LGWR(或ARCn)进程会首先尝试向主归档目的地写入,直到达到最大重试次数,如果仍然写入失败,才会向ALTERNATE属性指定的路径写。
3.MAX_FAILURE 控制失败尝试次数
用REOPEN指定失败后重新尝试的时间周期,MAX_FAILURE则控制失败尝试的次数。例如,设置LOG_ARCHIVE_DEST_1在本地归档文件时,如果遇到错误,则每隔100秒尝试一次,共尝试不超过3次,设置如下:LOG_ARCHIVE_DEST_1='LOCATION=E:/ora10g/oradata/jsspdg/ REOPEN=100 MAX_FAILURE=3'

六. 物理Standby 和逻辑Standby 的区别
Standby数据库类型分为两类:物理Standby和逻辑Standby。
1.物理Standby
我们知道物理Standby与Primary数据库完全一模一样,DG通过REDO应用来维护物理Standby数据库。通常在物理Standby没有执行REDO应用操作的时候,可以将物理Standby数据库以READ ONLY模式打开,如果数据库中指定了Flashback Area的话,甚至还可以被临时性的置为READ WRITE模式,操作完之后再通过Flashback Database特性恢复回READ WRITE前的状态,以便继续接收Primary端发送的REDO并应用。物理Standby通过REDO应用来保持与Primary数据库的一致性,所谓的REDO应用,实质是通过Oracle的恢复机制,应用归档文件(或Standby Redologs文件)中的REDO数据。恢复操作属于块对块的应用。如果正在执行REDO应用的操作,Oracle数据库就不能被Open。以READ ONLY模式打开后,可以在Standby数据库执行查询或备份等操作(变相减轻Primary数据库压力)。此时Standby数据库仍然能够继续接收Primary数据库发送的REDO数据,不过并不会应用,直到Standby数据库重新恢复REDO应用。也就是说在READ ONLY模式下不能执行REDO应用,REDO应用时数据库肯定处于未打开状态。如果需要的话,你可以在两种状态间转换,如先应用REDO,然后将数据库置为READ ONLY状态,需要与Primary同步时再次执行REDO应用命令,切换回REDO应用状态。
***提 示: Oracle 11g版本中增强物理Standby的应用功能,在11g版本中,物理Standby可以在OPEN READ ONLY模式下继续应用REDO数据,这就极大地提升了物理Standby数据库的应用场合。READ WRITE模式打开。如果以READ WRITE模式打开,那么Standby数据库将暂停从Primary数据库接收REDO数据,并且暂时失去灾难保护的功能。当然,以READ WRITE模式打开也并非一无是处,如你可能需要临时调试一些数据,但又不方便在正式库中操作,那就可以临时将Standby数据库置为READ WRITE模式,操作完之后将数据库闪回到操作前的状态(闪回之后,Data Guard会自动同步,不需要重建物理Standby,不过如果从另一个方向看,没有启动闪回,那就回不到READ WRITE前的状态了)。

物理Standby特点如下:
(1)灾难恢复及高可用性。物理Standby提供了一个健全、高效的灾难恢复,以及高可用性的解决方案。更加易于管理switchover/failover角色转换及在更短的计划内或计划外停机时间。
(2)数据保护。使用物理Standby数据库,DG能够确保即使面对无法预料的灾害也能够不丢失数据。前面也提到物理Standby是基于块对块的复制,因此与对象、语句无关,Primary数据库上有什么,物理Standby数据库端也会有什么。
(3)分担Primary数据库压力。通过将一些备份任务、仅查询的需求转移到物理Standby数据库,可以有效节省Primary数据库的CPU及I/O资源。
(4)提升性能。物理Standby所使用的REDO应用技术使用最底层的恢复机制,这种机制能够绕过SQL级代码层,因此效率最高。

2.逻辑Standby
逻辑Standby也要通过Primary数据库(或其备份,或其复制库,如物理Standby)创建,因此在创建之初与物理Standby数据库类似。不过由于逻辑Standby通过SQL应用的方式应用REDO数据,因此逻辑Standby的物理文件结构,甚至数据的逻辑结构都可以与Primary不一致。与物理Standby不同,逻辑Standby正常情况下是以READ WRITE模式打开,用户可以在任何时候访问逻辑Standby数据库,就是说逻辑Standby是在OPEN状态执行SQL应用。同样有利也有弊,由于SQL应用自身特点,逻辑Standby对于某些数据类型及一些DDL/DML语句会有操作上的限制。可以在视图DBA_LOGSTDBY_UNSUPPORTED 中查看不支持的数据类型,如果使用了这种数据类型,则不能保证数据库完全一致。逻辑Standby 的读写打开可以使它做报表系统,这样减轻系统的压力。
除了上述物理Standby中提到的类似灾难恢复、高可用性及数据保护等特点之外,逻辑Standby还有下列一些特点:
(1)有效地利用备机的硬件资源。除灾难恢复外,逻辑Standby数据库还可用于其他业务需求。如通过在Standby数据库创建额外的索引、物化视图等提高查询性能并满足特定业务需要;又如创建新的SCHEMA(该SCHEMA在Primary数据库端并不存在),然后在这些SCHEMA中执行那些不适于在Primary数据库端执行的DDL或者DML操作等。
(2)分担Primary数据库压力。逻辑Standby数据库可以在保持与Primary同步时仍然置于打开状态,这使得逻辑Standby数据库能够同时用于数据保护和报表操作,从而将主数据库从报表和查询任务中解脱出来,节约宝贵的CPU和I/O资源。
(3)平滑升级。可以通过逻辑Standby来实现如跨版本升级,为数据库打补丁等操作。应该说应用的空间很大,而带来的风险却很小(前提是如果你拥有足够的技术实力。另外虽然物理Standby也能够实现一些升级操作,但如果跨平台的话恐怕就力不从心了,所以此项没有作为物理Standby的特点列出),我个人认为这是一种值得可行的在线的滚动的平滑的升级方式,如果你的应用支持创建逻辑Standby的话。

七. Log应用服务(Log Apply Services)
Data Guard通过应用REDO维持Primary数据库与各Standby数据库之间的一致性,在后台默默无闻地支撑着的就是传说中的Log应用服务。Log应用服务又分以下两种方式:
REDO应用:物理Standby数据库专用,通过介质恢复的方式保持与Primary数据库的同步。
SQL应用:逻辑Standby数据库专用,核心是通过LogMiner分析出SQL语句在Standby端执行。
因此物理Standby在应用REDO数据时必须是MOUNT状态,而逻辑Standby则是以READ WRITE模式打开并应用REDO数据,不过被维护的对象默认处于只读状态,无法在逻辑Standby端直接修改。
7.1 Log应用服务配置选项
默认情况下,Log应用服务会等待单个归档文件全部接收之后再启动应用,如果Standby数据库配置了Standby Redologs,就可以打开实时应用(Real-Time Apply),这样Data Guard就不需要再等待接收完归档文件,只要RFS进程将REDO数据写入Standby Redologs,即可通过MRP/LSP实时写向Standby数据库。
7.1.1.REDO数据实时应用
启动实时应用的优势在于,REDO数据不需要等待归档完成,接收到即可被应用,这样执行角色切换时,操作能够执行得更快,因为日志是被即时应用的。要启动实时应用也简单,前提是Standby数据库端配置了Standby Redologs。
物理Standby要启用实时应用,要在启动REDO应用的语句后附加USING CURRENT LOGFIE子句,
例如:SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE ;
逻辑Standby要启用实时应用,只需要在启动REDO应用的语句后附加IMMEDIATE子句即可,
例如:SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
7.1.2.REDO数据延迟应用
有实时就有延迟,某些情况下你可能不希望Standby数据库与Primary太过同步,那就可以在Primary数据库端发送REDO数据的相应LOG_ARCHIVE_DEST_n参数中指定DELAY属性(单位为分钟,如果指定了DELAY属性,但没有指定值,则默认是30分钟)。注意:该属性并不是说延迟发送REDO数据到Standby,而是指明归档到Standby后,开始应用的时间。
例如:设置LOG_ARCHIVE_DEST_3的DELAY属性为15分钟:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='SERVICE=DavePrimary ARCH VALID_ FOR= (ONLINE_LOGFILES, PRIMARY_ROLE) DB_UNIQUE_NAME=Dave DELAY=15';
不过,如果DBA在启动REDO应用时指定了实时应用,那么即使在LOG_ ARCHIVE_DEST_n参数中指定了DELAY属性,Standby数据库也会忽略DELAY属性。
另外,Standby端还可以在启动REDO应用时,通过附加NODELAY子句的方式,取消延迟应用。
物理Standby可以通过下列语句取消延迟应用:SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY;
逻辑Standby可以通过下列语句取消延迟应用:SQL> ALTER DATABASE START LOGICAL STANDBY APPLY NODELAY;
一般设置延迟应用的需求都是基于容错方面的考虑,如Primary数据库端由于误操作,数据被意外修改或删除,只要Standby数据库尚未应用这些修改,你就可以快速从Standby数据库中恢复这部分数据。不过自Oracle从9i版本开始提供FLASHBACK特性之后,对于误操作使用FLASHBACK特性进行恢复,显然更加方便快捷,因此DELAY方式延迟应用已经非常少见了。
7.2 应用REDO数据到Standby数据库
7.2.1.物理Standby应用REDO数据
物理Standby启动REDO应用,数据库要处于MOUNT状态或是OPEN READ ONLY状态,启动REDO应用的命令相信大家已经非常熟悉了。
前台应用:SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE;
语句执行完成后,不会将控制权返回到命令行窗口,除非你手动中止应用。在这种情况下如果还需要对数据库进行操作,只能新开一个命令行连接,在Oracle 8i刚推出Standby特性时(那时不叫Data Guard),只提供了这种方式。
后台应用:SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
这是现在比较通用的方式,语句执行完后,控制权自动返回到当前的命令行模式,REDO应用以后台进程运行。
启动实时应用,附加USING CURRENT LOGFILE子句即可:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE;
如果要停止REDO应用,执行下列语句即可:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
7.2.2.逻辑Standby应用REDO数据
SQL应用的原理是将接收到的REDO数据转换成SQL语句在逻辑Standby数据库端执行,因此逻辑Standby需要启动至OPEN状态。
(1)启动SQL应用。逻辑Standby数据库启动SQL应用没有前、后台运行之说,语句执行完之后,控制权就会自动返回当前命令行窗口。
要启动SQL应用,直接执行下列语句即可:SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;
如果要启动实时应用,附加IMMEDIATE子句即可,例如:SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
(2)停止SQL应用,如:SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
由于是执行SQL语句的方式应用REDO数据,因此上述语句的执行需要等待当前执行的SQL触发的事务结束,才能真正停止REDO应用的状态。
如果不考虑事务执行情况,马上停止REDO应用,可以通过下列的语句来完成:SQL> ALTER DATABASE ABORT LOGICAL STANDBY APPLY;

--核心进程介绍
RFS:remote file server。
该进程是standby库接受来自primary库lgwr进程触发的redo信息并且写入到standby redo log中。RFS进程无疑是要和其他进程配合的,也就是传输的进程。那这里就需要上篇的知识了,我们知道触发同步可能由ARCH或者是LGWR进程触发的,两者是不同的。如果是LGWR进程触发,那10g前的话也是由LGWR进程负责传输redo信息,RFS进程负责接收redo信息写入standby redo log中,10g之后则由LNSn进程完成;如果是ARCH进程触发,也就是归档日志传输的话,那就是由ARCH进程负责传输,RFS进程负责接收,然后写入指定的归档位置,然后再应用的。那这里不同的设置也决定了参数LOG_ARCHIVE_DEST_n的不同设置。
LNSn:LGWR触发以后真正负责传输的进程,包括初始化网络I/O等一些列功能。
MRP:managed recovery process,简单来说就是物理standby是通过这个进程来实现数据的同步的,直接通过standby redo log或者是归档日志(取决于模式不同)来进行的一个数据恢复。
LSP:logical standby process:逻辑standby的方式,和上面的一样,只不过当中多了一步将redo信息转换成sql语句再恢复。也可以从这里看出逻辑standby和物理standby的不同。
(原来搭建一个DG有这么多需要注意和明白的地方,是我把Oracle和IT技术想的太简单了。以后要先从原理入手,然后再多开始深究技术问题。)

 

标签:Standby,DG,数据库,Primary,进程,应用,Oracle,日志,REDO
From: https://www.cnblogs.com/quss/p/17197402.html

相关文章

  • 进程间的通信方式
    进程间的通信方式管道是内核里面的一串缓存通信的数据是无格式的流并且大小受限传输数据是单向的通信方式效率低先进先出匿名管道,父子进程命名管道,不想关进程......
  • mongodb进程down,无报错
    背景操作系统:CentOS7.5MongoDB:4.4.7现网有mongodb分片集群共3个节点(3个分片副本集,不包括config副本集),后续因业务增长需扩容3个新节点(新增3个分片副本集)。扩容的服务器......
  • QOpenGLWidget+ScrollArea显示图像,实现缩放
    原理参考博客Qt居中显示图片,图过大则出现滚动条(ui方式)的两种方法Label+ScrollArea、GraphicsView-夕西行-博客园(cnblogs.com)界面只添加布局控件,然后代码new QOpen......
  • datahub 采集oracle数据 DPI-1047: Cannot locate a 64-bit Oracle Client library: l
    datahub命令行采集oracle报错如下:datahubingest-coracle.ymlsqlalchemy.exc.DatabaseError:(cx_Oracle.DatabaseError)DPI-1047:Cannotlocatea64-bitOr......
  • OracleDatabase——数据库表空间dmp导出与导入
    由于公司的程序一直部署在客户现场内网,内网调试难度高,一般是有备份还原数据库的需求,这里简记备份(导出)数据库dmp文件与恢复(导入)的步骤。一、导出dmp文件exp与expdp命令异......
  • python 多线程, 多进程, ProcessPoolExecutor. 有关GIL锁的问题实验.
    importtimeimportthreadingfrommultiprocessingimportProcessfromconcurrent.futuresimportProcessPoolExecutordeftime_decorator(func):defwrapper......
  • Oracle问题:ORA-01109解决办法
    ORA-01109:数据库未打开01109.00000-"databasenotopen"*Cause:Acommand查看数据库监听:启动启动数据库达到open状态后面发现连接的那个库没有到opened状态selectc......
  • python连接oracle 19c报错误ORA-01017: invalid username/password
    环境:db:19cpython:3.6最近有使用到cx_oracle(5.3)模块,这里记录下出现的问题由于我的项目一直在是windows上测试,最近把项目更新到linux下后,再去跑代码,发现代码报出ORA-2......
  • QOpenGLWidget类讲解
    DetailedDescriptionQOpenGLWidget类是用于渲染OpenGL图形。除了可以选择使用QPainter和标准的OpenGL渲染图形,QOpenGLWidget类提供了在Qt应用程序中显示OpenGL图形的功能......
  • 查询oracle的列信息与字符集
    查询字符集与比较排序规则:selectuserenv('language')fromdual;selectparameter,valuefromnls_database_parameterswhereparameterin('NLS_CHARACTERSET','NLS......