在 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)))
我不确定我错过了什么或误解了什么。任何人都可以阐明我可能做错了什么吗?如果需要,可以提供更多信息。
从 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:
最后,连接字符串中的这一部分:
(FAILOVER_MODE=(TYPE=SESSION)(METHOD=basic))
Run Code Online (Sandbox Code Playgroud)
除非你有同一个站点的多个实例RAC数据库,foo_home
并且bar_home
实际上是SCAN的名字,这是不必要的。这些参数用于配置透明应用程序故障转移(RAC 实例之间的会话故障转移)。
顺便说一句,这远非真正的无缝切换,通过此实现的全部功能是客户端可以在角色转换后使用单个连接字符串连接到数据库。
客户端会话将失败,需要手动重新连接,这可能需要几分钟时间。或者您需要停止应用程序并为此计划停机时间。
真正无缝切换需要更多的工作(例如配置 ONS、FAN)。更多详情请访问:
归档时间: |
|
查看次数: |
2814 次 |
最近记录: |