48-Oracle CDB下的SID-实例名-服务名
今天还在努力coding,小伙伴突然说有个业务前置机需要上传数据,给登录用户和密码,也无法连接到实例,还坚持一定要求有V$INSTANCE查询权限,结果每次拿到的SID一会是PROD一会是PROD2(RAC环境的2个节点)同时还是拿不到实例名!!!但是现场其他的业务和服务也都正常。于是就有了SID,intance_name,service_name,在单机和RAC环境还有ADG,业务侧如何稳定链接,老业务如何兼容连接。还在用SID么,早点改造吧
一、概念演进:从单实例到RAC-分布式
1. SID (System Identifier)
- 定义:实例级物理标识(如ORCL),唯一标识一个运行中的数据库实例(内存+进程)。
- 作用:
- - 关联OS进程(ora_pmon_ORCL);
- - 决定参数文件命名(spfileORCL.ora);
- - 通过ORACLE_SID环境变量管理实例。
- 局限:
- 长度≤8字符,修改需重建控制文件;
- - 仅支持静态注册(需手动配置listener.ora);
- 无法区分RAC多节点或CDB多租户。
2. Instance Name
- 本质:与SID等价,是数据库参数文件(init.ora)中的instance_name参数。
- 关键点:
- 在单实例中默认等于SID;
- - 在RAC中可自定义(如ORCL1、ORCL2),但需与节点SID一致
3. Service Name
- 起源:Oracle 8i(1999)引入,逻辑服务抽象。
- 设计目标:
- 解耦物理实例与逻辑服务;
- - 支持一个数据库对应多个服务名(如reporting_svc、oltp_svc);
- 突破SID长度限制(支持255字符)。
- 核心机制:
- 动态注册(PMON进程自动向监听器注册);
- 支持负载均衡(RAC)和故障转移(TAF)。
二、CDB多租户架构的关键变革
1. CDB/PDB模型对连接方式改变
标识类型 | CDB根容器 | PDB容器 |
SID | 可连接(CDB$ROOT) | 无法连接(监听器无法路由) |
Service Name | 可连接 | 唯一合法访问方式 |
- 技术上:PDB作为逻辑数据库单元,必须通过Service Name路由。SID仅标识CDB实例,无法区分PDB
- 操作验证:尝试用SID连接PDB将报错 ORA-12505: TNS:listener does not know SID
2. CDB中的Service Name实践
-- 为PDB创建专用服务(非默认服务)
EXEC DBMS_SERVICE.CREATE_SERVICE('MERPDB_HA', 'MERPDB_HA');
EXEC DBMS_SERVICE.START_SERVICE('MERPDB_HA');
- 优势:
- 支持TAF(透明故障转移)、FAN(快速应用通知),RAC环境多节点服务;
- 可为不同服务分配资源计划(Resource Manager)。
三、RAC + ADG架构下的连接路由
1. RAC环境的连接方式
连接目标 | 推荐方式 | 原因 |
单实例直连 | SID(旧)或Service Name | 传统兼容,但Service Name更优 |
RAC集群 | Service Name | 负载均衡+故障转移 |
ADG备库 | Service Name | 与主库一致,支持快速切换 |
- ADG的连接本质:ADG作为物理备库,完全复制主库的Service Name配置。客户端连接ADG时使用与主库相同的Service Name
- 切换示例:主库故障时,只需将客户端连接指向ADG的VIP(Virtual IP),无需修改Service Name
2. ADG的三种标识符使用
SID:
- 用于备库本地管理(如ALTER DATABASE RECOVER);
- 通过ORACLE_SID环境变量启动实例。
Instance Name:
- 与备库SID一致,存储在参数文件中。
Service Name:
- 客户端连接的唯一标识,与主库服务名相同(如prod_ha);
- 监听器通过Service Name路由到ADG实例。
四、现代架构推荐方案
1. 标识符使用规范
场景 | 推荐标识符 | 示例 |
CDB中的PDB连接 | Service Name | jdbc:oracle:thin:@//host:1521/salespdb_ha |
RAC/ADG高可用连接 | Service Name | 客户端配置 scan_ip:1521/prod_ha |
实例级管理命令 | SID | export ORACLE_SID=ORCL1; sqlplus / as sysdba |
参数文件配置 | Instance Name | instance_name = ORCL1 |
双轨过渡:监听器中并行支持SID和Service Name,逐步切换应用连接。
五、统一配置建议
场景 | SID/Instance Name | Service Name |
单实例 | 实例管理(startup命令) | 客户端连接、监听器注册 |
RAC集群 | 节点管理(srvctl命令) | 负载均衡、TAF、应用路由 |
ADG容灾 | 备库本地操作 | 主备一致、VIP透明切换 |
CDB多租户 | CDB根容器管理 | PDB唯一访问方式 |
核心原则:
Service Name:所有客户端连接、高可用场景的唯一选择。
SID:仅限实例级运维(启停、备份),禁止暴露给应用。
ADG/RAC:主备服务名严格一致,通过VIP/IP切换实现故障转移
六、演进和未来的选择
通过逻辑服务层(Service Name)屏蔽底层架构复杂性,是Oracle高可用设计的精髓,也是分布式与云原生时代的必然选择
现代架构
- 弃用SID连接:在RAC/CDB/ADG中,SID无法支持路由、负载均衡和PDB访问
- Service Name核心价值:
- 解耦物理架构:客户端无需感知实例位置或角色变更。
- 无缝故障转移:TAF+VIP实现会话级透明切换(RAC/ADG)
- 多租户支持:CDB中PDB访问的唯一合法途径
迁移步骤:
- 为每个数据库/PDB创建专用服务名(非默认)
- 客户端TNS和JDBC连接串替换为Service Name格式(@//host:port/service_name)
- 监听器启用动态注册(alter system set local_listener='')
-
Default Service FREE Listener Parameter File /opt/oracle/product/23ai/dbhomeFree/network/admin/listener.ora Listener Log File /opt/oracle/diag/tnslsnr/OL97/listener/alert/log.xml Listening Endpoints Summary...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=OL97)(PORT=1521)))(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Services Summary... Service "375897c9631a1373e0636100020a8b39" has 1 instance(s).Instance "FREE", status READY, has 1 handler(s) for this service... Service "FREE" has 1 instance(s).Instance "FREE", status READY, has 1 handler(s) for this service... Service "FREEXDB" has 1 instance(s).Instance "FREE", status READY, has 1 handler(s) for this service... Service "freepdb1" has 1 instance(s).Instance "FREE", status READY, has 1 handler(s) for this service... The command completed successfully