生产环境Oracle RAC 创建服务、启停服务、切换服务

作者介绍

​作者就职于专业数据库公司,负责银行、保险、信托、物流、汽车等多行业生产数据库运维,涉及Oracle、MySQL、SQL Server、Mongodb、Redis、PG等数据库,并对Shell和Python脚本有一定的运维经验。⭐️

1. Oracle Service 介绍

Oracle数据库服务的高可用性一直是RAC的优势,是其它关系型数据库没有的功能。

11G时,应用配置TFA(Transparent Application Failover),当数据库实例发生故障时,以该实例为首选实例的服务将故障转移到另一个可用实例。实例再次启动后,服务并没有故障切换回原始实例,必须重新ralocate service服务。Oracle数据库19c对此进行了更改,增加了自动回归。

service是访问数据库的一种方式。可以通过service将不同的连接区分开来。service可以当做是一组客户端或者应用的逻辑组合;每个单独的service 可以设定其自己的属性,以满足不同的需要。

例如,为不同的应用、业务、PDB、instance创建不同的service,service的配置要在参数 service_names中设定,同时如果service 要在监听中完成注册,那么新建service 才能正常使用从而可以将连接映射到不同的服务器上(集群环境)以进行区分。

service具有高可用性和负载均衡性。

说明:只是service 漂移,并没有vip漂移这样一旦出现问题才能路由到新实例上新的sql 动作才能触发漂移动作,否则服务器端是无法知道和那些和客户端进行连接的。触发连接迁移是客户端有操作触发才行,即重新执行SQL等操作。

传统的TFA实现方式存在如下问题:

连接串通过VIP的顺序配置优先连接RAC的节点。

简单理解就是原始的TFA是在客户端的tnsnames.ora文件中配置,而数据库的service是在服务端已经配置好了,客户端无需维护tnsnames.ora文件。

2. 创建service

在ORACLE用户下做:

创建服务后,只有启动服务了才会看到服务

在db_unique=webest创建服务wego_s

wego1,wego2是PDB名称

2.1 仅在主库配置service的情况

一般在主库配置

- 给CDB创建service
srvctl add service -d webest -s wego_s -r webest1 -a webest2

- 给PDB创建service
srvctl add service -d webest -pdb wego1 -s wego_s1 -r webest1
srvctl add service -d webest -pdb wego2 -s wego_s2 -r webest1

参数说明:

-r:首选实例,就是应用连接后连接的实例

-a:如果首选实例故障了,会连接到备份使用。

如果创建服务的时候只指定了首选实例,可以避免GC争用。

11G:

11g应用配置TFA,当数据库实例发生故障时,以该实例为首选实例的服务将故障转移到另一个可用实例。

实例再次启动后,服务并没有故障切换回原始实例。dba必须重新ralocate service服务。

19C:

Oracle数据库19c对此进行了更改,增加了自动回归参数-failback。

srvctl modify service -db webest -service webest1 -failovertype SESSION -failovermethod BASIC -failoverdelay 10 -failoverretry 3
srvctl modify service -db webest -service webest1 -failback YES

2.2 在主备库都配置service的情况

在主库执行:webest 是主库的db_unique_name,观察主库两个节点的alert日志并没有同步给备库。

srvctl add service -d webest -s webest_rd_s1 -l physical_standby -r webest1 -a webest2
srvctl add service -d webest -s webest_rd_s2 -l physical_standby -r webest2 -a webest1

确保备库已经同步

select thread#,sequence#,first_time,next_time,applied from v$archived_log where applied='NO';

备库创建,注意db_unique_name(webeststd)是备库的

srvctl add service -d webeststd -s webest_rd_s1 -l physical_standby -r webest1 -a webest2
srvctl add service -d webeststd -s webest_rd_s2 -l physical_standby -r webest2 -a webest1

备库启动service之后,会在备库的监听器中注册该service。

注意千万别把备库的服务在主库启动了!

主库写服务,在主库执行:

srvctl add service -d webest -s webest_r_s1 -l primary -r webest1 -a webest2
srvctl add service -d webest -s webest_r_s2 -l primary -r webest2 -a webest1

确保备库已经同步

select thread#,sequence#,first_time,next_time,applied from v$archived_log where applied='NO';

备库添加主库的service
备库上执行:

srvctl add service -d webeststd -s webest_r_s1 -l primary -r webest1 -a webest2
srvctl add service -d webeststd -s webest_r_s2 -l primary -r webest2 -a webest1

3. 启用和关闭service

如果发生ORA-4031,一般重启PDB就会恢复正常。

注意PDB启动后,可能PDB对应的服务并没有启动,需要手动启动。

如果刚接手几十套RAC,一套RAC下几个实例,每个实例几十个PDB,那么首先要检查一下这个PDB属于哪个实例?

