DataGuard的基本原理
当某次事务处理对生产数据库中的数据作出更改时,Oracle数据库将在一个联机重做日志文件中记录此次更改。在DataGuard中可以配置写日志的这个过程,除了把日志记录到本地的联机日志文件和归档日志文件中,还可以通过网络,把日志信息发送到远程的从数据库服务器上。这个备用日志文件写入过程可以是实时、同步的,以实现零数据丢失(最大保护模式);也可以是异步的,以减少对网络带宽的压力(最大性能模式);或者是异步和同步可以自动切换的模式(最大可用模式)。当备份数据库接收到日志信息后,Data Guard可以自动利用日志信息实现数据与主数据库的实时同步。当主数据库打开并处于活动状态时,备用数据库可以执行恢复操作,如果主数据库出现了故障,备用数据库即可以被激活并接管生产数据库的工作

三种模式的特点
保护模式 在出现灾难时数据丢失的风险 重做传输机制 是否需要standby redo log 磁盘写入
最大保护 零数据丢失 LGWR SYNC YES AFFIRM
最高可用性 零数据丢失 LGWR SYNC YES AFFIRM
最高性能 最小数据丢失 — 通常为几秒 LGWR ASYNC 或 ARCH  可没有但推荐有 AFFIRM or NOAFFIRM

AFFIRM:表示主数据库上的REDO LOG只有被写入到从数据库的standby log才算有效

最大保护模式
最大保护模式为主数据库提供了最高水平的数据保护,从而确保了一个全面的零数据丢失灾难恢复解决方案。当在最大保护模式下运行时,重做记录由日志写入器 (LGWR) 进程从主数据库同步地传输到备用数据库,并且直到确认事务数据在至少一个备用服务器上的磁盘上可用时,才在主数据库上提交事务。强烈建议,这种模式应至少配置两个备用数据库。当最后参与的备用数据库不可用时,主数据库上的处理将停止。这就确保了当主数据库与其所有备用数据库失去联系时,不会丢失事务。

由于重做传输的同步特性,这种最大保护模式可能潜在地影响主数据库响应时间。可以通过配置一个低延迟网络,并为它分配足够应付高峰事务负载的带宽来将这种影响减到最小。需要这种最大保护模式的企业有股票交易所、货币交易所、金融机构等。

最高可用性模式
最高可用性模式拥有仅次于最高水平的主数据库数据可用性。如同最大保护模式一样,重做数据由 LGWR 从主数据库同步地传输到备用数据库,直到确认事务数据在备用服务器的磁盘上可用时,事务才在主数据库上完成。不过,在这种模式下(与最大保护模式不同),如果最后参与的备用数据库变为不可用 — 例如由于网络连接问题,处理将在主数据库上继续进行(类似于MySQL-5.5中的半同步复制)。备用数据库与主数据库相比,可能暂时落在后面,但当它再次变为可用时,备用数据库将使用主数据库上累积的归档日志自动同步,而不会丢失数据。

由于同步重做传输,这种保护模式可潜在地影响响应时间和吞吐量。可以通过配置一个低延迟网络,并为它分配足够应付高峰事务负载的带宽来将这种影响减到最小。

最高可用性模式适用于想要确保获得零数据丢失保护,但不想让生产数据库受网络/备用服务器故障影响的企业。如果又一个故障随后影响了生产数据库,然后最初的网络/备用服务器故障得到解决,那么这些企业将接受数据丢失的可能性。

最高性能模式
最高性能模式是默认的保护模式。它与最高可用性模式相比,提供了稍微少一些的主数据库数据保护,但提供了更高的性能。在这种模式下,当主数据库处理事务时,重做数据由 LGWR 进程异步传输到备用数据库上。另外,也可以将主数据库上的归档器进程 (ARCH) 配置为在这种模式下传输重做数据。在任何情况下,均先完成主数据库上的写操作,主数据库的提交操作不等待备用数据库确认接收(类似于MySQL中的异步复制)。如果任意备用目标数据库变为不可用,则处理将在主数据库上继续进行,这对性能只有很小的影响或没有影响。

在主数据库出现故障的情况下,尚未被发送到备用数据库的重做数据会丢失。但是,如果网络有足够的吞吐量来跟上重做流量高峰,并且使用了 LGWR 进程来将重做流量传输到备用服务器,则丢失的事务将非常少或者为零。

DataGuard的过程介绍


从上图,我们可以很清晰的发现DataGuard和没MySQL 中的复制有很大的相似之处。

Redo Transport Services:自动的把主数据库上的Redo Log传输到从数据库上,可以是LGWR 进程也可以是ARCH 进程,所以重点要关注LOG_ARCHIVE_DEST的配置!

Apply Services:从数据库将接受到的Redo Log进行Apply。这里分为两种情况,一种是实时,一种是非实时的。
实时的是:只要从数据库接受到主数据库传输过来的Redo Log,就马上执行之。实时的话,从数据库上面必须创建standby redo log。
非实时:对于主数据库传输过来的Redo Log,并不会马上执行, 而是在主数据库上的在线日志归档之后才会执行之,非实时是默认情况。

standby redo log:其实就是在从库上的主库的日志,对于最大可用和最大保护模式,会先写到standby redo log中。下面是官方最为权威的解释。

A standby redo log is similar to an online redo log, except that a standby redo log is used to store redo data received from another database.
A standby redo log is required if you want to implement:
1、The maximum protection and maximum availability levels of data protection
2、Real-time apply (If the real-time apply feature is enabled, log apply services can apply redo data as it is received, without waiting for the current standby redo log file to be archived. This results in faster switchover and failover times because the standby redo log files have been applied already to the standby database by the time the failover or switchover begins.
3、Cascaded destinations (To reduce the load on your primary system, you can implement cascaded destinations, whereby a standby database receives its redo data from another standby database, instead of directly from the primary database.)
A standby redo log provides a number of advantages:
1、Standby redo log files can reside on raw devices, which may be important if either or both the primary and standby databases reside in a Real Application Clusters environment.
2、Standby redo log files can be multiplexed using multiple members, improving reliability over archived log files.
3、During a failover, Data Guard can recover and apply more redo data from standby redo log files than from the archived log files alone.
4、The archiver (ARCn) process or the log writer (LGWR) process on the primary database can transmit redo data directly to remote standby redo log files, potentially eliminating the need to register a partial archived log file (for example, to recover after a standby database crashes)

standby redo log创建的原则:

standby redo log最好在主从数据库上都创建,这样方便主从数据库切换
standby redo log的文件大小与primary 数据库online redo log 文件大小相同
standby redo log日记 文件组的个数依照 下面的原则决定
Standby redo log组数公式>=(每个instance日记 组个数+1)*instance个数
假设有一个节点,这个节点有三组redo log,那么 Standby redo log组数公式>=(3+1)*1=4,所以需要创建4组Standby redo log,多实例主要是在RAC 环境下。