1. 架构
在Oracle 10g 中,传输日志到备用节点数据库的进程为ARCH 和LGWR 。(在11g 中,LGWR 被LNS 替代,但10g 中是不是LGWR 我不确定!)
( 墙内: xxtp://mikixiyou.iteye.com/blog/1489087 )
在备用节点上通过参数log_archive_config 、fal_client 和fal_server 接收日志,并和主节点通讯,标识该日志是否被应用。
Data Guard 采用最大可用模式,保证数据实时同步到最少一个节点上。因为我们选择第一个备用节点作为数据实时同步点,同步进程采用LGWR 进程。
2. 配置
在一个主节点两个备用节点的Data Guard 10g 的环境中,各个节点的初始化参数的主要配置项。
在主节点的初始化参数文件配置:
*.log_archive_config='dg_config=(codb,codg,codg2)'
*.log_archive_dest_1='location=/oradata/xxcodb/archive_logs_codb'
*.log_archive_dest_2='service=codb_standby lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=codg'
*.log_archive_dest_3='service=codb_standby2 arch async affirm valid_for=(online_logfiles,primary_role) db_unique_name=codg2'
*.log_archive_dest_state_2='enable'
*.log_archive_dest_state_3='enable'
在备用节点一的初始化参数文件配置:
*.db_name='codb'
*.db_unique_name='codg'
*.fal_client='code_standby'
*.fal_server='codb_primary'
*.log_archive_config='dg_config=(codb,codg,codg2)'
*.log_archive_dest_1='location=/oradata/archivelog/ valid_for=(all_logfiles,all_roles) db_unique_name=codg'
*.log_archive_format='%t_%s_%r.dbf'
在备用节点二的初始化参数文件配置:
*.db_name='codb'
*.db_unique_name='codg2'
*.fal_client='codb_standby'
*.fal_server='codb_primary'
*.log_archive_config='dg_config=(codb,codg2)'
*.log_archive_dest_1='location=/u01/archivelog_standby/ valid_for=(all_logfiles,all_roles) db_unique_name=codg2'
*.log_archive_format='%t_%s_%r.dbf'
主节点和备用节点之间的通讯是通过Oracle Net 实现的。在参数fal_client 和fal_server 上就用到Oracle Net 中的配置信息。
在主节点的tnsnames.ora 文件中,关于DG 的配置项如下所示:
CODB_PRIMARY =
(DESCRIPTION =
( ADDRESS = (PROTOCOL = TCP)(HOST = codb1-vip.xxsc.com.cn)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = codb2-vip.xxsc.com.cn)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = codb)
)
)-
CODB_STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.219)(PORT = 1521))
)
(CONNECT_DATA =
(SID = codb)
)
)
CODB_STANDBY2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.90)(PORT = 1521))
)
(CONNECT_DATA =
(SID = codb)
)
)
在备用节点一的tnsnames.ora 文件中,关于DG 的配置项如下所示:
CODB_PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = codb1-vip.xxsc.com.cn)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = codb2-vip.xxsc.com.cn)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = codb)
)
)
CODB_STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.219)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = codb)
)
)
在备用节点二的tnsnames.ora 文件中,关于DG 的配置项如下所示:
CODB_PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = codb1-vip.xxsc.com.cn)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = codb2-vip.xxsc.com.cn)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = codb)
)
)
CODB_STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.15.90)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = codb)
)
)
3. 总结
日志传输
在主节点上,使用RMAN 备份删除归档日志文件时,会提示不能删除归档日志文件。提示信息类似于“RMAN-08137: WARNING: archive log not deleted as it is still needed” 。
这个提示信息意味着归档日志文件在DG 环境中的备用节点上还需要使用,可能需要再次传输到备用节点,也可能是备用节点应用了没有给主节点说明其已经被应用了,从而导致主节点必须保存这个归档日志文件。
当然,我们也可以从OS 级别强制删除掉这些文件。但这样操作的结果,有可能导致DG 同步机制被破坏掉。
因此,我们先从主节点上检查哪些归档日志文件没有被应用。查找的方式如下:
SQL> select max (SEQUENCE#),DEST_ID,APPLIED from v$archived_log group by DEST_ID,APPLIED ;
MAX(SEQUENCE#) DEST_ID APP
-------------- ---------- ---
61669 1 NO
61665 3 NO
61669 3 NO
61667 2 NO
61669 2 YES
SQL>
根据结果,我们发现log_archive_dest_3 通过到节点二的归档日志文件有问题。
检 查节点二上的参数配置,发现错误是参数log_archive_config 配置错了。正确的配置应该 是*.log_archive_config='dg_config=(codb,codg2)' ,但这 里*.log_archive_config='dg_config=(codbi,codg2)' ,导致了备用节点无法将通过fal_server 判断 主节点信息。
从这个错误中,我们可以分析出这样的结论。
在主节点上通过参数log_archive_dest_2 配置的传输方式将日志文件同步到备用节点的。
传 输方式为“service=codb_standby lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=codg“ 。这里使用的db_unique_name 的值是备用节点中该参数的值。
使用LGWR 传输时,这个参数值一定不能错,否则会导致主节点LGWR 不能工作,从而导致数据库宕机。
在备用节点上通过参数fal_client 和fal_server 和主节点通讯日志是否接受到,是否应用了。
备用节点通过参数log_archive_dest_1 的值将主节点传输过来的归档日志文件存储到指定位置。对于物理灾备节点,只需要配置一个该类型的参数就可以。而对于逻辑灾备 节点,还需要配置一个用于保存 apply 之后生成的归档日志文件的路径值。