dataguard不传输日志的问题

搭建一个两地三中心的dataguard,主库,本地dg已经搭建好,一直工作正常。但是在搭建一个远程dg的时候,收到告警说,主库和本地dg的同步已经断了好几个小时。

难道我搭建远程dg库,对主库有影响?于是进行分析。找到了初步的原因,是因为在搭建远程dg的时候,需要修改主库的log_archive_config配置,正确的配置应该是ç=’DG_CONFIG=(imdb,imdbdg,imdb01)’ ,不小心配错成了:log_archive_config=’DG_CONFIG=(erp,erpdg,imdb01)’ SCOPE=BOTH; 而erp和erpdg没有配置在tnsnames中的,所以自然连不到这2个库,日志自然就传不过去了。

于是,我修改了log_archive_config=’DG_CONFIG=(imdb,imdbdg,imdb01)’,将其修改成正确的配置,发现日志还是无法传输到备库。

分析对于这种涉及多个库的问题,我们一般会画一个表格,纵坐标按照时间排序,横坐标按照主机排序。

我发现在3月3日中午12:01:50的时候,运行了

ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/oradata/imdb/archivelog  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=imdbdg' SCOPE=BOTH

此时的DB_UNIQUE_NAME=imdbdg,而之前,这个参数一直是log_archive_dest_1=’LOCATION=/u01/app/oracle/oradata/imdb/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) ,没有带上DB_UNIQUE_NAME。从3月3日11:39的alertlog启动日志也可以看到,dest1参数中,是显示:DB_UNIQUE_NAME=imdb

其后,在12:25:17的时候,又改回成了不带DB_UNIQUE_NAME的log_archive_dest_1:

ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/oradata/imdb/archivelog' SCOPE=BOTH;

但是此时,日志还未恢复传输,直到12:34:28,在主库运行:

ALTER SYSTEM SET log_archive_dest_2='SERVICE=imdbdg  ASYNC VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=imdbdg' SCOPE=BOTH;

之后,才恢复了正常的传输。(但是传输只是传这个时间点之后,之前的日志,还是需要手工scp过去)。

经过分析,我推测如下:
 1. 之前备库配置一直是错误的配置,log_archive_dest_1中没有显式的加上DB_UNIQUE_NAME=imdbdg的参数。
 2. 但是平时传的都是redo log,实时apply,所以没有问题
 3. 当配置错误了DB_UNIQUE_NAME=imdbdg,造成归档传输中断,无法续接上去。
 4. 修改备库log_archive_dest_1,显式的加上DB_UNIQUE_NAME,但是还不能恢复续传。需要主库修改恢复一下log_archive_dest_2,才能正常续传过去。此时主库未操作log_archive_dest_2,所以没有续传。
 5. 再次设置不含DB_UNIQUE_NAME的log_archive_dest_1,但是此时的log_archive_dest_1是会继承前一次的配置,也就包含了DB_UNIQUE_NAME。
 6. 在主库修改恢复log_archive_dest_2,传输被触发,恢复正常传输。

上述推测,找了一个测试库验证了一下,果然如此。

备库的log_archive_dest_1这个参数,应该显式的加上DB_UNIQUE_NAME,如果没有显式加上,用的将会是上一次的配置。

1. 如果上次配置有显式指定DB_UNIQUE_NAME=imdb,那么取消DB_UNIQUE_NAME之后的含义是用DB_UNIQUE_NAME=imdb
2. 如果上次配置有显式指定DB_UNIQUE_NAME=imdbdg,那么取消DB_UNIQUE_NAME之后的含义是用DB_UNIQUE_NAME=imdbdg。

值得一提的是,在官方文档的dataguard的安装,是需要显式加上DB_UNIQUE_NAME的。但是官方文档没说,如果不显式加上DB_UNIQUE_NAME,将会是一个怎么样的行为。

其次,需要提醒的是,如果备库的log_archive_dest_1修改正确之后,需要在主库修改一下log_archive_dest_2,触发日志续传。

最后,续传只是续传那些恢复正确配置之后的日志,错误配置时间段内断开的日志,还是需要手工scp过去。

Show your support

Clapping shows how much you appreciated 小荷’s story.