找回密码
 立即注册
首页 业界区 安全 Data Guard实时应用(Real-Time Apply)总结

Data Guard实时应用(Real-Time Apply)总结

司空娅玲 昨天 21:55
实时应用(Real-Time Apply)概述

早期的数据库版本,DG的备库默认只应用归档日志做MRP,备库的数据同步只能在主库发生日志切换时。从Oracle 10g开始,提供了实时应用(Real-Time Apply)特性,有些文章/资料翻译为[实时日志应用]/[实时应用日志].只要主库产生的重作日志直接经备库的RFS进程写入到备库的standby redo log file,备库的MRP进程(即介质恢复进程)会立即直接应用到备库。
官方文档描述:
Real-Time Apply is a new feature in 10g that enables the log apply services to apply redo data (physical standby database) or
SQL (logical standby database) as it is received from Primary database 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 are applied to the standby
database before failover or switchover begins.
实时应用日志的好处

  • DG更快速的切换与故障转移操作。
  • 物理备库以只读模式打开后,可立即获取实时数据。
  • 借助 Active Data Guard(Oracle 11g 新特性),在逻辑备库和物理备库上实现实时报表生成。
  • 支持使用更大的日志文件。结合实时应用功能(Real Time Apply),使用更大的日志文件是更优选择,因为应用服务在单个日志文件上的运行时间会更长,日志切换的开销对实时应用进程的影响也会更小。
检查DG是否实时应用

方法1:
  1. set linesize 255 pagesize 60
  2. col dest_name for a20;
  3. col recovery_mode for a36
  4. select dest_name , status , recovery_mode from v$archive_dest_status;
  5. set linesize 255 pagesize 60
  6. col dest_name for a20;
  7. col recovery_mode for a36
  8. select dest_name , status , recovery_mode from v$archive_dest_status
  9. where dest_id<=2;
复制代码
备库查询:
  1. SQL> set linesize 255
  2. SQL> col dest_name for a20;
  3. SQL> col recovery_mode for a36
  4. SQL> select dest_name , status , recovery_mode from v$archive_dest_status;
  5. DEST_NAME            STATUS    RECOVERY_MODE
  6. -------------------- --------- ------------------------------------
  7. LOG_ARCHIVE_DEST_1   VALID     IDLE
  8. LOG_ARCHIVE_DEST_2   VALID     MANAGED REAL TIME APPLY WITH QUERY
  9. LOG_ARCHIVE_DEST_3   INACTIVE  IDLE
  10. ..................................................................
  11. SQL>
复制代码
方法2: 查看物理备库日志进程的状态:
  1. SQL> set linesize 255
  2. SQL> col dest_name for a20;
  3. SQL> col recovery_mode for a36
  4. SQL> select dest_name , status , recovery_mode from v$archive_dest_status;
  5. DEST_NAME            STATUS    RECOVERY_MODE
  6. -------------------- --------- ------------------------------------
  7. LOG_ARCHIVE_DEST_1   VALID     MANAGED REAL TIME APPLY
  8. LOG_ARCHIVE_DEST_2   INACTIVE  IDLE
  9. LOG_ARCHIVE_DEST_3   INACTIVE  IDLE
  10. ..................................................................
复制代码
物理主库执行结果:
  1. set linesize 255
  2. col process for a16
  3. col status for a20
  4. select process, status, thread#, sequence#, block#, blocks from v$managed_standby order by 1;
复制代码
物理备库执行结果:
  1. SQL> set linesize 255
  2. SQL> col process for a16
  3. SQL> col status for a20
  4. SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby order by 1;
  5. PROCESS          STATUS                  THREAD#  SEQUENCE#     BLOCK#     BLOCKS
  6. ---------------- -------------------- ---------- ---------- ---------- ----------
  7. ARCH             CLOSING                       1        409     700416       1117
  8. ARCH             CLOSING                       1        408     704512        966
  9. ARCH             CLOSING                       1        406     704512       1429
  10. ARCH             CLOSING                       1        407     702464         87
  11. DGRD             ALLOCATED                     0          0          0          0
  12. DGRD             ALLOCATED                     0          0          0          0
  13. DGRD             ALLOCATED                     0          0          0          0
  14. DGRD             ALLOCATED                     0          0          0          0
  15. LNS              WRITING                       1        410      85917          1
  16. 9 rows selected.
  17. SQL>
