ORACLE_PDB_SID和ORACLE_SID的区别

本文探讨一个很小的问题,很容易被忽略的一个小问题,那就是ORACLE_PDB_SID和ORACLE_SID这两个环境变量;ORACLE_SID这个大家很熟悉了,ORACLE_PDB_SID是CDB模式下的一种连接到某个PDB的方式;当然也可以使用 alter session set container=pdb的方式。来我们看看实例:

复制代码
[oracle@hostname /home/oracle]$ export ORACLE_SID=CDB[oracle@hostname /home/oracle]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 4 15:11:13 2025Version 19.11.0.0.0Copyright (c) 1982, 2020, Oracle.  All rights reserved.Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.11.0.0.0SQL> show con_nameCON_NAME------------------------------CDB$ROOTSQL> show pdbs;    CON_ID CON_NAME                       OPEN MODE  RESTRICTED---------- ------------------------------ ---------- -----------         2 PDB$SEED                       READ ONLY  NO         3 PDB1                           READ WRITE NOSQL> exitDisconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.11.0.0.0[oracle@hostname /home/oracle]$ export ORACLE_PDB_SID=PDB1[oracle@hostname /home/oracle]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 4 15:12:58 2025Version 19.11.0.0.0Copyright (c) 1982, 2020, Oracle.  All rights reserved.Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.11.0.0.0SQL> show con_name;CON_NAME------------------------------PDB1SQL> exitDisconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.11.0.0.0

这一段很简单就是连接到19.11的CDB环境,CDB下有一个PDB1,设置完ORACLE_PDB_SID后可以切换至PDB下。

复制代码
[oracle@hostname /home/oracle]$ export ORACLE_SID=CDB[oracle@hostname /home/oracle]$ sqlplus / as sysdba

紧接上文,如果再执行export ORACLE_SID之后再次sqlplus 请问当前是连接到哪个库?

------分割线------

你会发现连接的还是PDB,除非你执行unset ORACLE_PDB_SID

复制代码
[oracle@hostname /home/oracle]$ export ORACLE_SID=CDB[oracle@hostname /home/oracle]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 4 15:11:13 2025Version 19.11.0.0.0Copyright (c) 1982, 2020, Oracle.  All rights reserved.Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.11.0.0.0SQL> show con_nameCON_NAME------------------------------PDB1
复制代码
[oracle@hostname /home/oracle]$ unset ORACLE_PDB_SID[oracle@hostname /home/oracle]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 4 15:14:11 2025Version 19.11.0.0.0Copyright (c) 1982, 2020, Oracle.  All rights reserved.Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.11.0.0.0SQL> show con_name;CON_NAME------------------------------CDB$ROOTSQL> show pdbs;    CON_ID CON_NAME                       OPEN MODE  RESTRICTED---------- ------------------------------ ---------- -----------         2 PDB$SEED                       READ ONLY  NO         3 PDB1                           READ WRITE NOSQL> exitDisconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.11.0.0.0

why?

这个其实很容易理解在 Oracle 18c/19c/21c 的多租户环境下做本地 bequeath 连接(sqlplus / as sysdba)时:ORACLE_SID 只负责"先找到哪个 CDB 实例",而 ORACLE_PDB_SID 负责"最终把我扔进哪个 PDB"。

只要 ORACLE_PDB_SID 存在且指向一个真实打开的 PDB,它就会完全覆盖 ORACLE_SID 的默认行为,把你直接带进那个 PDB。最终验证结果如下:

  • 从 18c 开始(包括所有 19c 版本)开始,Oracle 在数据库内部默认创建了一个隐藏的系统触发器:
    SYS.DBMS_SET_PDB(after logon on database)

  • 该触发器只对 SYS 和 SYSTEM 用户生效,核心代码如下:

    复制代码
    DBMS_SYSTEM.get_env('ORACLE_PDB_SID', pdb_name);if(pdb_name is not null) then    EXECUTE IMMEDIATE 'alter session set container = ' || pdb_name;end if;
  • 关于这两个环境变量官方文档明确写了一句关键话:
    "The environment variable ORACLE_SID's value must be declared as well for this direct PDB bequeath connection attempt to successfully work (after all, we initially are still connecting to the database root container)."翻译白话:
    ORACLE_SID 必须先设置(用来找到 CDB 实例),但真正决定你最终落在哪个容器里的,是 ORACLE_PDB_SID。

  • 参考文档

Performing bequeath direct connections to PDB as SYS and SYSTEM (Doc ID 2728684.1)

相关推荐
2401_891409261 小时前
量化数据13:港股分钟K线、Level2逐笔Tick、十档盘口和港股通历史数据的批量提取
数据库
w-w0w-w7 小时前
SQL注入
网络·数据库·sql
tianyuanwo8 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
一条泥憨鱼8 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
IvorySQL8 小时前
深入 PostgreSQL WAL:从崩溃恢复到逻辑复制
数据库·postgresql
幽灵诶9 小时前
Mysql(基于测试的学习)
数据库·mysql
砚底藏山河9 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
宇宙无敌暴龙战士66610 小时前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
猿究院_夏燊10 小时前
MySQL 的四种隔离级别
java·数据库·mysql
say_fall10 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++