如何让dataguard无缝切换

exi*_*t_1 2 oracle dataguard

在 12c 环境中的 Dataguard 配置中,当我执行从主 ( foo) 到备用 ( bar)的切换,然后尝试使用 sqlplus 时user@foo,我收到“ ORA-011033: ORACLE initialization or shutdown in progress”错误,而不是能够连接到新的主 (bar)。

现在,我知道这是因为连接仍然指向foo地址而不是bar地址,并且根据许多文章,您需要创建一个新的“虚拟”服务来处理不同的连接,以及停止的触发器/在角色更改后启动此服务。

我这样做了,并且将service_names参数设置为这个新的“虚拟”服务,切换将起作用并且也可以切换回来,但是当尝试使用user@foo它的sqlplus 时会抛出ORA-011033. 触发器没有用,服务继续在 foo 和 bar 上运行,因为似乎设置该参数会覆盖触发器尝试执行的任何操作。

现在,如果我不定义该参数,我的切换工作正常,触发器完成它们的工作,当 I 时sqlplus user@foo,它会正确地将我重定向到该bar地址。但是,当我尝试切换回 时foo,我在 DG 警报日志中收到以下信息:

Redo transport problem detected: redo transport to database foo has the following error:
ORA-16047: DGID mismatch between destination setting and target database 08/05/2016 16:01:02 Initialization of connection failed. Expected destination db_unique_name is foo. Database actually reached is bar Failed to send message to site foo. Error code is ORA-16642. Data Guard Broker Status Summary:
Type Name Severity Status Configuration foo_dg Warning ORA-16607 Primary Database bar Error ORA-16778 Physical Standby Database foo Error ORA-16642

在 FOO:

log_archive_dest_2='service="bar"','ASYNC NOAFFIRM delay=0 可选压缩=禁用 max_failure=0 max_connections=1 重新打开=300 db_unique_name="bar" net_timeout=30','valid_for=(online_logfile,all_roles)' fal_client= 'foo' fal_server='bar'

酒吧:

log_archive_dest_2='service="foo", ASYNC NOAFFIRM delay=0 可选压缩=禁用 max_failure=0 max_connections=1 重新打开=300 db_unique_name="foo" valid_for=(online_logfile,all_roles)' fal_client='bar' fal_server='foo'

LDAP 中的条目:foo:

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=foo_home)(PORT=15940))(ADDRESS=(PROTOCOL=TCP)(HOST=bar_home)(PORT=15940)))(CONNECT_DATA=(SERVICE_NAME) =virtual_foo)(FAILOVER_MODE=(TYPE=SESSION)(METHOD=basic))))

酒吧:

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=bar_home)(PORT=15940)))(CONNECT_DATA=(SERVICE_NAME=bar)))

我不确定我错过了什么或误解了什么。任何人都可以阐明我可能做错了什么吗?如果需要,可以提供更多信息。

Bal*_*app 7

从 11.2 开始,您不需要创建触发器,您可以使用 Grid Infrastructure 定义基于角色的服务。

foo

srvctl add service -db foo -service virtual_foo -role primary
srvctl start service -db foo -service virtual_foo
Run Code Online (Sandbox Code Playgroud)

bar

srvctl add service -db bar -service virtual_foo -role primary
srvctl start service -db bar -service virtual_foo
Run Code Online (Sandbox Code Playgroud)

如果您不使用 Grid Infrastructure,那么,只需使用触发器。

您的虚拟服务配置错误,这就是您收到ORA-01033. 您不应service_names手动更新 的值。执行此操作并执行切换后,virtual_foo服务仍在运行foo。您的客户端尝试了列表中的第一个地址,发现侦听器处于活动状态,并且存在具有请求名称的服务,因此尝试登录。但备用数据库处于MOUNT状态,因此客户端无法登录--> ORA-01033

对于切换回foo部分:不要对客户端和 Data Guard 配置使用相同的 TNS 条目。客户端不需要知道他们连接到哪个站点,但 Data Guard Broker 和数据库后台进程需要完全连接到foo或者bar,虚拟服务不提供该功能。将 Data Guard 配置所需的 TNS 条目与客户端使用的条目分开。

通常我使用以下命名和 TNS 条目配置 DG。

如果 db_name 是 foo,则:

  • 基本的: db_unique_name = foo_site1
  • 支持: db_unique_name = foo_site2

(或类似的东西,用于标识站点)

TNS:

  • foo_site1:TNS 入口指向站点 1 的主机,service_name 定义为 foo_site1 - 由 DG 配置使用
  • foo_site2:TNS 入口指向站点 2 的主机,service_name 定义为 foo_site2 - 由 DG 配置使用
  • foo :指向两个站点的 TNS 条目,service_name 定义为 foo(并且定义为基于角色的服务)- 由客户端使用

最后,连接字符串中的这一部分:

(FAILOVER_MODE=(TYPE=SESSION)(METHOD=basic))
Run Code Online (Sandbox Code Playgroud)

除非你有同一个站点的多个实例RAC数据库,foo_home并且bar_home实际上是SCAN的名字,这是不必要的。这些参数用于配置透明应用程序故障转移(RAC 实例之间的会话故障转移)。

顺便说一句,这远非真正的无缝切换,通过此实现的全部功能是客户端可以在角色转换后使用单个连接字符串连接到数据库。

客户端会话将失败,需要手动重新连接,这可能需要几分钟时间。或者您需要停止应用程序并为此计划停机时间。

真正无缝切换需要更多的工作(例如配置 ONS、FAN)。更多详情请访问:

高可用性 Oracle 数据库的客户端故障转移最佳实践

快速申请通知