Oracle 21c默认不自动创建PDB,pdbseed为只读模板,须先显式创建可写PDB(如lbpdb4)并OPEN,再切换容器、建表空间、建用户并授CREATE SESSION权限;CDB$ROOT中无users等业务表空间,跨容器操作必报错。

Oracle 21c 安装时默认不自动创建用户 PDB,pdbseed 是只读模板库,不能直接用它来建业务用户或表空间 —— 必须先显式创建新 PDB,再在该 PDB 内操作。
为什么直接在 CDB$ROOT 里创建用户会报“表空间不存在”
Oracle 21c 强制启用多租户(CDB/PDB 架构),CDB$ROOT 中的表空间(如 SYSTEM、SYSAUX)仅供 CDB 自身元数据使用,普通用户无法在其上创建对象。你看到的“表空间不存在”错误,往往是因为:
– 试图在 CDB$ROOT 中执行 CREATE USER ... DEFAULT TABLESPACE users,但 users 表空间实际只存在于某个 PDB 内;
– 或者虽已创建 PDB,但没切换容器(ALTER SESSION SET CONTAINER = lbpdb4)就执行建用户语句。
根本原因:CDB 和 PDB 的数据字典、表空间、用户体系完全隔离。
创建 PDB 前必须确认 pdbseed 状态
pdbseed 是 Oracle 自带的只读模板 PDB,安装后即存在,但必须处于 READ ONLY 状态才能被用于克隆。验证方式:
SELECT con_id, name, open_mode, restricted FROM v$pdbs WHERE name = 'PDBSEED';
常见问题:
- 如果返回空或
open_mode是MOUNTED,说明 CDB 没正常启动,需先执行STARTUP; - 若
open_mode是READ WRITE,这是异常状态,需立即修复:ALTER PLUGGABLE DATABASE pdbseed CLOSE;→ALTER PLUGGABLE DATABASE pdbseed OPEN READ ONLY;; -
FILE_NAME_CONVERT参数路径必须真实存在且 Oracle 进程有写权限,否则克隆失败并卡在MOUNTED状态。
用 pdbseed 创建可写 PDB 的最小可靠命令
以下命令在 sysdba 权限下执行,适用于 Linux/Windows 原生安装或 Docker 镜像:
CREATE PLUGGABLE DATABASE lbpdb4
ADMIN USER lbpdb4_admin IDENTIFIED BY "123456"
FILE_NAME_CONVERT = ('/opt/oracle/oradata/XE/pdbseed/', '/opt/oracle/oradata/XE/lbpdb4/');
关键点:
- 路径末尾斜杠不能省略,否则文件名拼接出错;
- 目标路径(第二个参数)必须提前
mkdir -p并chown oracle:oinstall; - 不要加
STORAGE (MAXSIZE ...)等限制,除非明确需要资源隔离; - 创建后立即执行
ALTER PLUGGABLE DATABASE lbpdb4 OPEN;,否则后续所有操作都会报ORA-65086: cannot open/close a pluggable database。
绑定用户与表空间的顺序不能颠倒
在新 PDB 内完成以下三步,缺一不可:
- 切换容器:
ALTER SESSION SET CONTAINER = lbpdb4; - 创建表空间(指定
LOCAL管理,避免 CDB 共享):CREATE TABLESPACE app_data DATAFILE '/opt/oracle/oradata/XE/lbpdb4/app_data01.dbf' SIZE 100M AUTOEXTEND ON; - 创建用户并绑定:
CREATE USER appuser IDENTIFIED BY "pass123" DEFAULT TABLESPACE app_data QUOTA UNLIMITED ON app_data;
容易被忽略的是:即使表空间路径和名字都对,如果没执行 GRANT CREATE SESSION TO appuser;,用户仍无法连接 —— 这不是权限继承问题,而是 PDB 级权限必须显式授予。











