一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何创建Oracle19c容器数据库和PDB?

时间:2026-08-23 09:35:48 编辑:袖梨 来源:一聚教程网

安装时勾选“创建 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 语句必须带路径映射或启用 OMF

直接执行 CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdbadmin IDENTIFIED BY pwd 会报 ORA-65016。Oracle 19c 要求明确数据文件位置,否则默认写进 $ORACLE_HOME/dbs(非法路径)。

  1. 方案一:启用 Oracle Managed Files(OMF),在 CDB$ROOT 中执行:

    ALTER SYSTEM SET db_create_file_dest = '/u01/app/oracle/oradata/cdb1';

  2. 方案二:显式指定 file_name_convert,注意路径末尾斜杠不能少:

    FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/cdb1/pdbseed/', '/u01/app/oracle/oradata/cdb1/pdb1/')

  3. 方案三:用 PATH_PREFIX + STORAGE 控制基础目录和大小上限,但依然要配 file_name_convert 或 OMF,否则失败

刚创建的 PDB 默认 MOUNTED,不 OPEN 就连不进去

SHOW PDBS 看到状态是 MOUNTED 是正常现象,但这意味着你无法 ALTER SESSION SET CONTAINER = pdb1,更没法建用户或表空间。

  1. 必须先在 CDB$ROOT 中执行:

    ALTER PLUGGABLE DATABASE pdb1 OPEN READ WRITE;

  2. 加自启(否则重启 CDB 后又变 MOUNTED):

    ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;

  3. RAC 环境下 SAVE STATE 不生效,得靠 srvctl 配置启动依赖

连接 PDB 别用 SID,得靠 service_name

即使 PDB 已 OPEN,sqlplus user/pass@host:1521/pdb1 仍会报 ORA-12505 —— 因为监听器只注册了 CDB 的服务名(如 orclcdb),新 PDB 的服务名(如 orclpdb)不会自动广播。

  1. 查 PDB 实际服务名:

    SELECT name FROM v$services WHERE pdb = 'PDB1';

  2. 手动注册(在 CDB$ROOT 中):

    EXEC DBMS_SERVICE.CREATE_SERVICE('orclpdb', 'orclpdb');

    EXEC DBMS_SERVICE.START_SERVICE('orclpdb');

  3. 确认监听器已加载:

    lsnrctl status 输出里要有 Service "orclpdb",没有就说明没注册成功,再重启监听器

切容器前必须确保 DEFAULT TABLESPACE 已存在

在 PDB 内建用户时报 ORA-65048 或卡在 ALTER SESSION SET CONTAINER,往往是因为 PDB 内缺少 USERS 表空间,或 DEFAULT TABLESPACE 参数指向了一个不存在的表空间。

  1. 切换前先检查:

    ALTER SESSION SET CONTAINER = pdb1; → 成功后立即查:

    SELECT property_name, property_value FROM database_properties WHERE property_name = 'DEFAULT_TABLESPACE';

  2. 如果返回 USERSSELECT tablespace_name FROM dba_tablespaces 里没有,就得手工建:

    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/cdb1/pdb1/users01.dbf' SIZE 100M;

  3. DEFAULT TABLESPACE 必须在 PDB 内已存在,且不能是 SYSTEMSYSAUX

最常卡住的地方不是 CREATE 语句写错,而是 file_name_convert 路径少斜杠、SAVE STATE 在 RAC 下失效、DEFAULT TABLESPACE 名字拼错或根本没建——这些细节一漏,PDB 就永远停在 MOUNTED,连 ALTER SESSION 都进不去。

热门栏目