DBCA图形界面不支持配置PDB资源配额,因MAX_IOPS、MAX_MBPS、sga_target等参数需在CDB创建后通过ALTER SYSTEM命令在CDB$ROOT或各PDB中动态设置,且须满足内存隔离前提(如MEMORY_TARGET=0、SGA_TARGET>0),资源计划仅管控CPU/并行度,I/O限制必须依赖系统参数。
为什么直接在DBCA里配不了PDB资源配额
dbca创建cdb时勾选“创建为容器数据库”只初始化结构,max_iops、max_mbps、sga_target这些参数根本不会出现在图形界面里。很多人卡在这一步,以为点完就完事了,结果pdb之间io或内存互相抢资源,出现resmgr: i/o rate limit等待事件却找不到控制入口。
资源隔离必须靠CDB级系统参数 + PDB级ALTER SYSTEM命令组合实现,不是安装时一次性填数字能搞定的。
- CDB根容器中设置的
MAX_IOPS和MAX_MBPS是所有PDB默认值,不显式覆盖就全用这个 - PDB内执行
ALTER SYSTEM SET sga_target = 200M前,必须先ALTER SESSION SET CONTAINER = pdb_name -
pga_aggregate_target在PDB中设值不能超过CDB$ROOT里的pga_aggregate_target,否则报错ORA-02097
如何给单个PDB设置I/O上限避免“坏邻居”拖垮其他PDB
Oracle 12.2+才支持MAX_IOPS和MAX_MBPS,低于12.2版本设了也无效。这两个参数独立生效,可只设其一,也可都设。
实操建议:
- 先连CDB$ROOT:
sqlplus / as sysdba - 切到目标PDB:
ALTER SESSION SET CONTAINER = hrpdb; - 设I/O上限:
ALTER SYSTEM SET MAX_IOPS = 150 SCOPE = BOTH;和ALTER SYSTEM SET MAX_MBPS = 300 SCOPE = BOTH; - 验证是否生效:
SELECT CON_ID, MAX_IOPS, MAX_MBPS FROM V$RSRCPDBMETRIC_HISTORY WHERE ROWNUM
注意:设太低会频繁触发resmgr: I/O rate limit,建议从100/25起步,按压测结果逐步上调。
PDB内存隔离的关键条件和常见失败点
想对每个PDB单独控SGA/PGA,有三个硬性前提必须同时满足,缺一不可:
- CDB$ROOT中
NONCDB_COMPATIBLE = FALSE(默认就是,但有人升级后手动改过) - CDB$ROOT中
MEMORY_TARGET = 0(否则PDB的sga_target会被忽略) - CDB$ROOT中
SGA_TARGET > 0(必须启用自动SGA管理)
常见错误:
- 在CDB$ROOT里直接
ALTER SYSTEM SET sga_target = 200M—— 这是改整个CDB,不是某个PDB - 没确认
pga_aggregate_target是否小于CDB$ROOT值,导致ALTER SYSTEM报ORA-02097 - 用
SHOW PARAMETER sga_target查参数时没切换容器,看到的是CDB$ROOT的值,误以为PDB已生效
资源计划(Resource Plan)和系统参数的区别在哪
MAX_IOPS、sga_target这类是静态配额,属于“硬限制”。而DBMS_RESOURCE_MANAGER绑定的资源计划是动态调度策略,比如“白天让报表PDB最多用40% CPU,晚上放开到80%”。
关键区别:
- 系统参数(如
MAX_IOPS)在PDB级别直接ALTER SYSTEM即可,不需要启用资源管理器 - 资源计划必须先在CDB$ROOT中创建plan、consumer group,再用
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE把PDB绑进去,最后ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'MY_PLAN' - 资源计划对I/O无效——它只管CPU和并行度,I/O只能靠
MAX_IOPS/MAX_MBPS
多数场景下,优先用系统参数做基础隔离;只有需要按时间段动态调权时,才上资源计划。别一上来就堆复杂配置,很多问题其实一个ALTER SYSTEM SET MAX_MBPS = 200就能解决。











