安装时勾选“创建 Pluggable Database”仅生成MOUNTED状态的空壳PDB,不可直接使用;必须手动OPEN、创建业务用户及表空间、注册并验证服务名,且CREATE PLUGGABLE DATABASE需显式指定file_name_convert或启用db_create_file_dest,否则数据文件将误写入$ORACLE_HOME/dbs。
安装时勾选“创建 Pluggable Database”只生成一个 PDB$SEED 派生的空壳 PDB,状态为 MOUNTED,不能直接用。真正可用的 PDB 必须手动创建或补全三件事:OPEN、建业务用户、注册服务名。
直接执行 CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdbadmin IDENTIFIED BY pwd 会报 ORA-65016。Oracle 19c 要求明确数据文件位置,否则默认写进 $ORACLE_HOME/dbs(非法路径)。
ALTER SYSTEM SET db_create_file_dest = '/u01/app/oracle/oradata/cdb1';
file_name_convert,注意路径末尾斜杠不能少:FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/cdb1/pdbseed/', '/u01/app/oracle/oradata/cdb1/pdb1/')
PATH_PREFIX + STORAGE 控制基础目录和大小上限,但依然要配 file_name_convert 或 OMF,否则失败SHOW PDBS 看到状态是 MOUNTED 是正常现象,但这意味着你无法 ALTER SESSION SET CONTAINER = pdb1,更没法建用户或表空间。
ALTER PLUGGABLE DATABASE pdb1 OPEN READ WRITE;
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;
SAVE STATE 不生效,得靠 srvctl 配置启动依赖即使 PDB 已 OPEN,sqlplus user/pass@host:1521/pdb1 仍会报 ORA-12505 —— 因为监听器只注册了 CDB 的服务名(如 orclcdb),新 PDB 的服务名(如 orclpdb)不会自动广播。
SELECT name FROM v$services WHERE pdb = 'PDB1';
EXEC DBMS_SERVICE.CREATE_SERVICE('orclpdb', 'orclpdb');
EXEC DBMS_SERVICE.START_SERVICE('orclpdb');
lsnrctl status 输出里要有 Service "orclpdb",没有就说明没注册成功,再重启监听器
在 PDB 内建用户时报 ORA-65048 或卡在 ALTER SESSION SET CONTAINER,往往是因为 PDB 内缺少 USERS 表空间,或 DEFAULT TABLESPACE 参数指向了一个不存在的表空间。
ALTER SESSION SET CONTAINER = pdb1; → 成功后立即查:
SELECT property_name, property_value FROM database_properties WHERE property_name = 'DEFAULT_TABLESPACE';
USERS 但 SELECT tablespace_name FROM dba_tablespaces 里没有,就得手工建:CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/cdb1/pdb1/users01.dbf' SIZE 100M;
DEFAULT TABLESPACE 必须在 PDB 内已存在,且不能是 SYSTEM 或 SYSAUX
最常卡住的地方不是 CREATE 语句写错,而是 file_name_convert 路径少斜杠、SAVE STATE 在 RAC 下失效、DEFAULT TABLESPACE 名字拼错或根本没建——这些细节一漏,PDB 就永远停在 MOUNTED,连 ALTER SESSION 都进不去。