Oracle RAC Failover 详解

教程发布:风哥 教程分类:ITPUX技术网 更新日期:2022-02-12 浏览学习:1777

[p=25, null, left][color=rgb(62, 62, 62)]Oracle RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会影响用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言, 是感觉不到这种切换。
[p=25, null, left][color=rgb(62, 62, 62)]Oracle 10g RAC 的Failover 可以分为3种:[p=25, null, left][color=rgb(62, 62, 62)]1. Client-Side Connect time Failover[p=25, null, left][color=rgb(62, 62, 62)]2. TAF[p=25, null, left][color=rgb(62, 62, 62)]3. Service-Side TAF
[p=25, null, left][color=rgb(62, 62, 62)]注意事项: 不能在listener.ora 文件中设置GLOBAL_NAME, 因为这个参数会禁用Connect-time Failover 和 Transparent Application Failover.
[p=25, null, left][color=rgb(62, 62, 62)]If a node fails, then the node’s VIP fails over to another node on which the VIP cannot accept connections.[p=25, null, left][color=rgb(62, 62, 62)]这句话什么意思啊?按字面翻译是“如果节点失败,那么该节点的VIP将会切换到另一个 VIP不能接受连接的节点上”,我的疑问是这样切换的意义是什么呢?以下的回复是有道理的:
[p=25, null, left][color=rgb(62, 62, 62)]如果不用VIP,用户要忍受长时间的tcp timeout。用了VIP之后,用户连接到crash的instance就会报ora错误[p=25, null, left][color=rgb(62, 62, 62)]客户端TAF的配置就会尝试下一个node。这也与文档说的一致。那么我理解这里有三个层次,首先服务器实现 VIP 的切换,同时立即给客户端返回一个连接错误;其次客户端虽然接受到错误,但通过 TAF 的配置就会尝试下一个node;最后对于应用来说,因为是通过客户端注册的服务连接服务器,所以真正做到“透明应用失败切换(TAF)”。

