DataGuard 架构和概念整理

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 进程(传重做日志)
      • ASYNC 模式:
        • 主库:只要有新的重做日志产生,LGWR 进程将触发 LNSn(Log Network Server)进程把新生成的重做日志传输到备库。
        • 备库:RFS 进程负责接收日志。接收到日志后将其写入 standby 重做日志,如果备库开启了实时应用,就立即做日志应用,如果没有开启,则等 standby 重做日志归档后再应用。
      • SYNC 模式(不建议,会影响生产):
        • 主库:redo log buffer 中只要有新的变更产生,LGWR 进程将触发 LNSn 进程把新生成的重做日志传输到备库。
        • 备库:RFS 进程负责接收日志。接收到日志后将其写入 standby 重做日志,如果备库开启了实时应用,就立即做日志应用,如果没有开启,则等 standby 重做日志归档后再应用。这种方式备库需要给主库一个回复,证明传输成功,如果有问题一直不回复就会导致主库的 LGWR 进程一直挂起,影响主库。
  • FAL(Fetch Archive Log)进程
    • 用于解决主库产生的连续归档日志在备库接受时不连续的问题。
    • 通过 fal_clientfal_server 参数进行交互。
    • 当主库的某些日志没有成功发送到备库时,会发生归档裂缝(Archive Gap),缺失的日志就是裂缝(Gap)。
    • DG 能够自动检测并解决归档裂缝,不需要 DBA 的介入,但需要配置 fal_clientfal_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)的时间。

      sql 复制代码
      ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
    • 非实时应用:在主库发生日志切换,触发备库归档操作,归档完成后触发恢复。

      sql 复制代码
      ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
5. DataGuard 三种保护模式及转换
  • 最大保护(Maximum Protection)

    • 保证主库和备库的同步,任何情况下主库的损毁都不会导致已提交数据的丢失。
    • 如果主库和备库之间的网络出现问题,或者备库本身出现问题,都会导致主库宕机。
    • 要求主库必须配置 Standby RedoLog,而备库必须使用 LGWR,SYNC,AFFIRM 方式归档到 Standby Database。
    sql 复制代码
    ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
  • 最大可用(Maximum Availability)

    • 保证主库和备库的同步,与最大保护的区别在于当网络或备库不可用时,主库仍可以继续使用。
    • 正常情况下,主备库之间是同步的。当网络或者备库出现问题时,不会影响到主库的宕机,主库会自动转换为最高性能模式,等待备库可用时,将归档传输到备库做恢复。
    sql 复制代码
    ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
  • 最大性能(Maximum Performance)

    • 缺省模式,主库和备库是异步的。这种模式可能在主库出现损坏时,丢失一部分数据。
    • 保证主库性能最大化,主备库之间数据是异步传输的。即主库日志归档以后才会传输到备用库,在备库上使用归档日志文件做恢复操作。
    sql 复制代码
    ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
  • 模式转换

    • 转换为最高可用:

      sql 复制代码
      ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
    • 转换为最大性能:

      sql 复制代码
      ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
    • 转换为最大保护:

      sql 复制代码
      ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
6. 总结
  • 关于 DataGuard 的架构和概念主要是需要搞懂日志的传输、接收及应用。
  • 建议阅读官方文档及《Oracle Data Guard 11g 完全参考手册》。
相关推荐
leegong231114 小时前
Oracle、PostgreSQL该学哪一个?
数据库·postgresql·oracle
夜光小兔纸4 小时前
Oracle 普通用户连接hang住处理方法
运维·数据库·oracle
步、步、为营19 小时前
解锁.NET配置魔法:打造强大的配置体系结构
数据库·oracle·.net
MasterNeverDown1 天前
解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误
数据库·postgresql·oracle
limts1 天前
Oracle之开窗函数使用
数据库·oracle
张飞光1 天前
MongoDB 创建数据库
数据库·mongodb·oracle
码农丁丁1 天前
为什么数据库不应该使用外键
数据库·mysql·oracle·数据库设计·外键
青灯文案12 天前
Oracle 数据库常见字段类型大全及详细解析
数据库·oracle
雾里看山2 天前
【MySQL】数据库基础知识
数据库·笔记·mysql·oracle
码农研究僧2 天前
Oracle SQL: TRANSLATE 和 REGEXP_LIKE 的知识点详细分析
数据库·sql·oracle·translate·regexp_like