pdb表空间操作必须在目标pdb上下文中显式执行,否则命令静默无效或作用于cdb$root;需先用show con_name确认容器,再alter session set container=pdb1,且创建表空间、设默认表空间等均须在pdb内用alter pluggable database执行。

确认当前会话是否在目标 PDB 中
这是最常被跳过的一步,也是绝大多数表空间操作失败的根源。连上数据库不等于就在 PDB 里——默认连接的是 CDB$ROOT。
- 运行
SHOW CON_NAME,输出必须是你的 PDB 名(如PDB1),不是CDB$ROOT - 若当前是
CDB$ROOT,立即执行:ALTER SESSION SET CONTAINER = pdb1; - 更稳妥的方式是直连:用
sqlplus /@pdb1或sqlplus sys@localhost:1521/pdb1 as sysdba,避免手动切换遗漏
创建 PDB 专属表空间时路径与参数必须严格隔离
PDB 的数据文件不能和 CDB 或其他 PDB 共用路径,否则可能触发 ORA-01119(文件已存在)或 ORA-65096(非法公共用户名)等错误。
- 路径建议使用子目录隔离,例如:
/u01/oradata/CDB1/PDB1/users01.dbf,而非复用 CDB 的/u01/oradata/CDB1/system01.dbf -
EXTENT MANAGEMENT LOCAL是强制要求,不可省略;AUTOEXTEND ON也强烈建议开启,否则 PDB 默认不自动扩展,DML 会因空间耗尽报ORA-01653 - 示例:
CREATE TABLESPACE users_pdb1 DATAFILE '/u01/oradata/CDB1/PDB1/users01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 2G;
设置默认表空间和临时表空间必须用 ALTER PLUGGABLE DATABASE
在 PDB 内执行 ALTER DATABASE DEFAULT TABLESPACE 是错的,会报错或无效果。PDB 级别的默认设置只能通过 ALTER PLUGGABLE DATABASE 发起。
- 设默认永久表空间:
ALTER PLUGGABLE DATABASE DEFAULT TABLESPACE users_pdb1; - 建临时表空间注意关键字是
TEMPORARY TABLESPACE,不是TABLESPACE:CREATE TEMPORARY TABLESPACE temp_pdb1 TEMPFILE '/u01/oradata/CDB1/PDB1/temp01.dbf' SIZE 50M; - 再设默认临时表空间:
ALTER PLUGGABLE DATABASE DEFAULT TEMPORARY TABLESPACE temp_pdb1; - 验证是否生效:
SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE 'DEFAULT%';
限制 PDB 总存储容量防止资源越界
一个 PDB 若无上限,可能占满共享存储,影响其他 PDB。CDB 管理员需主动设置 STORAGE(MAXSIZE),该限制作用于该 PDB 所有数据文件总和。
- 创建时指定:
CREATE PLUGGABLE DATABASE pdb1 STORAGE (MAXSIZE 5G); - 对已存在 PDB 修改:
ALTER PLUGGABLE DATABASE pdb1 STORAGE (MAXSIZE 5G); - 该值不能超过 CDB 实例剩余可用空间,且修改后需重启 PDB 才能生效(
ALTER PLUGGABLE DATABASE pdb1 CLOSE; OPEN;) - 查当前用量:
SELECT SUM(bytes)/1024/1024 AS mb FROM cdb_data_files WHERE con_id = (SELECT con_id FROM v$pdbs WHERE name = 'PDB1');
CREATE TABLESPACE 成功,数据文件就已写入磁盘;误删 DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES 会导致物理文件丢失,无法仅靠闪回查询恢复。操作前务必确认容器、路径、权限三重上下文。











