DG环境中,主库执行的查询操作,是否会应用到备库上?

昨天被问到这个问题,回来就整理了一下相关的资料:
我们知道,dg的原理,就是在备库上应用主库生成的redo日志,从而使得备库能够准实时的保持与主库一致的状态。
那么,执行查询操作,会生成redo么?

我们来做试验。

创建用户名居然错误,去查询官方文档,说明如下:
ORA-65096: invalid common user or role name
Cause: An attempt was made to create a common user or role with a name that wass not valid for common users or roles. In addition to the usual rules for user and role names, common user and role names must start with C## or c## and consist only of ASCII characters.
Action: Specify a valid common user or role name.

执行计划

可见,一般的查询,不会生成redo。

但是,这并不代表所有的查询操作都不会生成redo。
数据块上有一个ITL事务槽的结构,每次进行一个事务的时候,需要在修改的块上申请到一个事务槽。事务槽记录着事务占用的回滚段,事务的状态等信息,事务所修改的记录还存在锁定位信息,因此在事务提交后,需要清除这些信息。清除的内容主要为在ITL事务槽里的事务提交标志与提交SCN,清除记录的锁定位信息。
但是ORACLE有一个规则,如果修改的数据块超过BUFER CACHE的约10%,或者数据块已经不在BUFFER CACHE里了,那么会进行延迟块清除,清除的这个过程也会导致数据块的变化,因此会记录日志。
也就是说,当你下次对这些块进行操作的时候,oracle会自动执行块清除操作。如果接下来你对这些块进行查询操作的时候,本身查询并不会生成redo信息,但是会触发块清除操作,而这种操作显然是要修改块的内容的,因此会生成redo信息。

继续做试验

执行计划

此时生成了184bytes的redo。

因此,在dg环境下,主库上通常的查询操作不会产生redo信息,也就没有什么在备库应用的可能了。但是特定情况下,查询会触发数据库生成redo的动作,而这些信息,显然是会被传输到备库上并应用的。

Posted in Oracle.