复制代码
注意: 备库执行此SQL语句.从v$managed_standby这个视图看,备库MRP进程(MRP0)的STATUS是APPLYING_LOG则表示实时应用,并且主库LNS 进程是WRITING则是实时应用;
备库MRP进程STATUS是WAIT_FOR_LOG是非实时应用.(实时应用是用LNS进程发送日志,非实时应用是用LGWR或者ARCH进程发送日志)
WAIT_FOR_LOG:等待日志传输,说明当前MRP进程应用归档文件进行介质恢复.
一般来说,备库如果没有设置SRL或RECOVERY_MODE为则意味着非实时模式.
  1. SQL> set linesize 255
  2. SQL> col process for a16
  3. SQL> col status for a20
  4. SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby order by 1;
  5. PROCESS          STATUS                  THREAD#  SEQUENCE#     BLOCK#     BLOCKS
  6. ---------------- -------------------- ---------- ---------- ---------- ----------
  7. ARCH             CLOSING                       1        409     700416       1117
  8. ARCH             CLOSING                       1        408     704512        966
  9. ARCH             CLOSING                       1        404     186368        703
  10. ARCH             CLOSING                       1        405     704512       2027
  11. DGRD             ALLOCATED                     0          0          0          0
  12. DGRD             ALLOCATED                     0          0          0          0
  13. MRP0             APPLYING_LOG                  1        410      86031     819200
  14. RFS              IDLE                          1        410      86031          1
  15. RFS              IDLE                          1          0          0          0
  16. 9 rows selected.
  17. SQL>
复制代码
[备库]启用实时应用

开启实时应用模式的条件


  • 启用ADG实时应用的前提时配置了SRL(standby redo log).
  • 数据库处于归档模式
官方文档描述:
Real-time apply requires a standby database that is configured with a standby redo log and that is in ARCHIVELOG mode.
LOG_ARCHIVE_DEST_n initialization parameter to delay applying archived redo log files to the standby database.
By default, there is no time delay. If you specify the DELAY attribute without specifying a value, then the default delay interval is 30 minutes.
物理备库(standby)实时应用日志命令:

Oracle 12.1之前的版本:
  1. SRL=NO
  2. RECOVERY_MODE = Managed : It means Redo-Apply only, Not Real Time Aapply.
复制代码
Oracle 12.1或之后的版本
  1. SQL> RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE;
  2. SQL> RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
复制代码
启用MR前台恢复进程
  1. ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
复制代码
逻辑备库(standby)实时应用日志命令:
  1. ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE;
复制代码
如果standby redo log已经存在(例如,实验过程中实时应用与非实时应用来回切换),从非实时应用切换为实时应用.如下步骤所示(备库):
  1. SQL> SQL> RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE;
  2. SQL> RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION*ERROR at line 1:ORA-01153: an incompatible media recovery is activeSQL> set linesize 255SQL> col process for a16SQL> col status for a20SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby;PROCESS          STATUS                  THREAD#  SEQUENCE#     BLOCK#     BLOCKS---------------- -------------------- ---------- ---------- ---------- ----------ARCH             CLOSING                       1        403     524288       1842DGRD             ALLOCATED                     0          0          0          0DGRD             ALLOCATED                     0          0          0          0ARCH             CLOSING                       1        405     704512       2027ARCH             CLOSING                       1        402     700416       1578ARCH             CLOSING                       1        404     186368        703RFS              IDLE                          1          0          0          0RFS              IDLE                          1        406     172049       1881MRP0             WAIT_FOR_LOG                  1        406          0          09 rows selected.--如上所示,MRP进程正在运行,必须先停掉MRP进程,然后执行命令SQL> alter database recover managed standby database cancel;Database altered.SQL> alter database recover managed standby database disconnect from session;Database altered.SQL> SQL> set linesize 255SQL> col process for a16SQL> col status for a20SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby;PROCESS          STATUS                  THREAD#  SEQUENCE#     BLOCK#     BLOCKS---------------- -------------------- ---------- ---------- ---------- ----------ARCH             CLOSING                       1        403     524288       1842DGRD             ALLOCATED                     0          0          0          0DGRD             ALLOCATED                     0          0          0          0ARCH             CLOSING                       1        405     704512       2027ARCH             CLOSING                       1        402     700416       1578ARCH             CLOSING                       1        404     186368        703RFS              IDLE                          1          0          0          0RFS              IDLE                          1        406     187241          1MRP0             APPLYING_LOG                  1        406     187241     8192009 rows selected.
