基本介绍
Oracle Data Guard 提供了三种不同的数据保护模式,每种模式在数据保护级别和性能之间提供了不同的平衡。
1. 最大性能模式 (Maximum Performance)
- 特点:
- 主库性能最大化。
- 主备库之间数据异步传输。
- 主库日志归档后才会传输到备库。
- 事务可以随时提交,但主库的 redo 数据需要至少写入一个 standby 数据库(不同步)。
- 优点:
- 避免了从库对主数据库的性能和可用性影响。
- 缺点:
- 如果与主库提交的事务相关的恢复数据没有发送到从库,这些事务数据将被丢失,不能保证数据无损失。
2. 最高可用模式 (Maximum Availability)
- 特点:
- 正常情况下,主备库之间是同步的。
- 当网络或备库出现故障时,不会影响主库的宕机。
- 主库会自动切换为最大性能模式,等待备库可用时,再将归档传输到备库做恢复。
- 优点:
- 在没有问题出现的情况下保证从库没有数据丢失,是一种折中的方法。
- 缺点:
- 在正常运行的过程中,主库的性能受到诸多因素的影响。
3. 最大保护模式 (Maximum Protection)
- 特点:
- 主备库之间数据是同步的。
- 主库提交 commit 的同时,备库会做相应的恢复。
- 最大限度保证了数据的完整性,不允许数据的丢失。
- 优点:
- 该模式可以保证从库没有数据丢失。
- 缺点:
- 主库找不到合适的从库写入时,主库会自动关闭,防止无保护的数据出现。
- 对网络等客观条件要求非常高,主库的性能会受到非常大的影响。
注意:最大保护模式和最高可用模式需要至少一个 standby 数据库 redo 数据被同步写入。
三种保护模式的特点
1. 最大保护模式
- 数据保护能力:提供最高级别的数据保护能力。
- 重做日志同步:重做日志在至少一个物理从库数据库后,主库的事务才能够提交。
- 主库行为:主库找不到合适的从库写入时,主库会自动关闭,防止无保护的数据出现。
- 优点:可以保证从库没有数据丢失。
- 缺点:主库的自动关闭会影响到主库的可用性,同时需要从库恢复后才能提交,对网络等客观条件要求非常高,主库的性能会受到非常大的影响。
2. 最高可用模式
- 数据保护能力:提供仅次于“最大保护模式”的数据保护能力。
- 重做日志同步:重做日志在至少一个物理从库数据库后,主库的事务才能够提交。
- 主库行为:主库找不到合适的从库写入时,主库不会关闭,而是临时降低到“最大性能模式”,直到问题得到处理。
- 优点:可以在没有问题出现的情况下保证从库没有数据丢失,是一种折中的方法。
- 缺点:在正常运行的过程中,主库的性能受到诸多因素的影响。
3. 最大性能模式
- 默认模式:提供主数据库的最高可用性。
- 主库行为:保证主库运行过程中不受从库的影响,主库事务正常提交,不因从库的任何问题影响到主库的运行。
- 优点:避免了从库对主数据库的性能和可用性影响。
- 缺点:如果与主库提交的事务相关的恢复数据没有发送到从库,这些事务数据将被丢失,不能保证数据无损失。
日志传输方式
两种日志传输方式
- ARC 进程传输日志:
- 主库:日志先写入在线重做日志,当在线重做日志满后(或人为切换),ARC0 进程归档该日志至主库本地归档目录,归档完成后,ARC1 马上将该归档日志传输到备库。
- 备库:RFS 进程接收日志,如果备库有 Standby 重做日志,则把日志复制到 Standby 重做日志,接着把 Standby 重做日志归档至备库本地归档目录,最后应用归档日志;如果没有配置 Standby 重做日志,RFS 进程接收日志后,直接把它放到备库的归档目录下,再应用该日志。
- LGWR 进程传输日志:
- 主库:只要有新的重做日志产生,LGWR 进程将触发 LNSn 进程把新生成的日志传输到备库。
- 备库:RFS 进程接收到日志后,将其写入 Standby 重做日志,如果备库开启了实时应用,就立即做日志应用,如果没有开启,则等 Standby 重做日志归档后再应用。
- 区别:
SYNC
是在 redo 还在内存时,LNSn 进程就开始传输;而ASYNC
是在 redo 缓冲到 online redo log 后,LNSn 才开始传输。
从上面可以得出,从同步的实时性来看,LGWR(SYNC) > LGWR(ASYNC) > ARCH
。
三种保护模式参数配置
- 最大性能:
LGWR ASYNC NOAFFIRM
- 最大保护,最高可用:
LGWR SYNC AFFIRM
三种保护模式在出现灾难时数据丢失的风险、重做传输机制、是否需要 standby redo log 磁盘写入的区别
- 最大保护:
- 零数据丢失:
LGWR SYNC YES AFFIRM
- 零数据丢失:
- 最大可用:
- 零数据丢失:
LGWR SYNC YES AFFIRM
- 零数据丢失:
- 最大性能:
- 最小数据丢失 - 通常为几秒:
LGWR ASYNC
或ARCH
可没有,但推荐有AFFIRM
或NOAFFIRM
- 最小数据丢失 - 通常为几秒:
AFFIRM
:表示主数据库上的 REDO LOG 只有被写入到从数据库的 standby log 才算有效。
备库应用主库日志时有无 using current logfile
选项的区别
- 无 using current logfile:主库切换日志后,备库才从归档文件挖掘出变化,然后应用到库文件中。
- 有 using current logfile:备库根据接收到的 redo 信息,实时应用到备库上,即便是最大性能模式。
三种保护模式转换
如何查看数据库的主备、保护模式:
主库:
SQL> select name,open_mode,database_role,protection_mode,protection_level from v$database;NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
--------- -------------------- ---------------- -------------------- -------------------
ADGDB READ WRITE PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
备库:
SQL> select name,open_mode,database_role,protection_mode,protection_level from v$database;NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
--------- -------------------- ---------------- -------------------- -------------------
ADGDB READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
转换为最高可用模式,在备库和主库上执行:
alter database set standby database to maximize availability;
转换为最大性能模式,在备库和主库上执行:
alter database set standby database to maximize performance;
转换为最大保护模式,在备库和主库上执行:
alter database set standby database to maximize protection;
例子:将DataGuard从默认的最大性能模式切换为最高可用模式
(1)备库
查询备库的保护模式:
SQL> select name,db_unique_name,open_mode,database_role,protection_mode,protection_level from v$database;NAME DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
--------- ------------------ -------------------- ---------------- -------------------- -------------------
ADGDB adgdbstandby READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
修改备库的保护模式:
SQL> alter database set standby database to maximize availability;Database altered.
再次查看备库的Dataguard
SQL> select name,open_mode,database_role,protection_mode,protection_level from v$database;NAME DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL--------- ------------------ -------------------- ---------------- -------------------- --------------------ADGDB adgdbstandby READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
(2)主库
查询主 库的保护模式:
SQL> select name,db_unique_name,open_mode,database_role,protection_mode,protection_level from v$database;NAME DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL
--------- ------------------ -------------------- ---------------- -------------------- -------------------
ADGDB adgdb READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
修改主库的保护模式:
SQL> alter database set standby database to maximize availability;Database altered.
再次确认,DataGuard的保护模式已经变为了maximum availability:
SQL> select name,open_mode,database_role,protection_mode,protection_level from v$database;NAME DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL--------- ----------------- ----------- ------------- -------------------- --------------------ADGDB adgdb READ WRITE PRIMARY MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY