
Oracle 19C 中的 V$SERVICES 视图是一个非常重要的动态性能视图,它提供了数据库中所运行服务的详细信息,尤其在多租户环境(Multitenant Environment)和 RAC(Real Application Clusters)环境中更为关键。它能帮助你全面了解数据库服务的状态、配置以及它们如何与数据库实例交互。
下面我将详细介绍 V$SERVICES 视图的各个方面。
📊 Oracle 19C V$SERVICES 动态性能视图详解
1. ✨ 视图概述与作用
V$SERVICES 是 Oracle 提供的一个关键动态性能视图,用于显示当前数据库中所有服务的详细信息。这里的“服务”是一个逻辑概念,是数据库呈现给客户端应用程序的命名标识,客户端通过指定服务名来连接到数据库。
- 核心作用:提供了数据库服务的整体视图,包括服务的名称、网络配置、运行状态、所属容器(在多租户环境中)、负载均衡与故障转移配置等信息。
- 重要性:在 Oracle RAC 和多租户架构(Multitenant Architecture)中,服务不再是可有可无的,而是成为了进行工作负载管理、资源分配和高可用性连接的基础。通过服务,DBA 可以精确控制应用程序连接到的数据库实例或 PDB(可插拔数据库),并实现负载均衡和故障转移。
2. 🧐 主要应用场景
了解 V$SERVICES 视图的应用场景,能帮助你更好地使用它:
- 服务状态监控:快速检查哪些服务正在运行、是否可用,以及它们注册在了哪个实例上。
- 连接问题排查:当应用程序无法连接到数据库时,检查目标服务是否已正确创建并启动。
- 多租户环境管理:在 CDB 中,查看哪些服务映射到了哪个特定的 PDB,管理 PDB 的服务。
- JDBC 连接配置:在 Oracle 19c 的可插拔数据库环境中,JDBC 连接串中的
ServiceName参数应取自V$SERVICES视图,而不能使用传统的 SID。 - 负载均衡与故障转移配置验证:查看服务的
FAILOVER_METHOD和FAILOVER_TYPE等字段,确认高可用性配置是否符合预期。 - 服务创建与管理:在使用
DBMS_SERVICE包创建或修改服务后,查询V$SERVICES来验证操作结果。
3. 📋 V$SERVICES 字段详解
V$SERVICES 视图包含多个字段,下面对其中重要的字段进行说明(注意:不同版本的 Oracle 可能存在细微差异)。
| 字段名 | 数据类型 | 描述 |
|---|---|---|
| NAME | VARCHAR2(64) | 服务的名称。这是服务的唯一标识符。 |
| NETWORK_NAME | VARCHAR2(64) | 服务在网络中的名称。通常与 NAME 相同,用于客户端连接字符串。 |
| INSTANCE_NAME | VARCHAR2(64) | 注册此服务的数据库实例名。在 RAC 中,一个服务可注册到多个实例。 |
| SERVER_NAME | VARCHAR2(64) | 服务器名称。 |
| STATUS | VARCHAR2(16) | 服务的当前状态。常见值:READY(就绪), STARTED(已启动), STOPPED(已停止), UNKNOWN(未知)。 |
| SERVICE_ROLE | VARCHAR2(16) | 服务角色。常见值:PRIMARY(主角色), SECONDARY(备角色)。用于 Data Guard 环境。 |
| FAILOVER_METHOD | VARCHAR2(32) | 故障转移方法。例如 BASIC(基本故障转移)或 NONE(无)。 |
| FAILOVER_TYPE | VARCHAR2(32) | 故障转移类型。例如 SELECT(选择类型)或 SESSION(会话类型)。 |
| FAILED_OVER | VARCHAR2(3) | 指示连接是否已故障转移。值为 YES 或 NO。 |
| PLACEMENT | VARCHAR2(32) | 服务放置偏好。例如 PRIMARY(首选主实例)或 STANDBY(首选备实例)。 |
| GLOBAL | VARCHAR2(3) | 指示是否为全局服务。在 RAC 环境中,全局服务可在所有实例上运行。值为 YES 或 NO。 |
| CLB_GOAL | VARCHAR2(32) | 连接负载均衡目标。例如 LONG(长连接)或 SHORT(短连接)。 |
| BLOCKED | VARCHAR2(3) | 指示服务是否被阻止。值为 YES 或 NO。 |
| CON_ID | NUMBER | 容器ID。在多租户环境中,指示该服务所属的容器(CDB$ROOT 或某个 PDB)。 |
| NETWORK_STATUS | VARCHAR2(16) | 网络状态。 |
📌 注意:此表列出了常见字段,实际环境可能略有不同。
4. 🔗 相关视图与基表
V$SERVICES 并非基表,而是基于更深层的 X$ 内部表的视图。通常会与其他视图关联查询以获得更丰富的信息。
4.1 相关动态性能视图与数据字典视图
- V$ACTIVE_SERVICES:显示当前活动的服务。
- DBA_SERVICES, ALL_SERVICES:数据字典视图,也提供服务的相关信息。
ALL_SERVICES和V$SERVICES视图包含一个GLOBAL列,用于判断服务是否为全局服务。 - V$SESSION:每个会话都通过
SERVICE_NAME字段关联到其连接所使用的服务。 - VSERVICESTATS,VSERVICE_STATS, VSERVICESTATS,VSERVICE_EVENT, V$SERVICE_WAIT_CLASS:这些视图提供与服务相关的性能统计信息、等待事件和等待类统计,用于服务级别的性能分析。
- VSERVICEMETRIC,VSERVICEMETRIC, VSERVICEMETRIC,VSERVICEMETRIC_HISTORY:提供服务的度量指标及其历史数据。
4.2 底层基表 (X$ Tables)
动态性能视图 (V$) 通常基于名为 X$ 的内存结构(内部表)构建。这些 X$ 表不是存储在磁盘上的普通表,而是 Oracle 实例在运行时在内存中维护的虚拟表,提供了对实例内部状态的直接访问。
V$SERVICES视图很可能基于一个或多个X$表,例如X$KSLSCS或类似的内部结构。这些X$表的结构和名称是 Oracle 的未公开内部实现,在不同版本中可能会发生变化。- 基本原理:Oracle 内核在管理服务(如服务注册、状态更新、负载均衡决策)时,会实时更新这些内存中的结构。
V$SERVICES视图的作用就是以人类可读的形式查询和呈现这些信息。 - 直接查询
X$表通常是不必要且危险的,因为它们极其复杂且不受官方支持。Oracle 提供的V$视图已经包含了我们所需的所有信息。
5. ⚙️ 与服务相关的操作
5.1 创建与管理服务
可以使用 DBMS_SERVICE 包来创建和管理服务。
-- 创建一个新服务
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'my_app_svc',
network_name => 'my_app_svc'
);
END;
/
-- 启动一个服务
BEGIN
DBMS_SERVICE.START_SERVICE('my_app_svc');
END;
/
-- 停止一个服务
BEGIN
DBMS_SERVICE.STOP_SERVICE('my_app_svc');
END;
/
-- 删除一个服务
BEGIN
DBMS_SERVICE.DELETE_SERVICE('my_app_svc');
END;
/
注意:使用 DBMS_SERVICE 创建的服务在数据库重启后不会自动启动。可以创建一个 AFTER STARTUP 数据库触发器来实现自动启动。
CREATE OR REPLACE TRIGGER open_my_service
AFTER STARTUP ON DATABASE
BEGIN
DBMS_SERVICE.START_SERVICE('my_app_svc');
END;
/
5.2 常用查询 SQL
查询所有服务的基本信息
SELECT name, network_name, instance_name, status, service_role, con_id
FROM v$services
ORDER BY name;
查看当前活动的服务
SELECT * FROM v$active_services;
查询特定 PDB 下的服务(多租户环境)
假设 CON_ID 为 3 的是你的 PDB:
SELECT name, network_name, status
FROM v$services
WHERE con_id = 3;
查找会话正在使用的服务
结合 V$SESSION 视图:
SELECT s.sid, s.serial#, s.username, s.service_name, s.program, s.machine
FROM v$session s
WHERE s.service_name IS NOT NULL;
检查服务的故障转移配置
SELECT name, failover_method, failover_type, failed_over, placement
FROM v$services
WHERE failover_method != 'NONE';
监控服务的性能统计
-- 结合 V$SERVICE_STATS 查看某个服务的统计信息
SELECT service_name, name, value
FROM v$service_stats
WHERE service_name = 'my_app_svc'
AND name IN ('DB time', 'user calls', 'sql service response time');
6. 💎 核心知识点与原理
- 服务与监听器 (Listener) 的关系:服务信息会由 PMON 进程或专门的 LREG 进程动态注册到监听器。这使得监听器能够知道哪些服务可以在哪些实例上提供连接。你可以使用
lsnrctl services命令在监听器端查看注册的服务。 - 服务与多租户:在多租户环境中,每个 PDB 至少有一个默认服务(其
NETWORK_NAME通常等于 PDB 的名称)。你可以为同一个 PDB 创建多个服务,以实现不同的工作负载管理目标(例如,将报告查询定向到专用服务)。V$SERVICES.CON_ID字段清晰地表明了服务与容器的隶属关系。 - 服务与 RAC:在 RAC 环境中,服务是跨实例的。一个服务可以在一个或多个实例上运行。客户端连接请求中的服务名会被监听器导向当前提供该服务且负载较轻的实例,这是实现负载均衡的核心。如果某个实例宕机,连接到该实例上服务的会话可以透明地故障转移到其他提供相同服务的实例上,这是实现高可用性的核心。
- 服务与资源管理器 (Resource Manager):服务可以与 Oracle Resource Manager 的消费组映射。这意味着你可以通过服务名来区分不同优先级的工作负载,并为它们分配不同的系统资源(CPU、I/O 等),实现精细化的工作负载管理。
7. 📝 总结
V$SERVICES 视图是 Oracle DBA 工具箱中一个不可或缺的工具,它远远超出了简单的服务列表功能。
希望你提供的这些信息能够帮助你更好地理解和使用 V$SERVICES 视图。
欢迎关注我的公众号《IT小Chen》
401

被折叠的 条评论
为什么被折叠?



