根据不同的场景需求,Oracle Data Guard 提供三种数据保护模式(Data Protection Mode ):最大可用性、最大性能和最大保护。
-
Maximum Availability(最大可用性)
这种保护模式可提供*别的数据保护,而不会影响主数据库的可用性。最大可用性模式下,事物提交需要等到恢复这些事务所需的所有重做数据都已写入在线重做日志并且完成如下步骤之一(基于用户配置):
-
备库已收到redo日志,备库redo日志的刷盘I/O 已启动,并将确认信息发送回主
-
备库已接收并在磁盘写入redo日志,并将确认信息发送回主
如果主数据库没有收到来自至少一个同步备用数据库的确认,那么它就像处于最高性能模式一样运行以保持主数据库的可用性,直到它再次能够将其重做流写入同步备用数据库。
如果主数据库出现故障,则此模式可确保不会发生数据丢失,前提是 Oracle Data Guard 配置中至少有一个同步备用数据库。
一旦 Oracle Data Guard 将重做数据写入备用重做日志文件中的持久存储,主数据库上的事务就被视为受到保护。一旦完成,确认会迅速返回到主数据库,以便它可以继续进行下一个事务。这最大限度地减少了同步传输对主数据库吞吐量和响应时间的影响。要充分受益于备用数据库上完整的 Oracle Data Guard 验证,请确保在实时应用模式下运行,以便在收到重做更改后尽快将其应用到备用数据库。Oracle Data Guard 会向检测到的任何损坏发出信号,以便立即采取纠正措施。
最大可用性模式下的性能与保护
使用最大可用性模式时,需要了解LOG_ARCHIVE_DEST_
n
属性的SYNC
/AFFIRM
与SYNC
/ NOAFFIRM
(FastSync) 两种模式。
当使用SYNC/AFFIRM
执行传输时,主数据库执行写操作并等待确认redo日志已同步传输到物理备用数据库并写入磁盘。性能代价为需要完成redo日志的I/O。
当使用SYNC/NOAFFIRM
执行传输时,主节点执行写操作并仅等待确认数据已在备用节点上接收到,而不是已写入磁盘。
举个栗子:
假定主节点遇到灾难性故障,同时备用站点断电,在这种情况下:
SYNC/AFFIRM,
数据已经写入备库磁盘,不会丢失数据,在系统恢复时,数据将在备库磁盘上可用。
在SYNC/NOAFFIRM,
没有检查数据已写入备库磁盘的情况下,可能会丢失一些数据。
Maximum Performance(最大性能)
这种保护模式可提供*别的数据保护,而不会影响主数据库的性能。这是通过允许事务redo日志在写入在线日志后立即提交来实现的。redo日志也会写入一个或多个备用数据库,但这与事务提交是异步完成的,因此主数据库性能不受传输redo日志和从备用数据库接收确认消息所需时间的影响。
此保护模式提供的数据保护比最大可用性模式略少,并且对主数据库性能的影响最小。
这是Oracle默认的保护模式。
Maximum Protection(最大保护)
最大保护类似于最大可用性,但在发生多个故障事件时提供额外级别的数据保护。与允许主数据库在无法从备用数据库接收确认时继续处理的最大可用性不同,最大保护会关闭主数据库而不是允许它继续处理不受保护的事务。
由于这种数据保护模式将数据保护优先于主库可用性,因此Oracle建议至少使用两个备库来保护以最大保护模式运行的主库,以防止单个备库故障导致主库关闭。
Oracle如何配置数据保护模式
执行以下步骤设置主数据库的数据保护模式:
1、选择满足您的可用性、性能和数据保护要求的数据保护模式。
2、验证至少一个备用数据库满足所需数据保护模式的redo日志传输要求。
3、验证DB_UNIQUE_NAME
数据库初始化参数是否已在主数据库和每个备用数据库上设置为唯一值。
4、验证是否LOG_ARCHIVE_CONFIG
已在主数据库和每个备用数据库上定义了数据库初始化参数,并且其值包括一个包含主数据库和每个备用数据库的DB_UNIQUE_NAME的DG_CONFIG列表。
以下示例 SQL 语句配置LOG_ARCHIVE_CONFIG
参数:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG=‘DG_CONFIG=(CHICAGO,BOSTON)‘;
5、通过在主数据库上执行以下 SQL 语句来设置数据保护模式:
SQL> ALTER DATABASE - > SET STANDBY DATABASE TO MAXIMIZE {AVAILABILITY | PERFORMANCE | PROTECTION};
注意:MAXIMUM
PROTECTION
只有在当前数据保护模式为MAXIMUM
AVAILABILITY
并且至少有一个同步的备库时才能设置。
6、对主数据库执行以下查询以确认它在新的保护模式下运行:
SQL> SELECT PROTECTION_MODE FROM V$DATABASE;