在CDB$ROOT中查V$SESSION看不到PDB会话,因其为当前容器级视图;需改用CDB_SESSIONS跨容器查询或先ALTER SESSION SET CONTAINER切到目标PDB。

V$SESSION 在 CDB 中查不到 PDB 会话?不是漏了,是默认不可见——必须切换容器或改用 CDB_ 视图。
为什么在 CDB$ROOT 里查 V$SESSION 看不到 PDB 的活跃会话
因为 V$SESSION 是“当前容器级”视图:当你以 sysdba 登录到 CDB$ROOT 并执行 SELECT * FROM V$SESSION,它只返回根容器自身的会话(比如 RMAN、CDB 级后台任务),不包含任何 PDB 内部的用户连接。这不是权限问题,也不是数据丢失,而是 Oracle 的元数据隔离机制决定的。
常见错误现象包括:
- 监控脚本在 CDB 层跑
V$SESSION,却报告“无活跃业务会话”,实际 PDB 里大量 SQL 正在阻塞 - 用
sqlplus / as sysdba连上就查,直接认定“系统空闲”,错过真实瓶颈
解决思路只有两个方向:要么切到目标 PDB 查本地图表,要么用跨容器视图统一查。
用 CDB$VIEW 统一查所有 PDB 的会话(推荐用于集中监控)
CDB$VIEW 是 CDB 架构下专为跨容器聚合设计的视图族,其中 CDB_SESSIONS(注意不是 V$SESSION)可一次性拉出全部容器中的会话,且自带 CON_ID 字段标识归属。
实操建议:
- 必须以
sysdba或拥有SELECT_CATALOG_ROLE的 common user 登录 CDB$ROOT 才能访问CDB_SESSIONS - 关键字段要加
CON_ID和PDB_NAME关联,否则无法定位会话来源:SELECT s.sid, s.serial#, s.username, s.status, s.sql_id, c.name pdb_name FROM CDB_SESSIONS s, V$CONTAINERS c WHERE s.con_id = c.con_id AND c.con_id > 2;
-
CON_ID <= 2是保留值(1=CDB$ROOT,2=PDB$SEED),过滤掉更干净 - 性能影响:相比单查一个 PDB 的
V$SESSION,CDB_SESSIONS需跨容器收集,高并发时延迟略高,但仍是可控范围
在 PDB 内部查 V$SESSION 时必须先 ALTER SESSION SET CONTAINER
即使你已用 TNS 别名连进某个 PDB(如 sqlplus appuser/pass@orclpdb),若后续又切回 CDB$ROOT 做了操作,当前 session 的容器上下文可能已变——此时再查 V$SESSION 仍会返回 CDB 级数据,而非你预期的 PDB 会话。
安全做法是显式确认并重置容器上下文:
- 查当前容器:
SHOW CON_NAME或SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL - 强制切到目标 PDB:
ALTER SESSION SET CONTAINER = ORCLPDB(注意名称大小写敏感,且需有权限) - 本地用户(non-common)无法执行
ALTER SESSION SET CONTAINER,只能连指定 PDB;common 用户(如C##DBA)才支持切换 - 误切到
PDB$SEED会导致ORA-65046: operation not allowed from outside a PDB错误
V$SESSION 和 CDB_SESSIONS 的关键字段差异与诊断陷阱
表面看字段名相似,但语义和来源不同。例如:
-
V$SESSION.SQL_ID指当前 PDB 内解析的 SQL;而CDB_SESSIONS.SQL_ID是同一逻辑,但需配合CON_ID才能准确定位到具体 PDB 的 SQL 执行计划 -
V$SESSION.EVENT显示等待事件,但CDB_SESSIONS不包含EVENT字段——想查等待,必须进对应 PDB 查V$SESSION或用CDB_WAITSTATS -
CDB_SESSIONS缺少PREV_SQL_ID、MODULE、ACTION等应用层标记字段,深度追踪需回源 PDB - 最易忽略的一点:
CDB_SESSIONS中的STATUS值(如ACTIVE)反映的是会话在所属 PDB 内的状态,但不会告诉你该 PDB 当前是否OPEN;若 PDB 处于MOUNTED或RESTRICTED状态,其会话不会出现在CDB_SESSIONS中
真正卡点不在语法,而在容器状态与视图能力的错配——查之前,先确认 PDB 是 OPEN,再选对视图,否则看到的永远是“半截数据”。



