- 知道PDB属于哪个实例,查看服务配置
srvctl config service -d webest -s wego_s 
or
srvctl status service -d webest -pdb wego1
or
srvctl config service -d webest -s wego_s -verbose

- 只知道服务名wego_s,不知道属于哪个实例
ps -ef|grep pmon
加入有三个CDB:wego,webest,wewin
检查每个实例下的服务,注意服务名是区分大小写的

srvctl status service -d wego |grep wego_s
srvctl status service -d webest |grep wego_s
srvctl status service -d wewin |grep wego_s

- 开启PDB
srvctl start service -d webest -s wego_s

- 关闭PDB
srvctl start service -d webest -s wego_s

4. 连接service

生产环境给每个PDB都配置了service,提供给业务部门的是service名称和SCAN IP或者域名。

service连接方式:

sqlplus usera/oracle@scanip:1521/service_name

不需要服务端和客户端配置tnsnames.ora,使用dbeaver连接成功。

5. 修改service配置

将服务wego_s的首选实例调整为webest2,备选实例调整为webest1

srvctl modify service -d  webest -s wego_s -n -i webest1 -a webest2
-i 源实例

6. 删除service

建议先停止service,再删除service:
srvctl stop service -d webest -s webest_r_s1
srvctl remove service -d webest -s webest_r_s1

7. 启用和禁用service

  • 使service不可用

srvctl disable service

  • 使service可用

srvctl enable service

8. 切换relocate service

在打补丁或者日常运维过程中,RAC的服务不能全停止,要轮询关闭DB或者打补丁,就需要切换服务。

使用命令重新分配,将服务切换到节点2.
-i 服务现在的节点,-t 要切换到的目标节点

srvctl relocate service -d webest -s wego_s -i webest1 -t webest2

关闭实例后,服务不会自动漂到节点2上,使用sqlplus关闭实例后才会漂到节点2.
srvctl stop instance -d webest -i webest1

9. 建议配置

service1 启动到节点1,service2 启动到节点2;
rd(read only)服务要确保启动在备库,建议启动在MRP的节点;

切换或者维护的场景,结合实际情况手动relocate服务;
主/备库发生重启后,要检查服务是否启动在正确的实例上,连接备库就是rd(read only)服务,备库如果都宕机了,就把rd的service在主库拉起来。

10. 不同数据库参数说明

10.1 11G参数

11G 版本 srvctl add service Options 常见参数:
srvctl add service -d db_unique_name -s service_name {-r "preferred_list"
[-a "available_list"] [-P {BASIC | NONE | PRECONNECT}] | -g server_pool
[-c {UNIFORM | SINGLETON]} [-k network_number]
[-l [primary | PHYSICAL_STANDBY | LOGICAL_STANDBY | SNAPSHOT_STANDBY]
[-y {AUTOMATIC | MANUAL}] [-q {TRUE | FALSE}] [-x {TRUE | FALSE}]
[-j {SHORT | LONG}][-B {NONE | SERVICE_TIME | THROUGHPUT}]
[-e {NONE | SESSION | SELECT}] [-m {NONE | BASIC}] [-z failover_retries]
[-w failover_delay]

10.2 19C参数

19C 版本部分参数稍有改动:
srvctl add service -database db_unique_name -service service_name_list
[-pdb pluggable_database] [-eval]
[-preferred preferred_list] [-available available_list] [-failback {YES | NO}]
[-netnum network_number] [-tafpolicy {BASIC | NONE}]
[-edition edition_name]
[-role "[primary][,PHYSICAL_STANDBY][,LOGICAL_STANDBY][,SNAPSHOT_STANDBY]"
[-policy {AUTOMATIC | MANUAL}] [-notification {TRUE | FALSE}]
[-clbgoal {SHORT | LONG}] [-failovertype {NONE|SESSION|SELECT|TRANSACTION|AUTO}]
[-rlbgoal {NONE | SERVICE_TIME | THROUGHPUT}] [-dtp {TRUE | FALSE}]
[-failovermethod {NONE | BASIC}] [-failoverretry failover_retries]
[-drain_timeout timeout] [-stopoption {NONE|IMMEDIATE|TRANSACTIONAL}]
[-failover_restore {NONE|LEVEL1|AUTO}] [-failoverdelay failover_delay]
[-sql_translation_profile sql_translation_profile]
[-global {TRUE | FALSE}] [-maxlag max_lag_time] [-commit_outcome {TRUE|FALSE}]
[-retention retention_time] [-replay_init_time replay_initiation_time]
[-session_state {STATIC|DYNAMIC|AUTO}] [-force] [-verbose]

参数解释:
-d: 集群数据库名
-s: 需要添加的服务名
-r: 首选节点,正常情况下该服务运行在该节点上
-a: 备用节点,异常情况服务可漂移到该备用节点
-P: 服务切换策略

欢迎收藏,转发!
关注我的公众号 askmeta,学习更多生产环境数据库运维干货!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值