[p=25, null, left][color=rgb(62, 62, 62)]其实在节点一实效之后,vip1可以切换到node2上面去,但是node2上的listener不能使用新漂移过来的vip1进行连接服务,因为oracle10G还没有提供漂移过来的ip自动注册到listener的功能,因此,vip1切换到其他节点后,这个ip就不能提供连接服务,只是执行了切换过来这个动作。
[p=25, null, left][color=rgb(62, 62, 62)]那么为何还要让vip1切换到node2呢,切换过来又没有什么用处?
[p=25, null, left][color=rgb(62, 62, 62)]原因是:
[p=25, null, left][color=rgb(62, 62, 62)]使用vip之后,客户端可以快速判断vip1没有listener服务,可以直接尝试换另外的ip了。减少了尝试的次数和时间。
[p=25, null, left][color=rgb(62, 62, 62)]简述过程如下:
[p=25, null, left][color=rgb(62, 62, 62)]vip1切换到node2后,由于不能提供服务了,因此马上给客户端返回一个连接错误,这个动作会使已连接的客户端向现在已经停机的节点发出 SQL 时,接收到一个 TCP 重置信息。连接将使用 tnsname 中的下一个地址,不过这可不是透明的,会产生一个错误ORA-3113 。
[p=25, null, left][color=rgb(62, 62, 62)]如果你希望透明应用程序故障切换,必须要配置 TAF 应用策略。如果配置了TAF策略,客户端虽然接受到错误,但通过 TAF 的配置就会马上尝试下一个node的连接,这样对于应用来说,实现了真正的透明故障切换,同时也减少了客户端用户等待时间。如果不使用vip连接,当一个节点实效后,vip1也会自动切换到node2,但是这一切已经连接上的客户端并不能马上知道节点一已经实效,因此已经连接到实效节点的客户端会不断的尝试连接,直到连接超时等才会尝试连接tnsname 中的下一个地址,所以这个切换会花费很长时间,客户端才能切换到node2.
[p=25, null, left][color=rgb(62, 62, 62)]一.Client-Side Connect Time Failover[p=25, null, left][color=rgb(62, 62, 62)]Client-Side Connect Time Failover的含义:如果用户端tnsname 中配置了多个地址,用户发起连接请求时,会先尝试连接地址表中的第一个地址,如果这个连接尝试失败,则继续尝试使用第二个地址,直至连接成功或者遍历了所有的地址。[p=25, null, left][color=rgb(62, 62, 62)]这种Failover的特点: 只在建立连接那一时刻起作用,也就是说,这种Failover方式只在发起连接时才会去感知节点故障,如果节点没有反应,则自动尝试地址列表中的下一个地址。一旦连接建立之后,节点出现故障都不会做处理,从客户端的表现就是会话断开了,用户程序必须重新建立连接。[p=25, null, left][color=rgb(62, 62, 62)]启用这种Failover的方法就是在客户端的tnsnames.ora中添加FAILOVER=ON 条目,这个参数默认就是ON,所以即使不添加这个条目,客户端也会获得这种Failover能力。
[p=25, null, left][color=rgb(62, 62, 62)]示例:[p=25, null, left][color=rgb(62, 62, 62)]RAC =[p=25, null, left][color=rgb(62, 62, 62)] (DESCRIPTION =[p=25, null, left][color=rgb(62, 62, 62)](ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))[p=25, null, left][color=rgb(62, 62, 62)](ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))[p=25, null, left][color=rgb(62, 62, 62)](LOAD_BALANCE=YES)[p=25, null, left][color=rgb(62, 62, 62)] ([p=25, null, left][color=rgb(62, 62, 62)]CONNECT_DATA=[p=25, null, left][color=rgb(62, 62, 62)](SERVER=DEDICATED)[p=25, null, left][color=rgb(62, 62, 62)](SERVICE_NAME=RAC)[p=25, null, left][color=rgb(62, 62, 62)] )[p=25, null, left][color=rgb(62, 62, 62)] )[p=25, null, left][color=rgb(62, 62, 62)]注:rac1-vip,rac2-vip要添加到hosts 文件中,不然可能解析不了。
[p=25, null, left][color=rgb(62, 62, 62)]二. TAF(Transparent Application Failover)[p=25, null, left][color=rgb(62, 62, 62)]现在的大部分流行的应用系统(如:weblogic, Jboss),都是启动时就建立若干到数据库的长连接,在应用程序整个生命周期内重用这些连接。 而Client-Side Connet Time Failover的工作方式是它对应用程序的可用性没有太大帮助。[p=25, null, left][color=rgb(62, 62, 62)]所以从Oracle 8.1.5 版本只有引入了新的Failover 机制—TAF。所谓TAF,就是连接建立以后,应用系统运行过程中,如果某个实例发生故障,连接到这个实例上的用户会被自动迁移到其他的健康实例上。对于应用程序而言,这个迁移过程是透明的,不需要用户的介入,当然,这种透明要是有引导的,因为用户的未提交事务会回滚。相对与Client-Side Connect Time Failover的用户程序中断,抛出连接错误,用户必须重启应用程序,TAF 这种方式在提高HA上有了很大的进步。[p=25, null, left][color=rgb(62, 62, 62)]TAF 的配置也很简单,只需要在客户端的tnsnames.ora中添加FAILOVER_MODE配置项。这个条目有4个子项目需要定义。[p=25, null, left][color=rgb(62, 62, 62)]1. METHOD: 用户定义何时创建到其实例的连接,有BASIC 和 PRECONNECT 两种可选值。[p=25, null, left][color=rgb(62, 62, 62)]BASIC:是指在感知到节点故障时才创建到其他实例的连接。[p=25, null, left][color=rgb(62, 62, 62)]PRECONNECT: 是在最初建立连接时就同时建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上。[p=25, null, left][color=rgb(62, 62, 62)]两种方法比较: BASIC方式在Failover时会有时间延迟,PRECONNECT方式虽然没有时间延迟,但是建立多个冗余连接会消耗更多资源,两者就是是用时间换资源和用资源换时间的区别。
[p=25, null, left][color=rgb(62, 62, 62)]2. TYPE: 用于定义发生故障时对完成的SQL 语句如何处理,其中有2种类型:session 和select.[p=25, null, left][color=rgb(62, 62, 62)]这2种方式对于未提交的事务都会自动回滚,区别在于对select 语句的处理,对于select,用户正在执行的select语句会被转移到新的实例上,在新的节点上继续返回后续结果集,而已经返回的记录集则抛弃。[p=25, null, left][color=rgb(62, 62, 62)]假设用户正在节点1上执行查询,整个结果集共有100条记录,现在已从节点1上返回10条记录,这时节点1宕机,用户连接被转移到节点2上,如果是session模式,则需要重新执行查询语句;如果是select方式,会从节点2上继续返回剩下的90天记录,而已经从节点1返回的10条记录不会重复返回给用户,对于用户而言,感受不到这种切换。[p=25, null, left][color=rgb(62, 62, 62)]显然为了实现select 方式,Oracle 必须为每个session保存更多的内容,包括游标,用户上下文等,需要更多的资源也是用资源换时间的方案。
[p=25, null, left][color=rgb(62, 62, 62)]3. DELAY 和 RETRIES: 这2个参数分别代表重试间隔时间和重试次数。[p=25, null, left][color=rgb(62, 62, 62)]示例:[p=25, null, left][color=rgb(62, 62, 62)]RAC =[p=25, null, left][color=rgb(62, 62, 62)] (DESCRIPTION =[p=25, null, left][color=rgb(62, 62, 62)](ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))[p=25, null, left][color=rgb(62, 62, 62)](ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))[p=25, null, left][color=rgb(62, 62, 62)] (LOAD_BALANCE=YES)[p=25, null, left][color=rgb(62, 62, 62)] ([p=25, null, left][color=rgb(62, 62, 62)]CONNECT_DATA=[p=25, null, left][color=rgb(62, 62, 62)](SERVER=DEDICATED)[p=25, null, left][color=rgb(62, 62, 62)](SERVICE_NAME=RAC)[p=25, null, left][color=rgb(62, 62, 62)]([p=25, null, left][color=rgb(62, 62, 62)] FAILOVER_MODE=[p=25, null, left][color=rgb(62, 62, 62)](TYPE=session)[p=25, null, left][color=rgb(62, 62, 62)](METHOD=basic)[p=25, null, left][color=rgb(62, 62, 62)](RETRIES=180)[p=25, null, left][color=rgb(62, 62, 62)](DELAY=5)[p=25, null, left][color=rgb(62, 62, 62)])[p=25, null, left][color=rgb(62, 62, 62)] )[p=25, null, left][color=rgb(62, 62, 62)] )

