当前连接的是CDB还是PDB可通过SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL确认,返回CDB$ROOT即为根容器,PDB名称则表示已连接到对应可插拔数据库。
怎么确认当前连接的是CDB还是PDB
oracle多租户里最常踩的坑,就是以为连上了pdb,其实还在cdb$root里执行操作——比如建用户、授权限、查表,结果全在根容器里,pdb里根本看不到。
关键看 V$DATABASE 和 SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL。前者只告诉你是不是CDB(CDB列是YES),后者才直接返回当前容器名,比如CDB$ROOT、PDB1或ORCLPDB。
- 如果没显式指定连接字符串里的服务名(如
sqlplus /@orclpdb),默认连进CDB$ROOT -
ALTER SESSION SET CONTAINER = pdb_name只对当前会话生效,断开重连就回CDB$ROOT - 用
SHOW CON_NAME比查视图更快,但仅限SQL*Plus和SQLcl,其他客户端不支持
创建PDB时为什么总卡在“creating datafile”阶段
常见现象是CREATE PLUGGABLE DATABASE命令执行很久没反应,甚至报ORA-65105: unable to create a new PDB,本质不是性能问题,而是路径或权限没配对。
Oracle 12c+默认用FILE_NAME_CONVERT参数做数据文件路径映射,但如果你的CDB数据文件在+DATA/ORCL/DATAFILE/(ASM),而没写清楚转换规则,它就会试图往$ORACLE_HOME/dbs下建文件——那里通常没权限,也压根不是ASM路径。
- 推荐用
CREATE PLUGGABLE DATABASE ... USING '/path/to/pdb.xml'方式克隆,避免路径推导 - 若用
CREATE AS CLONE,务必显式指定FILE_NAME_CONVERT,例如('CDB', 'PDB1')要对应真实目录前缀 - 检查
DB_CREATE_FILE_DEST参数:如果设了且指向ASM磁盘组,可省略FILE_NAME_CONVERT,但必须确保该磁盘组在线且有空间
ALTER PLUGGABLE DATABASE OPEN报ORA-65019:PDB已打开却提示不存在
这错误看着矛盾,实际是状态不同步导致的——PDB可能处于MOUNTED或UNPLUGGED状态,但控制文件还没刷新,或者你刚用CREATE PLUGGABLE DATABASE完没立刻ALTER PLUGGABLE DATABASE ... OPEN。
先查SELECT NAME, OPEN_MODE, RESTRICTED FROM V$PDBS,重点看OPEN_MODE是不是MOUNTED。如果是,说明数据文件已挂载但没启动实例进程;如果是REMOVED或空行,说明PDB注册信息丢失,得从XML重新插拔。
-
ALTER PLUGGABLE DATABASE pdb_name OPEN READ WRITE必须在CDB$ROOT下执行,不能在另一个PDB里执行 - 如果PDB之前被
UNPLUG过,必须用CREATE PLUGGABLE DATABASE ... USING带XML再导入,不能直接OPEN - 某些补丁版本(如19c 19.14之前)有bug:PDB创建后首次OPEN需加
FORCE,即ALTER PLUGGABLE DATABASE pdb_name OPEN FORCE
怎么让应用自动连到指定PDB而不是CDB$ROOT
开发或运维最容易忽略的一点:tnsnames.ora里服务名配置不对,应用一连就掉进CDB$ROOT,后续所有对象都找不到。
核心是服务名(SERVICE_NAME)必须和PDB注册的服务一致,而不是CDB全局名。用lsnrctl status能看到监听里注册了哪些服务,正常PDB会自动注册一个pdb_name.domain的服务(比如orclpdb.example.com),而CDB注册的是orcl.example.com。
- tnsnames.ora中不要复用CDB的连接描述符,应单独定义,
SERVICE_NAME字段填PDB的服务名,不是数据库名 - Java应用用JDBC URL时,
jdbc:oracle:thin:@host:port/service_name的service_name必须小写匹配监听输出的服务名(大小写敏感) - 如果PDB没自动注册服务,检查
ALTER SYSTEM SET SERVICE_NAMES='orclpdb' SCOPE=BOTH是否执行,以及PDB是否处于OPEN状态
容器切换不是简单的上下文变更,它牵扯到内存结构、服务注册、权限隔离三层机制。很多人调通一次就以为稳了,但升级补丁、重启监听、甚至修改local_listener参数,都可能让PDB服务消失——建议把lsnrctl status和SELECT * FROM V$SERVICES加入日常巡检项。










