-
作者介绍
作者就职于专业数据库公司,负责银行、保险、信托、物流、汽车等多行业生产数据库运维,涉及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 YES2.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 webest13. 启用和关闭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_s4. 连接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