
好的,我们来对 Oracle 19C 中的 V$PROCESS 动态性能视图进行一次全面、深入的详解。您提到的准确性问题和表格格式问题非常重要,本文将特别注意。
1. 作用与概述
V$PROCESS 视图是 Oracle 数据库的一个核心动态性能视图,它提供了当前数据库实例中所有活动进程的信息。这些进程包括:
- 服务器进程:为客户端连接(如专用服务器模式下的会话)服务的进程。
- 后台进程:由 Oracle 自身创建和管理的关键进程,用于执行维护任务(如
DBWn,LGWR,PMON,SMON等)。
简单来说,V$PROCESS 是数据库实例活动进程的实时快照,它将操作系统的进程信息与数据库内部状态关联起来,是进行连接监控、故障诊断和性能分析的重要工具。
2. 使用场景
- 监控数据库连接和活动:查看当前有多少用户进程连接到数据库,以及它们的状态。
- 诊断性能和资源问题:
- 识别消耗大量 CPU 或内存(PGA)的进程。
- 查找可能陷入死循环或执行异常操作的会话。
- 关联会话和操作系统进程:
- 当你在操作系统层面发现一个高负载的 Oracle 进程(如
ora_dbw0_orcl),可以使用V$PROCESS找到其对应的数据库会话信息(通过V$SESSION)。 - 反之,当你发现一个数据库会话有问题,也可以通过它找到在操作系统上的进程 ID (
SPID),以便使用kill等操作系统命令终止它。
- 当你在操作系统层面发现一个高负载的 Oracle 进程(如
- 审计和跟踪:跟踪特定操作是由哪个数据库进程执行的。
3. 字段含义详解
以下是 V$PROCESS 视图的主要字段及其含义的详细表格。表格已优化格式以确保清晰。
| 字段名 | 类型 | 含义详解 |
|---|---|---|
| ADDR | RAW(4 | 8) | 进程对象地址:在 SGA 中唯一标识一个进程状态的内部地址。这是一个指向内存结构的指针,常用于与其他视图(如 V$SESSION)的 PADDR 字段进行关联。 |
| PID | NUMBER | Oracle 进程标识符:由 Oracle 数据库内部分配的进程编号。注意:这与操作系统进程 ID (SPID) 不同。 |
| SPID | VARCHAR2(24) | 操作系统进程标识符:这是最重要的字段之一。它表示该数据库进程在操作系统层面的真实进程 ID(在 UNIX/Linux 上是 PID,在 Windows 上是线程 ID)。用于在操作系统级别定位该进程。 |
| PNAME | VARCHAR2(5) | 进程名称:对于后台进程,此字段显示进程名称(如 PMON, DBW0, LGWR)。对于专用服务器进程,此字段通常为空。对于共享服务器或并行查询从属进程,会有特定名称(如 S000, P001)。 |
| USERNAME | VARCHAR2(15) | 操作系统用户名:启动该数据库进程的操作系统用户名称(例如 oracle)。 |
| SERIAL# | NUMBER | 进程序列号:用于唯一标识一个进程。如果某个 PID 的进程被终止并由一个新的进程重用相同的 PID,则 SERIAL# 会递增,以区分新旧进程。通常与 PID 一起使用来唯一标识一个进程的生命周期。 |
| TERMINAL | VARCHAR2(30) | 终端标识符:客户端所在终端的操作系统标识符。 |
| PROGRAM | VARCHAR2(48) | 程序名称:客户端使用的程序名称(例如 sqlplus@hostname (TNS V1-V3), JDBC Thin Client, emagent.pl)。 |
| TRACEID | VARCHAR2(255) | 跟踪文件标识符 |
| BACKGROUND | VARCHAR2(1) | 后台进程标志:1 表示这是一个后台进程;NULL 表示这是一个用户进程(服务器进程)。 |
| LATCHWAIT | VARCHAR2(8) | 当前等待的闩锁地址:如果进程正在等待一个闩锁,此字段显示该闩锁的地址;否则为 NULL。 |
| LATCHSPIN | VARCHAR2(8) | 当前正在自旋的闩锁地址:此字段已废弃,通常为 NULL。 |
| PCAUSED | NUMBER | PGA 内存使用情况:此进程当前已使用的 PGA 内存大小(字节)。这是分析内存消耗的关键字段。 |
| PGA_USED_MEM | NUMBER | PGA 已使用内存:此进程当前已使用的 PGA 内存(字节)。与 PCAUSED 类似,是监控 PGA 的重要指标。 |
| PGA_ALLOC_MEM | NUMBER | PGA 已分配内存:此进程已分配的 PGA 内存总量(字节),包括已使用和空闲的部分。 |
| PGA_FREEABLE_MEM | NUMBER | 可释放的 PGA 内存:此进程中可以被释放的已分配内存大小(字节)。 |
| PGA_MAX_MEM | NUMBER | PGA 最大历史使用量:此进程曾经达到的最大 PGA 内存使用量(字节)。 |
注:还有其他一些字段,但以上列出的是最常用和最重要的。
4. 相关视图与基表
V$SESSION:这是与V$PROCESS关联最紧密的视图。V$SESSION的PADDR字段等于V$PROCESS的ADDR字段,通过这个关联可以将会话信息与其对应的进程信息连接起来。V$SESSTAT,V$MYSTAT,V$SQL等:通过V$SESSION可以进一步关联到这些视图,获取会话级别的统计信息、正在执行的 SQL 等。- 基表 (Underlying Table):动态性能视图的数据来源于实例的内存结构(SGA),而非真正的表。
V$PROCESS的底层 X表∗∗通常是∗∗‘X表** 通常是 **`X表∗∗通常是∗∗‘XKSUPR`(Kernel Serial Process Table)。请注意:X$表是 Oracle 的内部数据结构,其名称、结构和内容可能随版本变化,不建议用户直接查询,仅供 DBA 在专家指导下进行深层诊断。
5. 底层详细原理
-
数据来源:
V$PROCESS和所有 V$ 视图一样,其数据直接来源于系统全局区 (SGA) 中的内存数据结构。每当查询V$PROCESS时,Oracle 会实时地从 SGA 中收集当前所有活跃进程的状态信息并返回。 -
进程与 PGA:每个服务器进程或后台进程都拥有自己私有的内存区域,称为 程序全局区 (PGA)。PGA 用于存储会话变量、数组、排序区、哈希区等私有数据。
V$PROCESS中的PGA_USED_MEM,PGA_ALLOC_MEM等字段正是反映了该进程的 PGA 使用情况。 -
地址字段的含义:
ADDR字段是一个内存地址,它指向 SGA 中一个描述该进程状态的 C 语言结构体。当V$SESSION的PADDR与之匹配时,意味着该会话正由这个特定的进程结构提供服务,从而建立了会话与操作系统进程之间的桥梁。 -
进程创建:
- 当客户端发起连接(专用服务器模式)时,监听器会 fork/spawn 一个新的服务器进程。
- 数据库实例启动时,会创建所有必需的后台进程。
- 每当一个进程被创建,Oracle 就会在 SGA 中初始化一个对应的内部结构,
V$PROCESS视图的内容正是这些结构的用户友好型映射。
6. 常用查询 SQL
1. 查看所有进程及其对应的会话信息(最常用)
此查询将数据库进程与用户会话关联起来。
SELECT s.sid, s.serial#, s.username AS "DB User",
s.status, s.machine, s.program AS "Session Program",
p.spid, p.pid AS "Ora PID", p.pname, p.program AS "Process Program",
p.background, p.pga_used_mem, p.pga_alloc_mem
FROM v$process p
LEFT JOIN v$session s ON p.addr = s.paddr
ORDER BY p.background, p.pname;
2. 查找特定操作系统进程对应的数据库会话
假设你在操作系统上看到 SPID 为 12345 的进程很可疑。
SELECT s.sid, s.serial#, s.username, s.osuser, s.machine, s.program, s.status
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE p.spid = '12345';
-- 或者直接查 V$PROCESS
SELECT * FROM v$process WHERE spid = '12345';
3. 查找消耗 PGA 内存最多的前10个进程
SELECT s.sid, s.serial#, s.username, s.program,
p.spid, p.pid, p.pga_used_mem, p.pga_alloc_mem, p.pga_max_mem
FROM v$process p
LEFT JOIN v$session s ON p.addr = s.paddr
ORDER BY p.pga_used_mem DESC
FETCH FIRST 10 ROWS ONLY;
4. 查看所有后台进程
SELECT pid, spid, pname, username, program
FROM v$process
WHERE background = '1'
ORDER BY pname;
5. 终止一个会话(需要先找到其 SID, SERIAL# 和 SPID)
第一步:在数据库层面终止(推荐)
-- 从上面的查询中找到 SID 和 SERIAL#
ALTER SYSTEM KILL SESSION 'SID, SERIAL#';
-- 例如:ALTER SYSTEM KILL SESSION '123, 56789';
第二步:如果第一步无效或会话处于特殊状态,使用操作系统命令
-- 从上面的查询中找到 SPID (假设是 9876)
-- 在 Linux/Unix 上
-- kill -9 9876
总结
V$PROCESS 视图是 Oracle DBA 工具箱中一个不可或缺的工具,它就像一座桥梁,连接了数据库内部世界和操作系统外部世界。通过理解其字段含义、掌握其与 V$SESSION 的关联方式,并熟练运用相关的查询 SQL,DBA 可以有效地监控数据库活动、诊断性能瓶颈、解决资源冲突问题,并对异常会话进行精准干预。
欢迎关注我的公众号《IT小Chen》
Oracle V$PROCESS详解与应用
29

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