复制代码
如果没有standby log的话,启用实时模式的步骤如下:

  • 检查主库是否存在standby log
  1. SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
  2. ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION
  3. *
  4. ERROR at line 1:
  5. ORA-01153: an incompatible media recovery is active
  6. SQL> set linesize 255
  7. SQL> col process for a16
  8. SQL> col status for a20
  9. SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby;
  10. PROCESS          STATUS                  THREAD#  SEQUENCE#     BLOCK#     BLOCKS
  11. ---------------- -------------------- ---------- ---------- ---------- ----------
  12. ARCH             CLOSING                       1        403     524288       1842
  13. DGRD             ALLOCATED                     0          0          0          0
  14. DGRD             ALLOCATED                     0          0          0          0
  15. ARCH             CLOSING                       1        405     704512       2027
  16. ARCH             CLOSING                       1        402     700416       1578
  17. ARCH             CLOSING                       1        404     186368        703
  18. RFS              IDLE                          1          0          0          0
  19. RFS              IDLE                          1        406     172049       1881
  20. MRP0             WAIT_FOR_LOG                  1        406          0          0
  21. 9 rows selected.
  22. --如上所示,MRP进程正在运行,必须先停掉MRP进程,然后执行命令
  23. SQL> alter database recover managed standby database cancel;
  24. Database altered.
  25. SQL> alter database recover managed standby database disconnect from session;
  26. Database altered.
  27. SQL>
  28. SQL> set linesize 255
  29. SQL> col process for a16
  30. SQL> col status for a20
  31. SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby;
  32. PROCESS          STATUS                  THREAD#  SEQUENCE#     BLOCK#     BLOCKS
  33. ---------------- -------------------- ---------- ---------- ---------- ----------
  34. ARCH             CLOSING                       1        403     524288       1842
  35. DGRD             ALLOCATED                     0          0          0          0
  36. DGRD             ALLOCATED                     0          0          0          0
  37. ARCH             CLOSING                       1        405     704512       2027
  38. ARCH             CLOSING                       1        402     700416       1578
  39. ARCH             CLOSING                       1        404     186368        703
  40. RFS              IDLE                          1          0          0          0
  41. RFS              IDLE                          1        406     187241          1
  42. MRP0             APPLYING_LOG                  1        406     187241     819200
  43. 9 rows selected.
复制代码

  • 检查归档日志信息
  1. set linesize 255
  2. col member for a40
  3. select a.group#, a.member, b.bytes FROM v$logfile a, v$standby_log b WHERE a.group# = b.group#;
复制代码

  • 新增备用重做日志(standby log)
根据实际情况新增standby log的组数,一般比归档日志多一组.
  1. set linesize 255;
  2. set pagesize 200;
  3. col "group#" for 999999
  4. col "thread#" for 9999999
  5. col status for a12
  6. col member for a48
  7. col status for a8
  8. select a.group#
  9.      , a.thread#
  10.      , a.sequence#
  11.      , b.member
  12.      , a.blocksize
  13.      , a.status
  14.      , a.bytes/1024/1024 as size_mb
  15.      , a.archived
  16. from v$log a, v$logfile b
  17. where a.group#=b.group#
  18. order by a.group#;
