oracle11grac会用到rexec服务吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle11grac会用到rexec服务吗相关的知识,希望对你有一定的参考价值。
参考技术A 我们可以为特定的应用或者应用操作集合定义服务,例如为联机事务处理,批处理和报表应用分别定义服务。然后通过这些服务来连接到数据库。使用服务的原因在于可以通过对服务进行配置,获得诸如应用程序性能,负载,以及可用性等各个方面的好处。2、Service的几个重要的配置
2.1 Service Management Policy
service的startup设置,如果将一个service的management policy配置为AUTOMATIC,则在使用srvctl启动database的时候,服务也自动启动。
如果将management policy设置为MANUAL,则必须使用srvctl来启动服务。
使用crsctl重启集群时,如果服务之前是运行的,那么服务也将重新启动。
2.2 Instance Preference
一个服务的优选实例是将在其中启动该服务的实例,这些实例将为用户服务。可用实例是备用实例,当优选实例发证故障时,将在这些实例上启动服务。
假设为一个服务定义了2个优选实例,那么集群会尽量确保服务始终运行在2个实例上。
当服务运行在可用实例上时,当优选实例恢复完成,服务不会在再次回到优选实例上。
注意优选实例和可用实例的定义只有在数据库为administrator-managed的方式下才能设置。如果database处于policy-managed的方式下,则应当为服务指定server pool。见下一节。
2.3 server pool
When you define services for a policy-managed database, you assign the service to aserver pool where the database is running using SRVCTL with the -g option. You can define the service as either UNIFORM (running on all instances in the server pool) orSINGLETON (running on only one instance in the server pool) using the -c option. For singleton services, Oracle RAC chooses on which instance in the server pool theservice is active. If that instance fails, then the service fails over to another instance in the server pool. A service can only run in one server pool.
server pool相当于虚拟实例组,它包含一定数量的实例,而不指定具体是哪些实例。可以定义服务在一个server pool中的所有实例上运行或者在server pool中的一个实例中运行。
3、Oracle中与Service集成的功能
3.1 Resource Profile for a Service
resource profile在定义service时自动创建。它描述了集群如何管理service以及当优选实例故障时service将转移到哪个实例。resource profile还定义了服务的依赖关系,保证在数据库 停止时,实例与服务可以自动以正确的顺序停止。
3.2 Database Resource Manager Consumer Group Mappings for Serviceservice可以和Resource Manager Consumer Group集成,一个service属于一个Resource Manager Consumer Group。通过Resource Manager Consumer Group可以定义服务对资源的使用优先级。例如可以限定三个Group的优先级及CPU使用率,那么CPU资源将按优先级分配给各个组。
3.3 AWR for Service
可以通过AWR报告监控service性能。
4、创建服务
文档中创建服务的语法和选项如下:
5、关于服务在实例中切换的实验
测试环境OGI和RDBMS都是11.2.0.1版本,数据库有两个节点node1,node2,对应实例为orarac1,orarac2该服务使用管理员管理方式,首选实例和可用实例相关配置如下:
[oracle@node1 ~]$ srvctl config service -d orarac -s test_service服务名: test_service
服务已启用
服务器池: orarac_test_service
基数: 1
断开连接: 假
服务角色: PRIMARY
管理策略: AUTOMATIC
DTP 事务处理: 假
AQ HA 通知: 假
故障转移类型: SELECT
故障转移方法: BASIC
TAF 故障转移重试次数: 0
TAF 故障转移延迟: 0
连接负载平衡目标: LONG
运行时负载平衡目标: NONE
TAF 策略规范: BASIC
首选实例: orarac2
可用实例: orarac1
服务的运行状态服下:
[[oracle@node1 ~]$ srvctl status instance -d orarac -i orarac1实例 orarac1 正在节点 node1 上运行
[oracle@node1 ~]$ srvctl status instance -d orarac -i orarac2实例 orarac2 正在节点 node2 上运行
[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 正在实例 orarac2 上运行由于首选实例设置为orarac2,所以服务默认随实例orarac2自动启动。
使用srvctl关闭实例2,在查看服务的情况:
[oracle@node1 ~]$ srvctl stop instance -d orarac -i orarac2[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 未运行。
使用srvctl关闭首选实例,则服务并未转移到可用实例上。
再看使用sqlplus关闭实例2的情况:
首先开启实例2,服务又随实例自动启动了
[oracle@node1 ~]$ srvctl start instance -d orarac -i orarac2[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 正在实例 orarac2 上运行在节点2上登入sqlplus关闭实例2
SQL> select instance_name from v$instance;INSTANCE_NAME
------------------------------------------------orarac2
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
再查看服务状态:
[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 正在实例 orarac1 上运行服务已经转移到备选实例上了。
上面的实验结果表明:
服务会随srvctl启动实例而启动,服务不会随srvctl关闭实例而转移,服务会随sqlplus关闭实例而转移。
再看看服务是否会随sqlplus启动实例而启动:
[oracle@node1 ~]$ srvctl stop service -d orarac -s test_service[oracle@node1 ~]$ srvctl status instance -d orarac -i orarac1实例 orarac1 正在节点 node1 上运行
[oracle@node1 ~]$ srvctl status instance -d orarac -i orarac2实例 orarac2 没有在 node2 节点上运行
[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 未运行。
node2上通过sqlplus启动实例:
INSTANCE_NAME
------------------------------------------------orarac2
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1603411968 bytesFixed Size 2213776 bytesVariable Size 1207961712 bytesDatabase Buffers 385875968 bytesRedo Buffers 7360512 bytesDatabase mounted.
Database opened.
查看服务有没有随SQLPLUS启动实例而启动:
[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 未运行。
结论:
服务会随srvctl启动实例而启动,服务不会随srvctl关闭实例而转移。
服务不会随sqlplus中startup启动实例而启动,服务会随sqlplus关闭实例而转移。
注:测试环境OGI与RDBMS版本都是11.2.0.1。
6、关于RAC中的故障转移
6.1 关于RAC中的故障转移
6.1.1 客户端的故障转移
在客户端的tns中配置多个VIP连接,客户端连接时依次尝试连接,直至连接成功,如果连接中故障,则需要重新连接。
tnsnames.ora中有一个参数FAILOVER=ON,这个参数默认为ON所以不需要配置,一个tns条目可能如下:
ORARAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orarac1-vip)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = orarac2-vip)(PORT = 1521))(LOAD_BALANCE=YES)
(
CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orarac)
)
)
6.1.2 TAF
由于大部分应用使用长连接,即只创建一次到oracle的连接,以后都使用这个连接,如果用客户端故障转移必须要重新建立连接。为解决这个问题,需要新的故障转移方式TAF。
TAF也是在tnsnames.ora中定义。其包含METHOD及TYPE选项。
METHOD取值有BASIC和PRECONNECT两种:BASIC为发生故障时立刻切换。PRECONNECT为事先创建冗余连接。
TYPE取值有SESSION和SELECT两种:对于正在查询的语句,如果实例故障,SESSION模式需要重新查询,SELECT模式可以继续返回结果集,用户感受不到故障转移。
一个TAF的tnsnames中的配置可能如下:
ORARAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orarac1-vip)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = orarac2-vip)(PORT = 1521))(LOAD_BALANCE=YES)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=ORARAC)
(FAILOVER_MODE=
(TYPE=session)
(METHOD=basic)
(RETRIES=180)
(DELAY=5)
)
)
)
6.1.3 Service-Side TAF
TAF需要客户端配置tnsnames,非常麻烦,有一种只需要在服务器端配置故障转移的选项而不需要配置客户端的方法,即Service-Side TAF。
实现方法为:在实例上创建服务,为服务配置故障转移选项,客户端直接通过服务连接到数据库。
7、RAC环境中利用服务实现故障转移的实验
首先查看服务配置:
[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 正在实例 orarac2 上运行[oracle@node1 ~]$ srvctl config service -d orarac -s test_service服务名: test_service
服务已启用
服务器池: orarac_test_service
基数: 1
断开连接: 假
服务角色: PRIMARY
管理策略: AUTOMATIC
DTP 事务处理: 假
AQ HA 通知: 假
故障转移类型: SELECT
故障转移方法: BASIC
TAF 故障转移重试次数: 0
TAF 故障转移延迟: 0
连接负载平衡目标: LONG
运行时负载平衡目标: NONE
TAF 策略规范: BASIC
首选实例: orarac2
可用实例: orarac1
可以看出故障转移的方法及类型:
故障转移类型: SELECT
故障转移方法: BASIC
客户端tns的配置如下:
TEST_SERVICE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cluster-scan)(PORT = 1521))(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = test_service)
)
)
客户端连接数据库:
C:\Documents and Settings\Administrator>sqlplus system/oracle@test_serviceSQL*Plus: Release 10.2.0.1.0 - Production on Tue Dec 2 09:49:16 2014Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, Real Application Clusters, Automatic Storage Management,OLAP,
Data Mining and Real Application Testing optionsSQL> select instance_name from v$instance;INSTANCE_NAME
----------------
orarac2
为了创建长时间查询先创建大表:
SQL> create table testuser.object as select * from dba_objects;Table created.
SQL> insert into testuser.object select * from dba_objects;72252 rows created.
insert语句多执行几次
SQL> select count(*) from testuser.object;COUNT(*)
----------
1156032
执行长查询:
SQL> select * from testuser.object;
中途关闭orarac2(使用sqlplus关闭),客户端显示:
ERROR:
ORA-25402: transaction must roll back
855 rows selected.
原因是事务未提交,必须回滚。此时客户端再执行任何查询仍然报错:
SQL> select instance_name from v$instance;select instance_name from v$instance
*
ERROR at line 1:
ORA-25402: transaction must roll back
回滚事务:
SQL> rollback;
Rollback complete.
客户端在执行查询:
SQL> select instance_name from v$instance;INSTANCE_NAME
----------------
orarac1
服务被转移到了orarac1上运行了,并且客户端session并未中断。
将上述过程重来一遍,但是在长查询之前进行提交:
先将orarac2启动,然后手动重定位服务
[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 正在实例 orarac1 上运行[oracle@node1 ~]$ srvctl relocate service -d orarac -s test_service -h将服务从集群的一个节点临时重新定位到另一个节点(命令忘记了,中途查一下帮助)。
[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 正在实例 orarac1 上运行[oracle@node1 ~]$ srvctl relocate service -d orarac -s test_service -h用法: srvctl relocate service -d <db_unique_name> -s <service_name> -i <old_inst_name> -t <new_inst_name> | -c <current_node> -n <target_node> [-f]
为管理员管理的数据库指定实例, 或者为策略管理的数据库指定节点-d <db_unique_name> 数据库的唯一名称-s <service> 服务名
-i <old_inst> 旧的实例名
-t <new_inst> 新的实例名
-c <current_node> 要从中重新定位服务的节点名-n <target_node> 要将服务重新定位到的节点名-f 在停止或重新定位服务操作期间断开所有会话-h 输出用法
[oracle@node1 ~]$ srvctl relocate service -d orarac -s test_service -i orarac1 -t orarac2[oracle@node1 ~]$ srvctl status service -d orarac -s test_service服务 test_service 正在实例 orarac2 上运行此时验证一下客户端session是否正常:
SQL> select count(*) from testuser.object;COUNT(*)
----------
72252
没有问题。
SQL> select instance_name from v$instance;INSTANCE_NAME
----------------
orarac1
虽然relocate了服务到orarac2上,但是已经连接的session仍然处于orarac1上。
重新连接sqlplus确认连接到orarac2上,并确认不存在未提交事务:
SQL> commit;
Commit complete.
这一次只使用72252行,此时没有未提交事务。
执行长查询之前确认连接实例:
SQL> select instance_name from v$instance;INSTANCE_NAME
----------------
orarac2
SQL> select * from testuser.object;
在服务器上关闭实例2:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
客户端查询仍在进行,等待运行结果:
......
72252 rows selected.
看到客户端查询正常完成,和定义的TYPE=SELECT结果相一致。
8、 一些关于服务故障转移的结论
测试版本为11.2.0.1;节点为node1,node2;数据库名为orarac;实例名为orarac1,orarac2;服务名为test_service;服务配置信息见上面说明。
通过上述实验可以得出下面结论:
通过服务可以定义负载均衡及故障转移,而不需要在客户端做任务配置。
srvctl启动首选实例,服务会自动启动。
srvctl关闭服务的首选实例,服务不会自动转移到备选实例。
sqlplus中启动首选实例,服务不会自动启动。
sqlplus中关闭首选实例,服务会自动转移到备选实例。
服务转移到备用实例后,此时首选实例恢复正常,服务不会自动回到首选实例。
客户端session连接到服务后,如果此时通过srvctl relocate将服务转移到其他实例,客户端连接的实例仍然不变。此时故障转移仍然正常。
如果事务未提交,此时发生故障转移,则必须回滚事务,才能进行其他操作。
rsh命令配置于使用
安装环境:一台centos6.10虚拟机,一台centos7.5虚拟机,全部使用root用户登录。
两台机器上都要安装rsh、rsh-server、xinetd包。
两台机器都要关闭防火墙并配置/etc/hosts映射。
修改/etc/xinetd.d/下的三个文件,rlogin,rexec,rsh,将里面的disable=yes改为disable=no。如果没有这三个文件,创建即可。
如下:
rexec
# default: off # description: Rexecd is the server for the rexec(3) routine. The server # provides remote execution facilities with authentication based # on user names and passwords. service exec { socket_type = stream wait = no user = root log_on_success += USERID log_on_failure += USERID server = /usr/sbin/in.rexecd disable = no }
rlogin
# default: on # description: rlogind is the server for the rlogin(1) program. The server # provides a remote login facility with authentication based on # privileged port numbers from trusted hosts. service login { socket_type = stream wait = no user = root log_on_success += USERID log_on_failure += USERID server = /usr/sbin/in.rlogind disable = no }
rsh
# default: on # description: The rshd server is the server for the rcmd(3) routine and, # consequently, for the rsh(1) program. The server provides # remote execution facilities with authentication based on # privileged port numbers from trusted hosts. service shell { disable = no socket_type = stream wait = no user = root log_on_success += USERID log_on_failure += USERID server = /usr/sbin/in.rshd }
然后修改/etc/pam.d/下的rlogin、rexec、rsh三个文件,将里面的#auth required pam_securetty.so这行注释掉,使得root用户可以远程登录。
然后再两台机器上重启xinetd服务即可互相登录了。
以上是关于oracle11grac会用到rexec服务吗的主要内容,如果未能解决你的问题,请参考以下文章