创建PDB时必须显式指定STORAGE参数才能限制空间,否则默认无上限且后续无法回填;STORAGE仅在CREATE或ALTER PLUGGABLE DATABASE ... OPEN时有效,修改前PDB须处于MOUNTED状态,MAXSIZE和MAX_SHARED_TEMP_SIZE分别限制数据文件总大小与CDB级临时表空间配额。
创建PDB时必须显式指定STORAGE参数才能限制空间
不加storage子句,pdb默认无空间上限,后续无法通过alter pluggable database回填限制。常见错误是执行:alter pluggable database storage (maxsize 2g),但报ora-65044: missing or invalid option following storage keyword——因为storage只能在create pluggable database或alter pluggable database ... open时使用,且必须跟在open之后。
正确写法示例:
CREATE PLUGGABLE DATABASE hrpdb ADMIN USER hr_adm IDENTIFIED BY password ROLES=(CONNECT) STORAGE (MAXSIZE 5G MAX_SHARED_TEMP_SIZE 200M);
-
MAXSIZE限制该PDB所有数据文件总大小(含SYSTEM/SYSAUX/USERS等) -
MAX_SHARED_TEMP_SIZE限制该PDB可使用的CDB级临时表空间配额(注意:不是自己建的临时表空间,而是共享CDB的TEMP) - 这两个值一旦设定,不可增大,只可通过
ALTER PLUGGABLE DATABASE ... STORAGE (MAXSIZE UNLIMITED)设为不限
ALTER PLUGGABLE DATABASE ... STORAGE仅在PDB MOUNTED状态下生效
很多用户尝试在PDB已OPEN READ WRITE时执行ALTER PLUGGABLE DATABASE hrpdb STORAGE (MAXSIZE 3G),结果报错ORA-65015: cannot modify storage attributes of a pluggable database that is open。这是因为Oracle强制要求修改STORAGE属性前PDB必须处于MOUNTED状态。
操作顺序必须是:
ALTER PLUGGABLE DATABASE hrpdb CLOSE IMMEDIATE;ALTER PLUGGABLE DATABASE hrpdb STORAGE (MAXSIZE 3G);ALTER PLUGGABLE DATABASE hrpdb OPEN;
漏掉CLOSE或OPEN会导致PDB不可用,且MAXSIZE不会生效。
PDB表空间自身配置与CDB层级限制是两套机制,需同时检查
即使设置了STORAGE (MAXSIZE 5G),如果PDB内某个表空间用了AUTOEXTEND ON MAXSIZE 10G,它仍可能突破5G总限——因为Oracle先校验表空间级MAXSIZE,再校验PDB级STORAGE。一旦触发前者,会报ORA-01237: cannot extend datafile;若触发后者,则报ORA-65029: exceeded maximum size for pluggable database。
验证方式:
- 查PDB级限制:
SELECT CON_ID, NAME, OPEN_MODE, TOTAL_SIZE FROM V$PDBS;(TOTAL_SIZE即MAXSIZE值) - 查表空间级限制:
SELECT TABLESPACE_NAME, MAXBYTES FROM DBA_TABLESPACES; - 查数据文件实际扩展能力:
SELECT FILE_NAME, AUTOEXTENSIBLE, MAXBYTES FROM DBA_DATA_FILES;
CDB中UNDO和TEMP表空间不受PDBSTORAGE直接控制
STORAGE (MAXSIZE)只管PDB自己的数据文件(SYSTEM/SYSAUX/USERS等),不管CDB共享的UNDO和TEMP。PDB对UNDO无独立配额,所有PDB共用CDB的UNDO表空间;而MAX_SHARED_TEMP_SIZE只是限制PDB能占用的CDB级TEMP总量,不是给它单独建一个临时表空间。
这意味着:
- 一个PDB执行大量排序或全局临时表操作,可能耗尽CDB的
TEMP,影响其他PDB——MAX_SHARED_TEMP_SIZE只是软限制,超限后语句会失败,但不会阻止其他PDB继续使用剩余空间 -
UNDO空间压力无法通过PDB参数缓解,必须靠CDB级UNDO_RETENTION和UNDO_TABLESPACE大小来调优 - 若要真正隔离临时空间,得在PDB内显式创建本地
TEMPORARY TABLESPACE并设为默认,这样它就走自己的临时文件,不碰CDB的TEMP
真正容易被忽略的是:PDB的STORAGE限制只在数据文件层生效,对内存、CPU、临时段这些资源完全无效——那些得靠DBMS_RESOURCE_MANAGER和12.2+的PDB级内存参数(如SGA_TARGET)来管。











