RAC的2个关键特性是负载均衡和切换。RAC扩展了单个实例的负载均衡能力,单个实例只能在本地的调度器(使用MTS时)间均衡,而RAC可以在组成一个群集的多个实例间实现负载均衡。通过在多个节点上配置LISTENER来管理客户端对同一个数据库服务的连接请求,从而实现切换。连接负载均衡和切换都需要跨实例的注册。
[@more@]RAC的2个关键特性是负载均衡和切换。RAC扩展了单个实例的负载均衡能力,单个实例只能在本地的调度器(使用MTS时)间均衡,而RAC可以在组成一个群集的多个实例间实现负载均衡。通过在多个节点上配置LISTENER来管理客户端对同一个数据库服务的连接请求,从而实现切换。连接负载均衡和切换都需要跨实例的注册。
客户端负载均衡并不衡量RAC节点CPU的使用率,它只是随机的连接一个节点的监听。由于是随机连接,所以大体上做到连接数的负载均衡。
RAC =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = yes)
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = rac)
)
)
Note: The (load_balance=yes) instructs Net to progress through the list of listener addresses in a random sequence, balancing the load on the various isteners. When set to OFF, instructs Net to try the addresses sequentially until one succeeds. This parameter must be correctly coded in your net service name (connect descriptor). By default, this parameter is set to ON for DESCRIPTION_LISTs. Load balancing can be specified for an ADDRESS_LIST or associated with a set of ADDRESSes or set DESCRIPTIONs. If you use ADDRESS_LIST, (load_balance=yes) should be within the (ADDRESS_LIST=) portion. If you do not use ADDRESS_LIST, (load_balance=yes) should be within the (description=) portion.
(failover=on) is default for ADDRESS_LISTs, DESCRIPTION_LISTs, and a set of DESCRIPTIONs., therefore, you do not have to specify. This is for connect-time-failover, please do not confuse it with transparent application failover (TAF). failover这个参数,只是说在初次连接时,会尝试ADDRESS_LIST中的地址,直到某个连接成功。
参数的含义:
LOAD_BALANCE | FAILOVER | |
ON | ON | 客户端新建连接随机尝试ADDRESS_LIST中的监听,直到连接到一个可用监听,或者连完列表中的所有监听,如没有一个监听可用,则返回错误信息 |
ON | OFF | 客户端新建连接随机尝试ADDRESS_LIST中的任一监听,无论这个监听是否可用,如不可用直接返回错误。 |
OFF | ON | 客户端新建连接按顺序尝试ADDRESS_LIST中的监听,直到连接到一个可用监听,或者连完列表中的所有监听如没有一个监听可用,则返回错误信息 |
OFF | OFF | 客户端新建连接仅连接ADDRESS_LIST中第一个监听,无论这个监听是否可用,如不可用直接返回错误。 |
RAC通过在init.ora中配置LOCAL_LISTENER和REMOTE_LISTENER初始化参数来实现跨实例注册,从而实现服务器端负载均衡和切换。其中LOCAL_LISTENER说明了本地的侦听器地址,而REMOTE_LISTENER则列出了全局的所有侦听器地址。如:
LOCAL_LISTENER=listeners_
通过LOCAL_LISTENER参数,实例可以注册到本地非默认的侦听器。
REMOTE_LISTENERS=listeners_
通过这个参数,实例就可以注册到其他节点的侦听器。其中listeners_db_name通过命名方法进行解析(如tnsnames.ora)。
对于专用连接,listener会选择最小CPU负载的节点上的负载最小的实例。客户端根据tnsnames.ora中的配置,连到某个listener,如果配置了服务器端的负载均衡,这个listener会将连接route到最小CPU负载的节点上的负载最小的实例。
配置步骤
1、1、配置listener.ora
2、2、配置tnsnames.ora,到本地连接和远程连接的网络服务名
3、3、配置init.ora中的local_listener和remote_listener参数
假设有4记带你个节点,按以下配置
hostname service name sid name instance_name ORACLE_HOME
======== ============ ======== ============= =====================
node1 hprac-22 rac rac1 rac1 /oracle/9iship/rac901
node2 hprac-23 rac rac2 rac2 /oracle/9iship/rac901
node3 hprac-24 rac rac3 rac3 /oracle/9iship/rac901
node4 hprac-25 rac rac4 rac4 /oracle/9iship/rac901
以下是服务器端的init.ora,listener.ora,tnsnames.ora和客户机端的tnsnames.ora
All 4 nodes init.ora file have the following parameters:
remote_listener='LISTENERS_RAC'
rac1.local_listener="LISTENER_rac1”
rac2.local_listener="LISTENER_rac2"
rac3.local_listener="LISTENER_rac3"
rac4.local_listener="LISTENER_rac4"
# dispatchers="(pro=ipc)(dis=0)"
db_name='rac'
rac1.instance_name='rac1'
rac2.instance_name='rac2'
rac3.instance_name='rac3'
rac4.instance_name='rac4'
SQL> show parameter db_name
NAME TYPE VALUE
--------------------------- --------- -----------------------------------------
db_name string rac
SQL> show parameter db_domain
NAME TYPE VALUE
--------------------------- --------- -----------------------------------------
db_domain string
SQL> show parameter service_names
NAME TYPE VALUE
--------------------------- --------- -----------------------------------------
service_names string rac
SQL> show parameter instance_name
NAME TYPE VALUE
--------------------------- --------- -----------------------------------------
instance_name string rac1
SQL> show parameter listener
NAME TYPE VALUE
---------------------- ----- ----------------------------------------------
local_listener string LISTENER_rac1
mts_listener_address string
mts_multiple_listeners boolean FALSE
remote_listener string LISTENERS_RAC
hprac-22 listener.ora file
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/9iship/rac901)
(PROGRAM = extproc)
)
(SID_DESC =
(ORACLE_HOME = /oracle/9iship/rac901)
(SID_NAME = [g1] )
)
)
需要特别注意,在SID_DESC不能使用GLOBAL_DBNAME参数项,这个参数会禁止TAF。
hprac-22 ~ hprac-25 and client side tnsnames.ora file
LISTENERS_RAC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
)
)
RAC1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = rac)
(INSTANCE_NAME = rac1)
)
)
RAC2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = rac)
(INSTANCE_NAME = rac2)
)
)
RAC3 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = rac)
(INSTANCE_NAME = rac3)
)
)
RAC4 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = rac)
(INSTANCE_NAME = rac4)
)
)
RAC =
(DESCRIPTION =
(LOAD_BALANCE = yes)
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = rac)
)
)
failover =
(DESCRIPTION =
(enable=broken)
(LOAD_BALANCE = yes)
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = rac)
(failover_mode=(type=select)(method=basic))
)
)
# For hprac-22 only
LISTENER_rac1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
)
# For hprac-23 only
LISTENER_rac2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
)
# For hprac-24 only
LISTENER_rac3 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
)
# For hprac-25 only
LISTENER_rac4 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
)
测试
Server Side Listener Connection Load Balancing Testing (combined with client side connect time load balancing)
Server side listener connection load balancing is where the listener routes the connections to the least-loaded instance. Please add back remote_listener parameter in the init.ora file and restart all 4 instances. Remember to verify the output of ‘lsnrctl services’. The node1 'lsnrctl services' output looks like (I have eliminiated "MODOSE" and "PLSExtProc" service output to make it easier to read):
hprac-22 $ lsnrctl services
LSNRCTL for HPUX: Version 9.0.1.3.0 - Production on 06-JUN-2002 19:44:17
Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
Services Summary...
Service "[g2] " has 4 instance(s).
Instance "rac1", status READY, has 4 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
"D002" established:0 refused:0 current:0 max:2026 state:ready
DISPATCHER
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-22)(PORT=62235))
(PRESENTATION=oracle.aurora.server.SGiopServer)(SESSION=RAW))
"D001" established:0 refused:0 current:0 max:2026 state:ready
DISPATCHER
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-22)(PORT=62234))
(PRESENTATION=oracle.aurora.server.GiopServer)(SESSION=RAW))
Instance "rac2", status READY, has 3 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
"D002" established:0 refused:0 current:0 max:2026 state:ready
DISPATCHER
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-23)(PORT=51212))
(PRESENTATION=oracle.aurora.server.SGiopServer)(SESSION=RAW))
"D001" established:0 refused:0 current:0 max:2026 state:ready
DISPATCHER
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-23)(PORT=51211))
(PRESENTATION=oracle.aurora.server.GiopServer)(SESSION=RAW))
Instance "rac3", status READY, has 3 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
"D002" established:0 refused:0 current:0 max:2026 state:ready
DISPATCHER
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-24)(PORT=52409))
(PRESENTATION=oracle.aurora.server.SGiopServer)(SESSION=RAW))
"D001" established:0 refused:0 current:0 max:2026 state:ready
DISPATCHER
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-24)(PORT=52408))
(PRESENTATION=oracle.aurora.server.GiopServer)(SESSION=RAW))
Instance "rac4", status READY, has 3 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
"D002" established:0 refused:0 current:0 max:2026 state:ready
DISPATCHER
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-25)(PORT=53755))
(PRESENTATION=oracle.aurora.server.SGiopServer)(SESSION=RAW))
"D001" established:0 refused:0 current:0 max:2026 state:ready
DISPATCHER
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-25)(PORT=53754))
(PRESENTATION=oracle.aurora.server.GiopServer)(SESSION=RAW))
Service "[g3] " has 1 instance(s).
Instance "rac1", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0
LOCAL SERVER
The command completed successfully
$
用lsnrctl service命令可以比lsnrctl status看到更多的信息。
Note: Comparing this to the 'lsnrctl status' output below, you will find the above provides much more information. Please note that for an instance on its own node, i.e. rac1 on node1 (hprac-22), you should have both local server and remote server. For all other remote instances, i.e. rac2, rac3 and rac4 on node1 (hprac-22), you will only find the remote server. Under the remote server, please make sure the address listed is correct, no null hostname.
(ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
^^^^^^^^^^^^^
Remote server和local server同时出现的结点上,如hprac-22上,有rac1的local server和remoteserver,此时,只有在local server上有established refused这些信息。
而在hprac-22上看到的rac2,rac3,rac4的信息,是从hprac-22上的listener_rac1上,分别route到listener listener_rac2 listener_rac3 listener_rac4的连接信息统计。
而在hprac-23上看到的rac1,rac3,rac4的信息,是从hprac-23上的listener_rac2上,分别route到listener listener_rac1 listener_rac3 listener_rac4的连接信息统计。
……
如果只采用服务器端负载平衡,而不采用客户端连接时平衡,则所有的连接都会先到listener_rac1。
failover =
(DESCRIPTION =
(enable=broken)
(LOAD_BALANCE = yes)
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = rac)
(failover_mode=(type=select)(method=basic))
)
)
对于已有连接的失败切换,首先要求FAILOVER = ON,并且设置了FAILOVER_MODE
FAILOVER_MODE的子参数含义:
TYPE:1)session---如果用户连接丢失,将创建一个新的会话连接到备用节点,用户的所有未提交的操作必须回滚,然后再次执行,SELECT操作也被中止.
2)select---如果用户连接丢失,将使用游标和之前的快照继续执行SELECT操作,叫做SQL接管,SQL接管能够无缝接管理的事务类型只有SELECT语句.其它的操作也必须要回滚然后再次执行.
3)none---客户端默认值,禁止SQL接管功能,主要用于测试的目地,在实际应用中TYPE应指定为session 或者select
METHOD:1)basic---仅仅在FAILOVER发生时才连接备用节点
2)preconnect---在用户连接到主节点时同时也在备用节点产生一个连接会话,设置预连接模式,能够快速接管SQL
RETRIES:当前节点失败后,失败切换功能会尝试连接备用节点,这个值确定了尝试的次数,如果仅DELAY被指定,RETRIES默认为5
DELAY:两次尝试之间等待的秒数,如果仅指定RETRIES,DELAY默认为1秒
BACKUP:指定另外一个用于备份连接的网络服务名,当RAC设置为主次模式时,使用此参数,并且METHOD应该设为preconnect
如果要使用预连接,就不能使用客户端负载均衡和服务器端负载均衡,否则没有意义!!!
具有客户端负载均衡及透明应用切换无预连接的tnsnames配置
RAC9I =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = tcp)(HOST = rac9iaw)(PORT = 1521))
(ADDRESS = (PROTOCOL = tcp)(HOST = rac9ibw)(PORT = 1521))
(LOAD_BALANCE = ON)
(FAILOVER = ON)
)
(CONNECT_DATA =
(SERVICE_NAME = rac9i.xyf)
(FAILOVER_MODE =
(TYPE = select)
(METHOD = basic)
(RETRIES = 10)
(DELAY = 1)
)
)
)
无客户端负载均衡有透明应用切换且有预连接的tnsnames配置
RAC9I1 =
(DEscrīptION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = tcp)(HOST = rac9iaw)(PORT = 1521))
(LOAD_BALANCE = OFF)
(FAILOVER = ON)
)
(CONNECT_DATA =
(SERVICE_NAME = rac9i.xyf)
(INSTANCE_NAME = rac9i1)
(FAILOVER_MODE =
(BACKUP=RAC9I2)
(TYPE = select)
(METHOD = preconnect)
)
)
)
RAC9I2 =
(DEscrīptION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = tcp)(HOST = rac9ibw)(PORT = 1521))
(LOAD_BALANCE = OFF)
(FAILOVER = ON)
)
(CONNECT_DATA =
(SERVICE_NAME = rac9i.xyf)
(INSTANCE_NAME = rac9i2)
(FAILOVER_MODE =
(BACKUP=RAC9I1)
(TYPE = select)
(METHOD = preconnect)
)
)
)
RAC设置为主次模式时的tnsnames配置
无客户端负载均衡(主次模式就不要客户端负载均衡了),有透明应用切换且有预连接的tnsnames配置
RAC9I1 =
(DEscrīptION =
(ADDRESS = (PROTOCOL = tcp)(HOST = rac9iaw)(PORT = 1521))
(ADDRESS = (PROTOCOL = tcp)(HOST = rac9ibw)(PORT = 1521))
(LOAD_BALANCE = OFF)
(FAILOVER = ON)
(CONNECT_DATA =
(SERVICE_NAME = rac9i.xyf)
(INSTANCE_ROLE = PRIMARY)
(INSTANCE_NAME = rac9i1)
(FAILOVER_MODE =
(BACKUP=RAC9I2)
(TYPE = select)
(METHOD = preconnect)
)
)
)
RAC9I2 =
(DEscrīptION =
(ADDRESS = (PROTOCOL = tcp)(HOST = rac9ibw)(PORT = 1521))
(ADDRESS = (PROTOCOL = tcp)(HOST = rac9iaw)(PORT = 1521))
(LOAD_BALANCE = OFF)
(FAILOVER = ON)
(CONNECT_DATA =
(SERVICE_NAME = rac9i.xyf)
(INSTANCE_ROLE = SECONDARY)
(INSTANCE_NAME = rac9i2)
(FAILOVER_MODE =
(BACKUP=RAC9I1)
(TYPE = select)
(METHOD = preconnect)
)
)
)
也可以设置为有透明应用切换但无预连接的模式,只要把上面的设置中的METHOD设置为basic。
与双主模式时的配置相比,多了INSTANCE_ROLE这样一个参数,当这个参数为SECONDARY时,这个本地服务命名不直接接收连接,只在主节点失败后才会接收连接。不直接接收连接,并不是指在客户端不能连通这个服务命名,只不过这个连接会被路由到主节点,次要次点并不真正有连接连上去。
自动切换特性是OCI8的内在特性,以下表格列出对TAF的support status
Application or Tool | Earliest release with TAF Support |
Oracle Call Interface (Oracle Call Interface) | Release 8 |
ODBC driver | Release 8.0.5 |
JDBC driver | Release 8.1.5 (thick driver only) |
Pro* Pre-compilers | Release 8.0.6 for transparent reconnect |
SQL*Plus | Release 8.0.4 |
Oracle Objects™ for OLE | Release 8i |
测试
> sqlplus su/su@failover
SQL*Plus: Release 9.0.1.3.0 - Production on Thu Jun 6 19:44:57 2002
(c) Copyright 2001 Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.3.0 - 64bit Production
With the Partitioning and Real Application Clusters options
JServer Release 9.0.1.3.0 - Production
SQL> col sid format 999
SQL> col serial# format 9999999
SQL> col failover_type format a13
SQL> col failover_method format a15
SQL> col failed_over format a11
SQL> select sid, serial#, failover_type, failover_method, failed_over
from v$session where username = 'SU';
SID SERIAL# FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
---------- ---------- ------------- --------------- -----------
13 8 SELECT BASIC NO
If you see NONE under failover_type and failover_method, STOP!! You need
to fix your tnsnames.ora file, it does not make sense to continue to test
'shutdown abort' or reboot server.
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac4
*** Due to the load balancing, we need to find out which instance it currently connects to. Now, we can continue our TAF testing.
SQL> select count(*) from
(select * from dba_source
union
select * from dba_source
union
select * from dba_source
union
select * from dba_source
union
select * from dba_source)
/
*** At this point, I ‘shutdown abort’ rac4 from another window. The query
did not stop and the result should be back.
COUNT(*)
----------
60221
*** The query results is back without any error.
SQL> col sid format 999
SQL> col serial# format 9999999
SQL> col failover_type format a13
SQL> col failover_method format a15
SQL> col failed_over format a11
SQL> select sid, serial#, failover_type, failover_method, failed_over
from v$session where username = 'SU';
SID SERIAL# FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
---------- ---------- ------------- --------------- -----------
13 5 SELECT BASIC YES
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac1
*** Note here, it failed over to rac1 with different serial# and
failed_over flag was set.
Restarted rac4, make this database back to 4 instances database.
SQL> select count(*) from
(select * from dba_source
union
select * from dba_source
union
select * from dba_source
union
select * from dba_source
union
select * from dba_source)
/
*** At this point, I ‘shutdown abort’ rac1 from another window. The query
did not stop and the result should be back.
COUNT(*)
----------
60221
The query results is back without any error.
SQL>
SID SERIAL# FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
---------- ---------- ------------- --------------- -----------
14 20 SELECT BASIC YES
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac2
*** Note here, it failed over to rac2 with different sid, serial# and
failed_over flag was set.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12015/viewspace-907085/ ,如需转载,请注明出处,否则将追究法律责任。