Oracle 服务名(Service Name)与 SID 区别
Oracle 服务名(Service Name)与 SID 区别
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
SID(System Identifier) 和 Service Name(服务名) 都是标识数据库的方式,但含义不同[1]:
| 维度 | SID | Service Name |
|---|---|---|
| 含义 | 实例标识 | 服务标识 |
| 长度 | ≤ 8 字符 | 任意长度 |
| RAC | 每节点不同 | 多实例共享 |
| Oracle 8i 之前 | 唯一连接方式 | 不存在 |
| Oracle 8i+ | 仍可用 | 推荐 |
2. SID 详解
2.1 SID 定义
SID 是 Oracle 实例的唯一标识,对应一个 SGA 和后台进程:
# 环境变量
echo $ORACLE_SID
# orcl
# 进程名后缀
ps -ef | grep ora_pmon
# ora_pmon_orcl
# 文件名后缀
ls $ORACLE_HOME/dbs/spfileorcl.ora
ls $ORACLE_HOME/dbs/orapworcl
2.2 SID 限制
- ≤ 8 字符(11g 之前)
- ≤ 12 字符(12c+ 容器数据库)
- 必须以字母开头
- 区分大小写(建议大写)
2.3 RAC 中的 SID
RAC 双节点:
- 节点 1: SID = orcl1
- 节点 2: SID = orcl2
- 数据库 DB_NAME = orcl
- 服务 SERVICE_NAME = orcl
3. Service Name 详解
3.1 Service Name 定义
Service Name 是逻辑服务标识,可对应一个或多个实例:
-- 查看服务
SELECT
service_id,
name,
network_name,
enabled
FROM dba_services;
-- 默认服务
-- 1. SYS$BACKGROUND (内部)
-- 2. SYS$USERS (内部)
-- 3. orcl (默认服务,= DB_NAME)
-- 4. orclXDB (XML DB)
-- 5. sales (自定义服务)
3.2 创建服务
-- 单实例
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'sales',
network_name => 'sales'
);
DBMS_SERVICE.START_SERVICE('sales');
END;
/
-- RAC
srvctl add service -db orcl -service sales -preferred orcl1 -available orcl2
srvctl start service -db orcl -service sales
3.3 Service Name 优势
- 逻辑隔离:一个数据库多个服务
- 资源管理:不同服务不同 Resource Manager
- 负载均衡:多实例共享一个服务
- 故障切换:TAF 配置
- 多租户:每个 PDB 独立服务
4. 连接方式对比
4.1 SID 连接
# tnsnames.ora
ORCL_SID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA =
(SID = orcl) # 使用 SID
(SERVER = DEDICATED)
)
)
# 连接
sqlplus scott/tiger@orcl_sid
4.2 SERVICE_NAME 连接
# tnsnames.ora
ORCL_SVC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl) # 使用 SERVICE_NAME
(SERVER = DEDICATED)
)
)
# 连接
sqlplus scott/tiger@orcl_svc
4.3 Easy Connect
# 使用 SERVICE_NAME(推荐)
sqlplus scott/tiger@dbhost:1521/orcl
# 使用 SID(需显式指定)
sqlplus scott/tiger@dbhost:1521/orcl?service_name=orcl
# 或
sqlplus scott/tiger@//dbhost:1521/orcl
5. RAC 中应用
5.1 SCAN + Service Name
RAC 推荐使用 SCAN + Service Name:
# tnsnames.ora
ORCL_RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
# SCAN 解析到 3 个 IP
nslookup rac-scan
# Name: rac-scan
# Address: 192.168.1.100
# Address: 192.168.1.101
# Address: 192.168.1.102
5.2 多服务配置
# 创建多个服务
srvctl add service -db orcl -service sales -preferred orcl1,orcl2
srvctl add service -db orcl -service hr -preferred orcl1
srvctl add service -db orcl -service reporting -preferred orcl2
# 启动服务
srvctl start service -db orcl -service sales
srvctl start service -db orcl -service hr
srvctl start service -db orcl -service reporting
5.3 服务级别 TAF
# tnsnames.ora
SALES_TAF =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 3)
(DELAY = 5)
)
)
)
6. 多租户(CDB/PDB)
6.1 每个 PDB 独立服务
-- 创建 PDB 时指定服务
CREATE PLUGGABLE DATABASE salespdb
ADMIN USER admin IDENTIFIED BY ******
DEFAULT TABLESPACE users
SERVICE_NAME = sales;
-- 启动 PDB
ALTER PLUGGABLE DATABASE salespdb OPEN;
-- 连接 PDB
sqlplus scott/tiger@dbhost:1521/sales
6.2 多服务一个 PDB
-- PDB 中创建服务
ALTER SESSION SET CONTAINER = salespdb;
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'sales_read',
network_name => 'sales_read'
);
DBMS_SERVICE.START_SERVICE('sales_read');
END;
/
7. Service Name 高级特性
7.1 资源管理
-- 服务与 Resource Manager 关联
BEGIN
DBMS_SERVICE.MODIFY_SERVICE(
service_name => 'sales',
goal => DBMS_SERVICE.GOAL_THROUGHPUT,
connect_time => 60,
cpu_utilization => 80
);
END;
/
7.2 服务指标
-- 查看服务指标
SELECT
service_name,
db_time,
cpu_time,
physical_reads,
logical_reads
FROM v$service_metrics
WHERE service_name = 'sales';
7.3 服务跟踪
-- 启用服务跟踪
EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
service_name => 'sales',
waits => TRUE,
binds => FALSE
);
8. 静态注册中的 SID/Service Name
8.1 静态注册 SID
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = orcl)
)
)
8.2 静态注册 Service Name
# GLOBAL_DBNAME 实际就是 Service Name
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = sales.example.com)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = orcl)
)
)
9. 常见坑与排错
9.1 ORA-12514: 找不到服务
现象:连接报 ORA-12514。
修复:
-- 1. 检查监听器注册的服务
! lsnrctl services
-- 2. 强制注册
ALTER SYSTEM REGISTER;
-- 3. 检查服务是否创建
SELECT name, enabled FROM dba_services;
-- 4. 检查 tnsnames.ora 配置
! cat $ORACLE_HOME/network/admin/tnsnames.ora
9.2 SID 连接失败但 SERVICE_NAME 成功
原因:实例未启动时 SID 不可用,但静态注册的 Service Name 可连接。
修复:
# 静态注册
# listener.ora 中配置 SID_LIST_LISTENER
9.3 RAC 中 SID 连接限制
现象:RAC 中使用 SID 只能连接到对应节点。
修复:
- 使用 SERVICE_NAME 连接
- 配合 SCAN 实现负载均衡
9.4 服务名拼写错误
现象:ORA-12154。
修复:
# 1. 验证服务名
sqlplus / as sysdba
SELECT name FROM v$active_services;
# 2. 验证 tnsnames.ora
! tnsping sales
10. 最佳实践
- 优先使用 SERVICE_NAME:现代 Oracle 推荐
- RAC 使用 SCAN + SERVICE_NAME:负载均衡与故障切换
- 每个 PDB 独立服务:清晰隔离
- 业务系统分服务:资源管理与监控
- 服务名规范命名:
<db_name>_<purpose> - 静态注册作为兜底:实例未启动时也能连接
- 配置 TAF:高可用场景
- 监控服务状态:
v$active_services
11. 参考资料
[1] Oracle Database Net Services Administrator’s Guide 19c, “Service Names” https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/
[2] Oracle Database Administrator’s Guide 19c, “Managing Services” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-services.html