[p=25, null, left][color=rgb(62, 62, 62)]三. Service-Side TAF[p=25, null, left][color=rgb(62, 62, 62)]Service-SideTAF 可以看作是TAF的一种变种,首先Service-SideTAF也是TAF,所有TAF的特点它都有,其次这种TAF是在服务器上配置的,而不像TAF是在客户端配置的。[p=25, null, left][color=rgb(62, 62, 62)]Client-Side TAF 是在客户端修改tnsnames.ora 文件来配置的,如果有很多客户端使用这个数据库,那么每次微笑调整都需要把所有的计算机更改一遍,既低效又容易出错。而Service-Side TAF 通过结合Service,在数据库里保存FAIL_MODE的配置,把所有的TAF配置保存在数据字典中,从而省去了客户端的配置工作,现在客户端的TNS文件就不需要任何TAF的配置选项了。[p=25, null, left][color=rgb(62, 62, 62)]从配置参数而言,Service-Side TAF和TAF 相比多了一个Instance Role(实例角色)的概念。所谓的实例角色,就是当有多个Instance 参与一个Service时,可以配置优先使用哪一个Instance为用户提供服务。用户共有两种可选角色。[p=25, null, left][color=rgb(62, 62, 62)]PREFERRED:首选实例,会优先选择拥有这个角色的实例提供服务。[p=25, null, left][color=rgb(62, 62, 62)]AVAILABLE: 后备实例,用户连接会优先连接PREFFERRED的Instance,当PREFERRED的Instance不可用时,才会被转到AVAILBALE的Instance上。[p=25, null, left][color=rgb(62, 62, 62)]要使用Server-Side TAF必须配置Service。 Service 可以在创建数据库时创建,也可以在创建数据库之后修改,既可以使用dbca 配置向导,也可以用命令行的方式配置。
[p=25, null, left][color=rgb(62, 62, 62)]3.1 用DBCA 配置Service[p=25, null, left][color=rgb(62, 62, 62)]1). 运行DBCA,选择ORACLE RAC Application Clusters database[p=25, null, left][color=rgb(62, 62, 62)]2). 在第二个界面选择:Services Management[p=25, null, left][color=rgb(62, 62, 62)]3). 第三个界面会出现RAC 数据库列表,用户可以在这个列表中选择要配置Service 的数据库[p=25, null, left][color=rgb(62, 62, 62)]4). 在Serice配置界面中,单击Add 创建新的Service,输入service名字。在Instance列表框定义实例角色,选择那个service1 作为 Preferred(首选实例),Service2 作为availiable(后备实例)。 TAF Policy有三个选项: None, Basic,Pre-connect。 我们选Basic。 最后点击Finish,完成Service 配置。[p=25, null, left][color=rgb(62, 62, 62)]5)在结束Service配置后,服务会自动启动。
[p=25, null, left][color=rgb(62, 62, 62)]3.2 用srvctl 命令配置Service[p=25, null, left][color=rgb(62, 62, 62)]用命令行方式配置Service 对远程维护很有用。先来看一下相关命令[p=25, null, left][color=rgb(62, 62, 62)] 1) 创建service[p=25, null, left][color=rgb(62, 62, 62)]#Srvctl add service -d -s -r "preferred-instance-list" -a "available-instance-list" -P[p=25, null, left][color=rgb(62, 62, 62)]其中TAF-Policy可选:basic 和 preconnect。 例如:[p=25, null, left][color=rgb(62, 62, 62)]srvctl add service -d RAC -s Service2 -r "RAC1,RAC2" -a "RAC3,RAC4" -P basic[p=25, null, left][color=rgb(62, 62, 62)]注意:srvctl add service中,只有perferred才会创建服务。即在OCR中注册一个ora.raw.dmm.Raw1.Srv的服务。[p=25, null, left][color=rgb(62, 62, 62)] 2) 查看配置信息[p=25, null, left][color=rgb(62, 62, 62)] #srvctl config service -d database-name [-s service-name] [-a][p=25, null, left][color=rgb(62, 62, 62)] 如果这里不指定"-s service-name",就会显示所有Service的配置,这些配置包括preferred 和available instance. 使用-a 选项,还会显示TAF 相关信息。 [p=25, null, left][color=rgb(62, 62, 62)] 3)是否自动运行service[p=25, null, left][color=rgb(62, 62, 62)]数据库启动时,会自动启动所有的Service。有时为了为了维护需要,需要禁用这个特性,在维护完成后再启动这个特性。[p=25, null, left][color=rgb(62, 62, 62)]#srvctl enable/disable service -d database-name -s service-name -i instance-name
[p=25, null, left][color=rgb(62, 62, 62)]4)启动service[p=25, null, left][color=rgb(62, 62, 62)] #srvctl start service -d -s -i instance-name -o start-option -c connect-string -q[p=25, null, left][color=rgb(62, 62, 62)]如果不指定service-name, 则所有的service 都会被启动,可以使用逗号分隔方式,同时启动多个service。 -i 指定在那个实例上启动service。
[p=25, null, left][color=rgb(62, 62, 62)]5) 停止service[p=25, null, left][color=rgb(62, 62, 62)]#srvctl stop service -d -s -i instance-name -c connect-string -q -f[p=25, null, left][color=rgb(62, 62, 62)]其中-f 选项可以强制关闭service,并中断了其所有用户的连接。[p=25, null, left][color=rgb(62, 62, 62)][p=25, null, left][color=rgb(62, 62, 62)]6) 查看service 状态[p=25, null, left][color=rgb(62, 62, 62)]#srvctl status service -d -s service-name -i instance-name -f -v[p=25, null, left][color=rgb(62, 62, 62)] 其中-f 可以显示被disable的instance 信息,而-v 可以显示详细输出
[p=25, null, left][color=rgb(62, 62, 62)]7) 删除service[p=25, null, left][color=rgb(62, 62, 62)] #srvctl remove service -d database-name -s service-name -i instance-name [-f][p=25, null, left][color=rgb(62, 62, 62)][p=25, null, left][color=rgb(62, 62, 62)]注意:在使用srvctl 创建service时,需要注意TAF策略选项必须通过dbms_service包来配置。
[p=25, null, left][color=rgb(62, 62, 62)]示例:[p=25, null, left][color=rgb(62, 62, 62)]Begin[p=25, null, left][color=rgb(62, 62, 62)]Dbms_service.modify_service([p=25, null, left][color=rgb(62, 62, 62)]Service_name='>Service1',[p=25, null, left][color=rgb(62, 62, 62)]Failover_method=>dbms_service.failover_method_basic,[p=25, null, left][color=rgb(62, 62, 62)]Failover_type=>dbms_service.failover_type_select,[p=25, null, left][color=rgb(62, 62, 62)]Failover_retries=>180,[p=25, null, left][color=rgb(62, 62, 62)]Failover_delay=>5[p=25, null, left][color=rgb(62, 62, 62)]);[p=25, null, left][color=rgb(62, 62, 62)] End;
[p=25, null, left][color=rgb(62, 62, 62)]3.3 配置Service 的注意事项[p=25, null, left][color=rgb(62, 62, 62)]1). 数据库的服务名是用service_name 参数来指定的,一个数据库可以有多个服务名,但是service_name最长是4kb,不要手工来修改这个参数[p=25, null, left][color=rgb(62, 62, 62)]2)最多可以创建64个service,每个数据库有2个隐含的service,因此留给用户的就只有62个service。不能修改这两个隐含service的配置,并且也不能手工启动或停止这2个服务。这两个隐含的service分别是:SYS$BACKGROUND 和 SYS$USERS.[p=25, null, left][color=rgb(62, 62, 62)]3) 当使用dbca配置Service 时,dbca 会自动更新OCR,启动Service,当删除service时,会停止service,并更新OCR.[p=25, null, left][color=rgb(62, 62, 62)]4) 使用srvctl 这个工具时,命令只更新OCR中的配置,不会更新data dctionary 和 listener 中的信息,因此还需要使用dbma_servie 包来更新data dictionary,手工更改listener配置文件。故推荐使用DBCA工具来配置更改service配置[p=25, null, left][color=rgb(62, 62, 62)]5) 如果客户端想通过Service 方式连接数据库,需要在tns条目中使用service_name 方式引用数据库。如:[p=25, null, left][color=rgb(62, 62, 62)]RAC =[p=25, null, left][color=rgb(62, 62, 62)] (DESCRIPTION =[p=25, null, left][color=rgb(62, 62, 62)](ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))[p=25, null, left][color=rgb(62, 62, 62)](ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))[p=25, null, left][color=rgb(62, 62, 62)] (LOAD_BALANCE=YES)[p=25, null, left][color=rgb(62, 62, 62)] ([p=25, null, left][color=rgb(62, 62, 62)] CONNECT_DATA=[p=25, null, left][color=rgb(62, 62, 62)](SERVER=DEDICATED)[p=25, null, left][color=rgb(62, 62, 62)](SERVICE_NAME=RAC)[p=25, null, left][color=rgb(62, 62, 62)] )[p=25, null, left][color=rgb(62, 62, 62)])[p=25, null, left][color=rgb(62, 62, 62)][p=25, null, left][color=rgb(62, 62, 62)]注意:无论是使用dbca 工具还是使用srvctl 命令来配置service,都无法配置TAF的TYPE,DELAY,RETRIES 三个属性,必须使用dbms_service包来修改这些属性。
[p=25, null, left][color=rgb(62, 62, 62)]四. Srvctl 命令测试实例[p=25, null, left][color=rgb(62, 62, 62)]先查看一下RAC 启动情况:[p=25, null, left][color=rgb(62, 62, 62)][root@raw1 bin]# ./crs_stat -t[p=25, null, left][color=rgb(62, 62, 62)]Name Type Target State Host[p=25, null, left][color=rgb(62, 62, 62)]------------------------------------------------------------[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.db application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.raw.cs application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....aw1.srv application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....aw2.srv application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....w1.inst application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....w2.inst application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....SM1.asm application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....W1.lsnr application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.gsd application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.ons application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.vip application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....SM2.asm application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....W2.lsnr application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.gsd application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.ons application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.vip application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)][root@raw1 bin]# ps -ef|grep smon[p=25, null, left][color=rgb(62, 62, 62)]root 17483 3479 0 07:30 pts/1 00:00:00 grep smon[p=25, null, left][color=rgb(62, 62, 62)]oracle 26561 1 0 07:06 ? 00:00:01 asm_smon_+ASM1[p=25, null, left][color=rgb(62, 62, 62)]oracle 27082 1 0 07:06 ? 00:00:05 ora_smon_raw1
[p=25, null, left][color=rgb(62, 62, 62)]一切正常。
[p=25, null, left][color=rgb(62, 62, 62)]1)查看现有的service[p=25, null, left][color=rgb(62, 62, 62)][root@raw1 bin]# su - oracle[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw1 ~]$ export ORACLE_SID=raw1[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw1 ~]$ sqlplus /nolog[p=25, null, left][color=rgb(62, 62, 62)]SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 3 07:45:36 2010[p=25, null, left][color=rgb(62, 62, 62)]Copyright (c) 1982, 2005, Oracle. All rights reserved.[p=25, null, left][color=rgb(62, 62, 62)]SQL> conn / as sysdba[p=25, null, left][color=rgb(62, 62, 62)]Connected.[p=25, null, left][color=rgb(62, 62, 62)]SQL> show parameter service[p=25, null, left][color=rgb(62, 62, 62)]NAME TYPE VALUE[p=25, null, left][color=rgb(62, 62, 62)]------------------------------ ----------- ------------------------[p=25, null, left][color=rgb(62, 62, 62)]service_names string raw[p=25, null, left][color=rgb(62, 62, 62)]SQL>
[p=25, null, left][color=rgb(62, 62, 62)]2)使用srvctl 命令创建dmm 服务[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ srvctl add service -d raw -s dmm -r "raw1,raw2" -P basic[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ crs_stat -t[p=25, null, left][color=rgb(62, 62, 62)]Name Type Target State Host[p=25, null, left][color=rgb(62, 62, 62)]------------------------------------------------------------[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.db application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.dmm.cs application OFFLINE OFFLINE[p=25, null, left][color=rgb(62, 62, 62)]ora....aw1.srv application OFFLINE OFFLINE[p=25, null, left][color=rgb(62, 62, 62)]ora....aw2.srv application OFFLINE OFFLINE[p=25, null, left][color=rgb(62, 62, 62)]ora....w1.inst application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....w2.inst application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....SM1.asm application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....W1.lsnr application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.gsd application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.ons application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.vip application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....SM2.asm application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....W2.lsnr application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.gsd application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.ons application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.vip application ONLINE ONLINE raw2
[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ srvctl add service -d raw -s dmm -r raw1 -a raw2 -P basic
[p=25, null, left][color=rgb(62, 62, 62)]注意:srvctl add service中,只有perferred才会创建服务。即在OCR中注册一个ora.raw.dmm.Raw1.Srv的服务。
[p=25, null, left][color=rgb(62, 62, 62)]3)确认服务创建成功,offline 表示还没有启动[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ crs_stat -t[p=25, null, left][color=rgb(62, 62, 62)]Name Type Target State Host[p=25, null, left][color=rgb(62, 62, 62)]------------------------------------------------------------[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.db application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.dmm.cs application OFFLINE OFFLINE[p=25, null, left][color=rgb(62, 62, 62)]ora....aw1.srv application OFFLINE OFFLINE[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.raw.cs application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....aw1.srv application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....w1.inst application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....w2.inst application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....SM1.asm application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....W1.lsnr application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.gsd application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.ons application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.vip application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....SM2.asm application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....W2.lsnr application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.gsd application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.ons application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.vip application ONLINE ONLINE raw2
[p=25, null, left][color=rgb(62, 62, 62)]4)配置这个服务自启动[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ srvctl enable service -d raw -s dmm[p=25, null, left][color=rgb(62, 62, 62)]PRKP-1018 : Service dmm already enabled.
[p=25, null, left][color=rgb(62, 62, 62)]5)启动服务[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ srvctl start service -d raw -s dmm
[p=25, null, left][color=rgb(62, 62, 62)]6)确认服务状态。Online 说明已启动[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ crs_stat -t[p=25, null, left][color=rgb(62, 62, 62)]Name Type Target State Host[p=25, null, left][color=rgb(62, 62, 62)]------------------------------------------------------------[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.db application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.dmm.cs application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....aw1.srv application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw.raw.cs application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....w1.inst application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....w2.inst application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....SM1.asm application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....W1.lsnr application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.gsd application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.ons application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora.raw1.vip application ONLINE ONLINE raw1[p=25, null, left][color=rgb(62, 62, 62)]ora....SM2.asm application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora....W2.lsnr application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.gsd application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.ons application ONLINE ONLINE raw2[p=25, null, left][color=rgb(62, 62, 62)]ora.raw2.vip application ONLINE ONLINE raw2
[p=25, null, left][color=rgb(62, 62, 62)]新建的服务会自动添加到初始话参数中:[p=25, null, left][color=rgb(62, 62, 62)]SQL> show parameter service[p=25, null, left][color=rgb(62, 62, 62)]NAME TYPE VALUE[p=25, null, left][color=rgb(62, 62, 62)]----------------------------- ----------- --------------------[p=25, null, left][color=rgb(62, 62, 62)]service_names string raw, dmm
[p=25, null, left][color=rgb(62, 62, 62)]7)用service TAF 修改配置,需要用dbms_service.Modify_service 包。[p=25, null, left][color=rgb(62, 62, 62)]SQL> Begin[p=25, null, left][color=rgb(62, 62, 62)] Dbms_service.modify_service([p=25, null, left][color=rgb(62, 62, 62)] Service_name=>'dmm',[p=25, null, left][color=rgb(62, 62, 62)] Failover_method=>dbms_service.failover_method_basic,[p=25, null, left][color=rgb(62, 62, 62)] Failover_type=>dbms_service.failover_type_select,[p=25, null, left][color=rgb(62, 62, 62)] Failover_retries=>180,[p=25, null, left][color=rgb(62, 62, 62)] Failover_delay=>5[p=25, null, left][color=rgb(62, 62, 62)] );[p=25, null, left][color=rgb(62, 62, 62)] End;[p=25, null, left][color=rgb(62, 62, 62)]/[p=25, null, left][color=rgb(62, 62, 62)]PL/SQL procedure successfully completed.
[p=25, null, left][color=rgb(62, 62, 62)]8) 确认参数已经生效[p=25, null, left][color=rgb(62, 62, 62)]SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;[p=25, null, left][color=rgb(62, 62, 62)]NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G[p=25, null, left][color=rgb(62, 62, 62)]------------- ---------- ----------- ------- -------[p=25, null, left][color=rgb(62, 62, 62)]SYS$BACKGROUND NONE SHORT[p=25, null, left][color=rgb(62, 62, 62)]SYS$USERS NONE SHORT[p=25, null, left][color=rgb(62, 62, 62)]seeddataXDB LONG[p=25, null, left][color=rgb(62, 62, 62)]seeddata.regress.rdb LONG[p=25, null, left][color=rgb(62, 62, 62)]rawXDB LONG[p=25, null, left][color=rgb(62, 62, 62)]raw LONG[p=25, null, left][color=rgb(62, 62, 62)]dmm BASIC SELECT LONG[p=25, null, left][color=rgb(62, 62, 62)]7 rows selected.
[p=25, null, left][color=rgb(62, 62, 62)]9) 也可以用srvctl 命令查看配置情况[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ srvctl config service -d raw -s dmm -a[p=25, null, left][color=rgb(62, 62, 62)]dmm PREF: raw1 AVAIL: raw2 TAF: basic
[p=25, null, left][color=rgb(62, 62, 62)]10) 删除Service
[p=25, null, left][color=rgb(62, 62, 62)] 先关闭service:[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ srvctl stop service -d raw -s dmm[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ srvctl disable service -d raw -s dmm
[p=25, null, left][color=rgb(62, 62, 62)]删除服务:[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]$ srvctl remove service -d raw -s dmm[p=25, null, left][color=rgb(62, 62, 62)]dmm PREF: raw1 AVAIL: raw2[p=25, null, left][color=rgb(62, 62, 62)]Service dmm is disabled.[p=25, null, left][color=rgb(62, 62, 62)]Remove service dmm from the database raw? (y/[n]) y
[p=25, null, left][color=rgb(62, 62, 62)]如果该命令清楚不掉,我们可以加上-f 参数[p=25, null, left][color=rgb(62, 62, 62)][oracle@raw2 bin]# ./srvctl remove service -d raw -s dmm -f

[p=25, null, left][color=rgb(62, 62, 62)]OCR中的信息已经被删除了,但是数据字典中的还有该service的内容,继续清除数据字典中的内容。
[p=25, null, left][color=rgb(62, 62, 62)]先查看数据字典内容:[p=25, null, left][color=rgb(62, 62, 62)]SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
[p=25, null, left][color=rgb(62, 62, 62)]NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G[p=25, null, left][color=rgb(62, 62, 62)]-------------------- --------------- ----------------------- -----[p=25, null, left][color=rgb(62, 62, 62)]SYS$BACKGROUND NONE SHORT[p=25, null, left][color=rgb(62, 62, 62)]SYS$USERS NONE SHORT[p=25, null, left][color=rgb(62, 62, 62)]seeddataXDB LONG[p=25, null, left][color=rgb(62, 62, 62)]seeddata.regress.rdb LONG[p=25, null, left][color=rgb(62, 62, 62)]rawXDB LONG[p=25, null, left][color=rgb(62, 62, 62)]raw LONG[p=25, null, left][color=rgb(62, 62, 62)]dmm BASIC SELECT LONG[p=25, null, left][color=rgb(62, 62, 62)]7 rows selected.
[p=25, null, left][color=rgb(62, 62, 62)]清除数据字典里的内容:[p=25, null, left][color=rgb(62, 62, 62)]SQL> begin[p=25, null, left][color=rgb(62, 62, 62)] 2 dbms_service.delete_service(service_name=>'dmm');[p=25, null, left][color=rgb(62, 62, 62)] 3 end;[p=25, null, left][color=rgb(62, 62, 62)] 4 /
[p=25, null, left][color=rgb(62, 62, 62)]PL/SQL procedure successfully completed.
[p=25, null, left][color=rgb(62, 62, 62)]再次查询数据字典,没有了数据。清除完成[p=25, null, left][color=rgb(62, 62, 62)]SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
[p=25, null, left][color=rgb(62, 62, 62)]NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G[p=25, null, left][color=rgb(62, 62, 62)]-------------------- --------------- ----------------------- -----[p=25, null, left][color=rgb(62, 62, 62)]SYS$BACKGROUND NONE SHORT[p=25, null, left][color=rgb(62, 62, 62)]SYS$USERS NONE SHORT[p=25, null, left][color=rgb(62, 62, 62)]seeddataXDB LONG[p=25, null, left][color=rgb(62, 62, 62)]seeddata.regress.rdb LONG[p=25, null, left][color=rgb(62, 62, 62)]rawXDB LONG[p=25, null, left][color=rgb(62, 62, 62)]raw LONG[p=25, null, left][color=rgb(62, 62, 62)]6 rows selected.

本文标签:
网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】
【下一篇】