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

2023年 8月 23日 90.7k 0

  1. 作者介绍

    作者就职于专业数据库公司,负责银行、保险、信托、物流、汽车等多行业生产数据库运维,涉及Oracle、MySQL、SQL Server、Mongodb、Redis、PG等数据库,并对Shell和Python脚本有一定的运维经验。⭐️
  2. 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: 服务切换策略

  3. 欢迎关注我的微信公众号 askmeta

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论