• 11.2.0.4rac service_name参数修改


    环境介绍

    1)客户环境11.2.0.4 两节点 rac,集群重启后,集群资源一切正常,应用cs架构,连接数据库报错,提示连接对象不存在
    
    2)分析报错原因,连接数据库方式:ip:Port/service_name方式连接数据库
    
           IP地址是scan_ip(客户未使用dns服务器,scan ip正常在节点一,实际情况在节点二,这个不影响scan的使用,本地节点二,使用scan ip可以连接)
    
           端口号是默认1521,且测试本地可以连接
    
           service_name,节点一 xx,节点二xx2,不一致,存在问题(默认rac搭建后,service_name参数两节点保存一致,人为调整可能不一致)
    
    3)分析结论,应用连接只连接service_name=xx,只连接rac节点一,客户通过service_name实现,业务分割。
    (当节点一主机 or 实例一 shutdown后,scan ip and service_name均飘逸至节点二,可以继续为应用提供服务)
    本次集群重启后,优先启动节点二,scan ip挂载在节点二,然而节点一未shutdown,service_name 节点一服务名未飘逸,造成应用无法连接。
    4)恢复操作,节点二,关闭scan ip服务,使其资源飘逸至节点一,至此操作结束

    一、案例环境构建

    1.1 环境介绍,linux5.6,database 11.2.0.3 release
    1.2 测试流程 
    rac安装初始化后,service_name名称,及每个节点监听的service_name名称
    数据库参数修改service_name,造成节点1,2使用不同的service_name进行监听,让scan ip依附在节点二的Public Network card
    模拟应用连接报错,使用scan_ip + port+ service_name_node1 进行连接

    1.3 rac安装初始化后,service_name
    1)数据库参数,两个实例参数均为jx

    SQL> show parameter "service_names"

    NAME TYPE VALUE
    ------------------------------------
    service_names string jx


    2)节点监听的service_name

    节点一:jx1:/u01/app/oracle$ lsnrctl status

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.60.100)(PORT=1521))) --public ip 
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.60.152)(PORT=1521))) --vip

    Service "jx" has 1 instance(s).
    Instance "jx1", status READY

    节点二:jx2:/u01/app/oracle$ lsnrctl status

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.60.101)(PORT=1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.60.153)(PORT=1521)))

    Service "jx" has 1 instance(s).
    Instance "jx2", status READY

    1.4 数据库参数修改service_name

    1)节点一,数据库参数service_name=jx不改变

    2)如果使用一个错误的sid进行修改参数会如何?

    参数提示修改成功,但其实并未生效,rac sid=instance_name,如下错误操作

    SQL> alter system set service_names='jx2' sid='2';

    System altered.

    3)节点二,数据库参数service_name=jx2

    SQL> show parameter instance_name

    NAME TYPE VALUE
    ------------------------------------ ---------------------- ------------------------------
    instance_name string jx2

    SQL> alter system set service_names='jx2' sid='jx2';

    System altered.

    再次查询验证

    SQL> show parameter service_name

    NAME TYPE VALUE
    ------------------------------------ ---------------------- 
    service_names string jx2

    4)service_name修改后,什么时候生效

    jx2:/u01/app/oracle$ lsnrctl status

    Service "jx" has 1 instance(s).
    Instance "jx2", status READY, has 1 handler(s) for this service...
    Service "jx2" has 1 instance(s).
    Instance "jx2", status READY, has 1 handler(s) for this service...

    立即生效,并且历史的service_name服务还可以使用jx,不符合本次测试场景,节点二,关闭service_name=jx

    5)集群命令,关闭监听注册监听的service资源,failed测试环境无法操作

    由于集群资源历史原因未注册,因此无法通过集群命令关闭节点二中的,service "jx"资源

    jx2:/u01/app/grid$ srvctl status service -d jx -s jx
    PRCR-1001 : 资源 ora.jx.jx.svc 不存在

    手工重新rac集群层面注册service name

    srvctl add service 

    -d <db_unique_name>      数据库的唯一名称

    -s <service>             服务名

    -r "<preferred_list>"    逗号分隔的首选实例列表

    -a "<available_list>"    逗号分隔的备用实例列表

    -P {NONE | BASIC | PRECONNECT}   TAF 策略规范

    BASIC: 是指在感知到节点故障时才创建到其他实例的连接。
    PRECONNECT:是在最初建立连接时就同时建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上。

    jx2:/u01/app/oracle$ srvctl add service -d jx -s jx -r "jx1,jx2" -P BASIC
    PRCD-1210 : 服务名jx不能与数据库默认服务名jx相同

    6)节点2监听资源重启

    #错误示范,如下命令关闭集群所有监听资源

    jx2:/u01/app/grid$ srvctl stop listener

    jx2:/u01/app/grid$ srvctl status listener
    监听程序 LISTENER 已启用
    监听程序 LISTENER 未运行

    jx2:/u01/app/grid$ srvctl start listener

    jx2:/u01/app/grid$ crsctl stat res -t

    ora.LISTENER.lsnr
    ONLINE ONLINE jx1
    ONLINE ONLINE jx2

    #正确方式,关闭一个节点监听资源

    jx2:/u01/app/grid$ srvctl stop listener -help  ,只关闭一个节点

    jx2:/u01/app/grid$ srvctl stop listener -n jx2

    jx2:/u01/app/grid$ crsctl stat res -t

    ora.LISTENER.lsnr
    ONLINE ONLINE jx1
    OFFLINE OFFLINE jx2

    再次启动节点2 监听资源

    jx2:/u01/app/grid$ srvctl start listener -n jx2

    jx2:/u01/app/grid$ srvctl status listener
    监听程序 LISTENER 已启用
    监听程序 LISTENER 正在节点上运行: jx1,jx2

    监听节点2,重启监听程序,本以为节点2 service_name=jx2,节点2的监听程序无法监听jx服务名称

    Service "jx" has 1 instance(s).
    Instance "jx2", status READY, has 1 handler(s) for this service...
    Service "jx2" has 1 instance(s).
    Instance "jx2", status READY, has 1 handler(s) for this service...

    7)修改默认的jx这服务名,让其不在节点2出现呢?

    修改jx服务名,配置主备模式,平时只在节点一注册,失败,原因资源不存在

    jx2:/u01/app/grid$ srvctl modify service -d jx -s jx -i jx1 -a jx2 -P basic
    PRCR-1001 : 资源 ora.jx.jx.svc 不存在

    jx2:/u01/app/grid$ srvctl remove service -d jx -s jx
    PRCR-1001 : 资源 ora.jx.jx.svc 不存在

    将节点一,也修改service_name,使用节点一的service_name 测试模拟实际报错,不使用数据库默认的Jx进行测试

    8)通过集群命令增加一个service

    让jx这个服务名,正常情况下只在节点1,节点一shutdown,飘逸至备用节点2,实现实验环境

    jx2:/u01/app/oracle$ srvctl add service -d jx -s jx1 -r jx1 -a jx2 -P BASIC

    jx2:/u01/app/oracle$ srvctl start service -d jx -s jx1

    node1: listener status 资源状态

    Service "jx1" has 1 instance(s).
    Instance "jx1", status READY, has 1 handler(s) for this service...

    实验环境确认

    service_name  node1=jx1 node2=jx2

    监听服务名      node1=jx,jx1  node2=jx,jx2

    9)确认scan ip 在节点呢2上

    jx2:/u01/app/11.2.0/grid/network/admin$ cat /etc/hosts

    192.168.60.154 jx-scan

    jx2:/u01/app/oracle$ /sbin/ifconfig -a

    eth0:1 Link encap:Ethernet HWaddr 00:0C:29:8F:B5:EA
    inet addr:192.168.60.154 Bcast:192.168.60.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

    应用测试连接:无报错,本次实验还原失败

    jx2:/u01/app/oracle$ sqlplus sys/oracle@192.168.60.154:1521/jx1 as sysdba

    jx1:/u01/app/oracle$ ps -ef|grep LOCAL

    oracle    24139      1  0 17:55 ?        00:00:00 oraclejx1 (LOCAL=NO)

    jx2:/u01/app/11.2.0/grid/network/admin$ ps -ef|grep LOCAL

    失败原因,猜测一,数据库版本问题11.2.0.3 与11.2.0.4 版本存在差异

            猜测二,service_name配置问题,本次测试使用的service_name是手工添加,与客户生产环境service_name存在差异

    10)集群关闭scan资源,启动scan 资源再节点一提供服务

    jx1:/u01/app/grid$ srvctl status scan
    SCAN VIP scan1 已启用
    SCAN VIP scan1 正在节点 jx2 上运行
    jx1:/u01/app/grid$ srvctl status scan_listener
    SCAN 监听程序 LISTENER_SCAN1 已启用
    SCAN 监听程序 LISTENER_SCAN1 正在节点 jx2 上运行

    jx1:/u01/app/grid$ crsctl stat res -t

    ora.LISTENER_SCAN1.lsnr
    1 ONLINE ONLINE jx2

    jx1:/u01/app/grid$ srvctl relocate scan -i 1 -n jx1   

    jx1:/u01/app/grid$ srvctl status scan
    SCAN VIP scan1 已启用
    SCAN VIP scan1 正在节点 jx1 上运行

    jx1:/u01/app/grid$ srvctl status scan_listener
    SCAN 监听程序 LISTENER_SCAN1 已启用
    SCAN 监听程序 LISTENER_SCAN1 正在节点 jx1 上运行

    二、测试service_name 飘逸

    数据库默认service_name

    测试db层,修改参数 sid 一个实例,数据库shutdown,能否自动漂移

    测试db层,修改所有实例都注册相同service_name

    修改集群service,主某个节点,主节点shutdown,service_name自动飘逸备用节点

    1)数据库默认service_name
    
    jx2:/u01/app/oracle$ sqlplus sys/oracle@192.168.60.154:1521/jx as sysdba 
    
    SQL>
    
    
    
    2)测试db层,修改参数 sid 一个实例,数据库shutdown,能否自动漂移
    测试jx2,使用的是数据库参数修改命令,测试数据库shutdown,节点一能否监听注册这个资源
    
    节点2::关闭数据库
    
    测试连接节点2,失败
    
    jx2:/u01/app/oracle$ sqlplus sys/oracle@192.168.60.154:1521/jx2 as sysdba
    
    服务名并没有飘逸至节点一,因此节点一监听程序无法注册这个服务,带来应用无法通过这个服务名称进行访问
    
    
    
    3)测试db层,修改整个集群都存在service_name,则均被注册,与数据库默认service_name,同理无需注册
    
    4)测试集群编辑的service,能否切换
    
    节点2:启动数据库
    
    节点1:关闭数据库
    
    节点2集群alert日志记录如下
    2018-12-23 18:23:33.714: [crsd(2638)]CRS-2767:Resource state recovery not attempted for 'ora.jx.db' as its target state is OFFLINE 2018-12-23 19:06:19.865: [crsd(2638)]CRS-2765:Resource 'ora.jx.jx1.svc' has failed on server 'jx1'. 2018-12-23 19:06:19.865: [crsd(2638)]CRS-2771:Maximum restart attempts reached for resource 'ora.jx.jx1.svc'; will not restart. jx2:/u01/app/oracle$ lsnrctl status Service "jx1" has 1 instance(s). Instance "jx2", status READY, has 1 handler(s) for this service... jx2:/u01/app/oracle$ sqlplus sys/oracle@192.168.60.154:1521/jx1 as sysdba SQL> select spid from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat group by sid)
    and username='SYS' and STATUS='ACTIVE'); SPID ------------------------------------------------ 28081 SQL> host ps -ef|grep 28081 oracle 28081 1 0 19:07 ? 00:00:00 oraclejx2 (LOCAL=NO)

    三、测试集群管理service部分用法

    查询资源状态

    jx1:/u01/app/oracle$ srvctl status service -d jx -s jx1
    服务 jx1 正在实例 jx1 上运行


    添加service资源 手工重新rac集群层面注册service name srvctl add service
    -d <db_unique_name> 数据库的唯一名称 -s <service> 服务名 -r "<preferred_list>" 逗号分隔的首选实例列表 -a "<available_list>" 逗号分隔的备用实例列表 -P {NONE | BASIC | PRECONNECT} TAF 策略规范 BASIC: 是指在感知到节点故障时才创建到其他实例的连接。 PRECONNECT:是在最初建立连接时就同时建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上。 jx2:/u01/app/oracle$ srvctl add service -d jx -s jx3 -r "jx1,jx2" -P BASIC 启动添加的集群服务

    srvctl start service -d jx -s jx3
    --对应数据库alert,最终还是修改service_name参数,但是集群层面可以实现,主备模式,手工修改数据库参数无法实现主备

    Sun Dec 23 19:27:52 2018
    ALTER SYSTEM SET service_names='jx1','jx3' SCOPE=MEMORY SID='jx1';

    关闭服务

    jx1:/u01/app/oracle$ srvctl stop service -d jx -s jx3 -i jx1
    jx1:/u01/app/oracle$ srvctl stop service -d jx -s jx3 -i jx2

    删除服务

    jx1:/u01/app/oracle$ srvctl remove service -d jx -s jx3

     

    让jx这个服务名,正常情况下只在节点1,节点一shutdown,飘逸至备用节点2,实现实验环境

    
    

    jx2:/u01/app/oracle$ srvctl add service -d jx -s jx4 -r jx1 -a jx2 -P BASIC

    
    

    jx2:/u01/app/oracle$ srvctl start service -d jx -s jx4


    资源回切
    jx1:/u01/app/oracle$ srvctl relocate service -d jx -s jx4 -i jx1 -t jx2
    jx1:/u01/app/oracle$ srvctl relocate service -d jx -s jx4 -i jx2 -t jx1

    修正,添加SCAN启动方式

    srvctl start scan_listener 启动方式:
       默认启动节点1,使用-i 指定第几个scan_listener默认scan_listener1,使用-n 指定节点名称,可以在指定节点启动scn
    srvctl start scan 启动方式:
       默认启动节点1,使用-i 指定第几个scan_listener默认scan_listener1,使用-n 指定节点名称,可以在指定节点启动scn   
    关闭scan_listener方式:
       可以在scan_listener注册的节点使用lsnrctl stop scan_listener1 
                  or   srvctl stop scan_listener -i 1 (1->scan_listener1)
         or   srvctl stop scan -i 1  -f
    将另一个节点(节点二jx2)的scan_listener1漂移到本地jx1进行注册
    srvctl relocate scan -i 1 -n jx1
  • 相关阅读:
    Rsync企业实战之自动异地备份(转)
    Linux启动过程详解 (转)
    Linux系统下修改环境变量PATH路径的三种方法
    linux更改启动级别后,无法启动的问题解决
    MySQLAdmin用法
    mysql toolkit 用法[备忘] (转)
    mysql edit
    MySQL中SSL配置
    mysql ALTER COLUMN MODIFY COLUMN CHANGE COLUMN 区别及用法 (转)
    MySQL 使用mysqld_multi部署单机多实例详细过程 (转)
  • 原文地址:https://www.cnblogs.com/lvcha001/p/10199294.html
Copyright © 2020-2023  润新知