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]:

维度SIDService 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. 最佳实践

  1. 优先使用 SERVICE_NAME:现代 Oracle 推荐
  2. RAC 使用 SCAN + SERVICE_NAME:负载均衡与故障切换
  3. 每个 PDB 独立服务:清晰隔离
  4. 业务系统分服务:资源管理与监控
  5. 服务名规范命名<db_name>_<purpose>
  6. 静态注册作为兜底:实例未启动时也能连接
  7. 配置 TAF:高可用场景
  8. 监控服务状态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