1. DataGuard 概述
- 定义:DataGuard 是一种保障数据安全的高可用架构,通过搭建与主数据库同步的备用数据库,提供 Oracle 数据库的容灾、数据保护、故障恢复等功能,实现数据库快速切换与灾难性恢复。
- 原理:日志文件从主库传输到备库,然后在备库上应用这些日志,从而使备库与主库保持同步。
- 组成 :由一个 primary 数据库及一个或多个 standby 数据库组成,备库最多 9 个。
- 主库:即被大部分应用访问的生产数据库,可以是单实例数据库或 RAC。
- 备库:备库也支持单机或 RAC,备库正常为只读状态。
2. DataGuard 分类
- 物理 DataGuard :
- 应用的是主库的归档日志,无论从逻辑结构和物理结构都与主库保持一致。
- 通过块拷贝方式同步,使用数据库 recovery 恢复功能来应用主库的更改。
- 通过接收并应用主库的 redo log 以介质恢复的方式 (Redo Apply) 实现同步。
- 逻辑 DataGuard :
- 应用的是主库归档日志中提取的 SQL 语句,只需保证逻辑结构一致。
- 通过接收 primary 数据库的 redo log 并转换成 SQL 语句,然后在 standby 数据库上执行 SQL 语句 (SQL Apply) 实现同步。
3. 日志传输
- 概念:DataGuard 数据同步过程分为三个阶段:日志传输、日志接收、日志应用。
- 传输方式 :
- ARCH 进程(传归档日志) :
- 主库:产生日志后通过 LGWR 进程写入在线重做日志,当满足相关条件后在线重做日志会进行切换,ARC0 进程归档该日志至主库本地的归档目录 (
log_archive_dest_1
配置),归档完成后,ARC1 进程将归档日志传输到备库 (log_archive_dest_2
配置)。 - 备库:备库 RFS 进程负责接收日志。如果备库有 standby 重做日志,则把日志复制到 standby 重做日志,接着把 standby 重做日志归档至备库本地归档目录,最后应用归档日志;如果没有配置 standby 重做日志,RFS 进程接收日志后直接放到备库的归档目录下,再应用该日志。
- 主库:产生日志后通过 LGWR 进程写入在线重做日志,当满足相关条件后在线重做日志会进行切换,ARC0 进程归档该日志至主库本地的归档目录 (
- LGWR 进程(传重做日志) :
- ASYNC 模式:
- 主库:只要有新的重做日志产生,LGWR 进程将触发 LNSn(Log Network Server)进程把新生成的重做日志传输到备库。
- 备库:RFS 进程负责接收日志。接收到日志后将其写入 standby 重做日志,如果备库开启了实时应用,就立即做日志应用,如果没有开启,则等 standby 重做日志归档后再应用。
- SYNC 模式(不建议,会影响生产):
- 主库:redo log buffer 中只要有新的变更产生,LGWR 进程将触发 LNSn 进程把新生成的重做日志传输到备库。
- 备库:RFS 进程负责接收日志。接收到日志后将其写入 standby 重做日志,如果备库开启了实时应用,就立即做日志应用,如果没有开启,则等 standby 重做日志归档后再应用。这种方式备库需要给主库一个回复,证明传输成功,如果有问题一直不回复就会导致主库的 LGWR 进程一直挂起,影响主库。
- ASYNC 模式:
- ARCH 进程(传归档日志) :
- FAL(Fetch Archive Log)进程 :
- 用于解决主库产生的连续归档日志在备库接受时不连续的问题。
- 通过
fal_client
和fal_server
参数进行交互。 - 当主库的某些日志没有成功发送到备库时,会发生归档裂缝(Archive Gap),缺失的日志就是裂缝(Gap)。
- DG 能够自动检测并解决归档裂缝,不需要 DBA 的介入,但需要配置
fal_client
和fal_server
参数。
4. 日志接收及应用
-
日志接收:
- 备库使用 RFS(Remote File Server)进程接收日志,接收到日志后,就把日志写到 standby redo log(如果有这个就先写这个,没有这个就直接写 archived log 文件中)或者 archived log 文件中。
- 如果写到 standby redo log 文件中,则当主库发生日志切换时,也会触发备库上的 standby redo log 的日志切换,并把这个 standby redo log 归档。
-
日志应用:
- 应用接收到的主库日志,实现主备库的数据同步。
- 物理备库:使用 MRP(Managed Recovery Process)进程应用日志。
- 逻辑备库:使用 LSP(Logical Standby Process)进程应用日志。
-
日志应用模式:
- Redo 应用:物理备库数据库专用,通过介质恢复的方式保持与 primary 数据库的同步。
- SQL 应用:逻辑备库数据库专用,核心是通过 LogMiner 分析出 SQL 语句在 standby 端执行。
-
日志应用服务:
-
实时应用(Real-time Apply):必须使用 standby redo log,每当日志被写入 standby redo log 时,就会触发恢复。这种方式可以减少数据库切换(switchover 或 failover)的时间。
sqlALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
-
非实时应用:在主库发生日志切换,触发备库归档操作,归档完成后触发恢复。
sqlALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
-
5. DataGuard 三种保护模式及转换
-
最大保护(Maximum Protection):
- 保证主库和备库的同步,任何情况下主库的损毁都不会导致已提交数据的丢失。
- 如果主库和备库之间的网络出现问题,或者备库本身出现问题,都会导致主库宕机。
- 要求主库必须配置 Standby RedoLog,而备库必须使用 LGWR,SYNC,AFFIRM 方式归档到 Standby Database。
sqlALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
-
最大可用(Maximum Availability):
- 保证主库和备库的同步,与最大保护的区别在于当网络或备库不可用时,主库仍可以继续使用。
- 正常情况下,主备库之间是同步的。当网络或者备库出现问题时,不会影响到主库的宕机,主库会自动转换为最高性能模式,等待备库可用时,将归档传输到备库做恢复。
sqlALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
-
最大性能(Maximum Performance):
- 缺省模式,主库和备库是异步的。这种模式可能在主库出现损坏时,丢失一部分数据。
- 保证主库性能最大化,主备库之间数据是异步传输的。即主库日志归档以后才会传输到备用库,在备库上使用归档日志文件做恢复操作。
sqlALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
-
模式转换:
-
转换为最高可用:
sqlALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
-
转换为最大性能:
sqlALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
-
转换为最大保护:
sqlALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
-
6. 总结
- 关于 DataGuard 的架构和概念主要是需要搞懂日志的传输、接收及应用。
- 建议阅读官方文档及《Oracle Data Guard 11g 完全参考手册》。