查清PDB超配额需先查DBA_TS_QUOTAS:空行表示QUOTA为0(禁止写入),mb_used>mb_quota为真超限,-1为UNLIMITED;配额须用ALTER USER显式设置,单位不敏感但表空间名大小写敏感;PDB级STORAGE(MAXSIZE)和datafile级MAXSIZE需双控兜底。

查清PDB里谁在超配额,先看DBA_TS_QUOTAS
配额超限不是“空间满了”这么简单,而是用户在某个表空间没被显式授予足够QUOTA,哪怕表空间本身还有几十GB空闲,CREATE TABLE也会直接报ORA-01536: space quota exceeded for tablespace 'USERS'。关键是要确认是不是真超了,还是压根就没设。
进目标PDB后执行:
SELECT username, tablespace_name, bytes/1024/1024 AS mb_used, max_bytes/1024/1024 AS mb_quota FROM dba_ts_quotas WHERE username = 'APP_USER';
- 返回空行 → 等效
QUOTA 0,不是遗漏,是强制禁止 -
mb_used > mb_quota→ 真超了,但注意bytes包含已删除但未回收的段(如DROP TABLE后没SHRINK) -
mb_quota = -1→ 表示UNLIMITED,此时配额检查被绕过(但不推荐)
限制PDB内用户配额:必须ALTER USER,不能靠GRANT
UNLIMITED TABLESPACE权限看起来能“一劳永逸”,但它只是跳过配额检查,不解决“该用户是否被允许往这个表空间写数据”这个前提。而且它违背最小权限原则,生产环境应禁用。
正确做法是在CDB$ROOT或目标PDB中执行ALTER USER,显式设置QUOTA:
ALTER USER app_user QUOTA 500M ON users_tenant_a;
- 单位不敏感:
500M、512000K、524288000等价,建议统一用M或G - 表空间名大小写敏感:若创建时用了双引号
"USERS_TENANT_A",这里也必须带引号 -
QUOTA 0 ON users_tenant_a不是“限制为零”,而是彻底禁止新建段(已有表INSERT仍可能因扩展extent失败) - 设完立刻生效,无需重启PDB或刷新缓存
PDB整体存储上限:用STORAGE(MAXSIZE)硬控
单靠用户配额只能防住“人”,防不住程序批量写入或大对象堆积。Oracle 19c支持在PDB级设总存储上限,这才是兜底手段。
创建PDB时指定:
CREATE PLUGGABLE DATABASE pdb_hr STORAGE (MAXSIZE 20G) ...
已有PDB可修改:
ALTER PLUGGABLE DATABASE pdb_hr STORAGE (MAXSIZE 20G);
- 超过会报
ORA-65001: operation would exceed maximum size,比配额错误更早拦截 - 该限制独立于表空间
AUTOEXTEND行为——即使数据文件能自扩,PDB总容量也不能突破MAXSIZE - 注意:此参数只对PDB有效,CDB级无对应机制
- 修改后立即生效,但不会自动收缩已有数据;需配合
DBMS_SPACE_ADMIN或手工迁移清理
别漏掉AUTOEXTEND的坑:它绑定在datafile,不是tablespace
很多人想“限制表空间自动扩展”,结果执行ALTER TABLESPACE users AUTOEXTEND ON报ORA-00905。因为自动扩展能力是按单个DATAFILE配置的,不是表空间级语法。
先查当前datafile状态:
SELECT file_name, autoextensible, bytes/1024/1024 AS curr_mb, maxbytes/1024/1024 AS max_mb FROM dba_data_files WHERE tablespace_name = 'USERS_TENANT_A';
-
autoextensible = 'NO'→ 先开扩展:ALTER DATABASE DATAFILE '/path/to/file.dbf' AUTOEXTEND ON; -
max_mb = 0→ 需补MAXSIZE:ALTER DATABASE DATAFILE '/path/to/file.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 5G; -
max_mb = 32767→ 很可能是隐式32GB封顶(db_block_size=8K),再扩会报ORA-02142
真正难处理的是:STORAGE(MAXSIZE)和DATAFILE MAXSIZE是两层控制,前者管PDB总量,后者管单个文件上限,两者都要设才稳妥。一个设了另一个没设,就等于留了后门。