复制代码

  • 备库启用实时应用
  1. alter database add standby logfile group 7 'xxx/data/stand_redo01.log' size 200M;
  2. alter database add standby logfile group 8 'xxx/data/stand_redo02.log' size 200M;
  3. alter database add standby logfile group 9 'xxx/data/stand_redo03.log' size 200M;
  4. ................................................................................
复制代码

  • 检查验证实时应用是否生效.
停止实时日志应用

需要停止实时日志应用,按照非实时模式启动MRP,如下操作所示:
备库上执行:
  1. alter database recover managed standby database disconnect from session using current logfile;
复制代码
备库上检查结果
  1. alter database recover managed standby database cancel;
  2. alter database recover managed standby database using archived logfile disconnect from session;
复制代码
主库上检查结果
  1. SQL> set linesize 255
  2. SQL> col process for a16
  3. SQL> col status for a20
  4. SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby order by 1;
  5. PROCESS          STATUS                  THREAD#  SEQUENCE#     BLOCK#     BLOCKS
  6. ---------------- -------------------- ---------- ---------- ---------- ----------
  7. ARCH             CLOSING                       1        409     700416       1117
  8. ARCH             CLOSING                       1        408     704512        966
  9. ARCH             CLOSING                       1        404     186368        703
  10. ARCH             CLOSING                       1        405     704512       2027
  11. DGRD             ALLOCATED                     0          0          0          0
  12. DGRD             ALLOCATED                     0          0          0          0
  13. MRP0             WAIT_FOR_LOG                  1        410          0          0
  14. RFS              IDLE                          1        410      95010          1
  15. RFS              IDLE                          1          0          0          0
  16. 9 rows selected.
  17. SQL>
  18. SQL>
  19. SQL> set linesize 255 pagesize 60
  20. SQL> col dest_name for a20;
  21. SQL> col recovery_mode for a36
  22. SQL> select dest_name , status , recovery_mode from v$archive_dest_status
  23.   2  where dest_id<=2;
  24. DEST_NAME            STATUS               RECOVERY_MODE
  25. -------------------- -------------------- ------------------------------------
  26. LOG_ARCHIVE_DEST_1   VALID                MANAGED
  27. LOG_ARCHIVE_DEST_2   DEFERRED             IDLE
  28. SQL>
复制代码
物理standby停止实时应用日志:
  1. SQL> set linesize 255
  2. SQL> col process for a16
  3. SQL> col status for a20
  4. SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby order by 1;
  5. PROCESS          STATUS                  THREAD#  SEQUENCE#     BLOCK#     BLOCKS
  6. ---------------- -------------------- ---------- ---------- ---------- ----------
  7. ARCH             CLOSING                       1        409     700416       1117
  8. ARCH             CLOSING                       1        408     704512        966
  9. ARCH             CLOSING                       1        406     704512       1429
  10. ARCH             CLOSING                       1        407     702464         87
  11. DGRD             ALLOCATED                     0          0          0          0
  12. DGRD             ALLOCATED                     0          0          0          0
  13. DGRD             ALLOCATED                     0          0          0          0
  14. DGRD             ALLOCATED                     0          0          0          0
  15. LNS              WRITING                       1        410      95261          1
  16. 9 rows selected.
  17. SQL>
  18. SQL> set linesize 255 pagesize 60
  19. SQL> col dest_name for a20;
  20. SQL> col recovery_mode for a36
  21. SQL> select dest_name , status , recovery_mode from v$archive_dest_status
  22.   2  where dest_id<=2;
  23. DEST_NAME            STATUS               RECOVERY_MODE
  24. -------------------- -------------------- ------------------------------------
  25. LOG_ARCHIVE_DEST_1   VALID                IDLE
  26. LOG_ARCHIVE_DEST_2   VALID                MANAGED WITH QUERY
  27. SQL>
复制代码
DG 实时应用日志没有生效的原因


  • standby redo 的大小必须和redo log的大小一致.否则即使DG启动了实时应用,但是并未真正的实时应用.
  • 相关参数设置不正确.
参考资料


  • Data Guard Real-Time Apply FAQ (Doc ID 828274.1)
  • Data Guard Do Not Real-time Apply To Standby even though SRL are configured (Doc ID 2864452.1)
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册