rac数据库有一个特点是高可用性,即使某个实例down掉了,并不会影响正常的业务。但是当数据块分不到不同的内存时,实例之间就会出现块的复制的问题(cache fusion),这种内存间数据块传递的代价也是比较大的。基于这个原因,有些系统中为了能够高效的利用rac架构,会采用业务分割。比如下面的例子,一个OLAP系统,有两个实例,这个数据库的主要功能是数据加载和数据查询:
[root@linux1 ~]# su - oracle --这里需要用oracle用户
[oracle@linux1 ~]$ srvctl status service -d orcl
[oracle@linux1 ~]$ srvctl add service -d orcl -s rac_query -r "orcl1"
[oracle@linux1 ~]$ srvctl add service -d orcl -s rac_load -r "orcl2"
[oracle@linux1 ~]$ srvctl status service -d orcl
服务 rac_load 未运行。
服务 rac_query 未运行。
[oracle@linux1 ~]$ srvctl start service -d orcl -s rac_query
[oracle@linux1 ~]$ srvctl start service -d orcl -s rac_load
[oracle@linux1 ~]$ srvctl status service -d orcl
服务 rac_load 正在实例 orcl2 上运行
服务 rac_query 正在实例 orcl1 上运行
这样我们就创建了两个服务,服务rac_query用于查询,服务rac_load用于数据加载。
SQL> select name from v$services; --只能看见某个实例启动的服务
NAME
----------------------------------------------------------------
rac_query
orclXDB
orcl
SYS$BACKGROUND
SYS$USERS
SQL> select name from v$active_services;
NAME
----------------------------------------------------------------
rac_query
orclXDB
orcl
SYS$BACKGROUND
SYS$USERS
SQL> select name from dba_services; --可以看见整个rac启动的服务
NAME
----------------------------------------------------------------
SYS$BACKGROUND
SYS$USERS
rac_query
rac_load
orclXDB
orcl
已选择6行。
这样就通过为应用分配不同的服务方式,来达到业务分割的目的。tnsnames.ora配置:
rac_query =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.oraclerac.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac_query)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 30)
(DELAY = 5)
)
)
)
rac_load =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.oraclerac.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac_load)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 30)
(DELAY = 5)
)
)
)