Oracle PDB 资源管理与隔离
Oracle PDB 资源管理与隔离
适用版本:Oracle Database 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
多租户环境中,PDB 共享 CDB 资源(CPU、内存、I/O)[1],需要资源管理:
| 资源 | 隔离机制 |
|---|---|
| CPU | Resource Manager Shares |
| 内存 | SGA/PGA 限制 |
| I/O | Utilization Limit |
| 会话数 | Sessions 限制 |
| 并行 | Parallel Limit |
2. CDB Resource Manager
2.1 创建 CDB Plan
-- 1. 创建 pending area
EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
-- 2. 创建 CDB Plan
EXEC DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'cdb_plan',
comment => 'Production CDB plan'
);
-- 3. 创建 PDB Directive
EXEC DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'cdb_plan',
pluggable_database => 'hrpdb',
shares => 2,
utilization_limit => 60,
parallel_server_limit => 60,
memory_limit => 40
);
EXEC DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'cdb_plan',
pluggable_database => 'salespdb',
shares => 3,
utilization_limit => 80,
parallel_server_limit => 80,
memory_limit => 50
);
-- 4. 验证并提交
EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
-- 5. 启用
ALTER SYSTEM SET resource_manager_plan='cdb_plan' SCOPE=BOTH;
2.2 Directive 参数
| 参数 | 说明 |
|---|---|
| shares | CPU 份额(相对值) |
| utilization_limit | CPU 利用率上限(0-100%) |
| parallel_server_limit | 并行服务器上限 |
| memory_limit | 内存上限(%) |
| memory_min | 内存下限(%) |
| fetal_pct | undo 限制 |
3. Shares vs Utilization Limit
3.1 Shares
相对权重:
-- hrpdb: 2 shares, salespdb: 3 shares, default: 1 share
-- 空闲时:都可使用 100% CPU
-- 争用时:hrpdb 33%, salespdb 50%, default 17%
3.2 Utilization Limit
绝对上限:
-- salespdb utilization_limit=80
-- 即使空闲,最多也只能用 80% CPU
3.3 组合使用
PDB A: shares=3, utilization_limit=80
PDB B: shares=2, utilization_limit=60
PDB C: shares=1, utilization_limit=40
争用时按 shares 比例分配,但不超过 utilization_limit
4. PDB 内存管理
4.1 设置 PDB 内存
-- 在 PDB 中设置
ALTER SESSION SET CONTAINER = hrpdb;
ALTER SYSTEM SET sga_target=2G SCOPE=BOTH;
ALTER SYSTEM SET sga_min_size=1G SCOPE=BOTH;
ALTER SYSTEM SET pga_aggregate_limit=1G SCOPE=BOTH;
ALTER SYSTEM SET pga_aggregate_target=500M SCOPE=BOTH;
4.2 Memory Limit vs Target
| 参数 | 说明 |
|---|---|
| sga_target | SGA 目标大小 |
| sga_min_size | SGA 最小保证 |
| pga_aggregate_limit | PGA 硬上限 |
| pga_aggregate_target | PGA 目标 |
4.3 CDB 内存分配
-- CDB 总内存
SHOW PARAMETER sga_target; -- 16G
SHOW PARAMETER pga_aggregate_limit; -- 8G
-- PDB 内存分配
-- hrpdb: sga_target=4G (25%)
-- salespdb: sga_target=6G (37.5%)
-- 余下:CDB$ROOT + PDB$SEED + 其他
5. PDB CPU 隔离
5.1 CPU Count
-- 在 PDB 中限制 CPU 数
ALTER SESSION SET CONTAINER = hrpdb;
ALTER SYSTEM SET cpu_count=4 SCOPE=BOTH;
5.2 Resource Manager
-- 通过 Resource Manager 控制
-- shares=2(相对权重)
-- utilization_limit=50(绝对上限 50%)
5.3 监控 CPU 使用
SELECT
p.name AS pdb_name,
r.cpu_consumed_time,
r.cpu_wait_time,
r.cpu_utilization
FROM v$rsrc_pdb r, v$pdbs p
WHERE r.con_id = p.con_id;
6. PDB 并行管理
6.1 限制 PDB 并行度
-- 在 PDB 中设置
ALTER SESSION SET CONTAINER = hrpdb;
ALTER SYSTEM SET parallel_max_servers=10 SCOPE=BOTH;
ALTER SYSTEM SET parallel_min_servers=2 SCOPE=BOTH;
6.2 Resource Manager 限制
-- CDB Plan 中限制
EXEC DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'cdb_plan',
pluggable_database => 'hrpdb',
parallel_server_limit => 10 -- 最多 10 个并行服务器
);
7. PDB I/O 限制
7.1 I/O Utilization Limit
-- 通过 Resource Manager
EXEC DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'cdb_plan',
pluggable_database => 'salespdb',
utilization_limit => 60 -- I/O 与 CPU 一起限制
);
7.2 I/O Calibration
-- 测量 I/O 性能
EXEC DBMS_RESOURCE_MANAGER.CALIBRATE_IO(
num_physical_disks => 8,
max_latency => 20,
max_iops => :max_iops,
max_mbps => :max_mbps,
actual_latency => :actual_latency
);
8. PDB 会话限制
8.1 Sessions 参数
-- 在 PDB 中设置
ALTER SESSION SET CONTAINER = hrpdb;
ALTER SYSTEM SET sessions=200 SCOPE=BOTH;
8.2 Profile 限制
-- 在 PDB 中创建 Profile
ALTER SESSION SET CONTAINER = hrpdb;
CREATE PROFILE hr_profile LIMIT
SESSIONS_PER_USER 5;
详细内容见:Oracle Profile 与资源限制。
9. PDB 隔离(19c+)
9.1 19c 隔离特性
-- 19c 支持 PDB 级隔离参数
ALTER SESSION SET CONTAINER = hrpdb;
ALTER SYSTEM SET max_iops=1000 SCOPE=BOTH;
ALTER SYSTEM SET max_mbps=100 SCOPE=BOTH;
9.2 PDB Lockdown Profile
-- 创建 PDB Lockdown Profile
-- 在 CDB$ROOT
ALTER SESSION SET CONTAINER = CDB$ROOT;
CREATE LOCKDOWN PROFILE hr_lockdown;
-- 禁用某些特性
ALTER LOCKDOWN PROFILE hr_lockdown DISABLE FEATURE=('PARTITIONING');
-- 应用到 PDB
ALTER SESSION SET CONTAINER = hrpdb;
ALTER SYSTEM SET pdb_lockdown=hr_lockdown SCOPE=BOTH;
10. 监控 PDB 资源
10.1 资源使用统计
SELECT
p.name AS pdb_name,
r.cpu_consumed_time,
r.cpu_wait_time,
r.memory_used,
r.memory_max,
r.io_megabytes,
r.io_requests
FROM v$rsrc_pdb r, v$pdbs p
WHERE r.con_id = p.con_id;
10.2 当前资源等待
SELECT
p.name AS pdb_name,
r.resource_name,
r.current_utilization,
r.max_utilization
FROM v$rsrc_pdb r, v$pdbs p, v$rsrc_name n
WHERE r.con_id = p.con_id
AND r.resource_id = n.resource_id;
10.3 历史资源使用
SELECT
p.name AS pdb_name,
h.snap_id,
h.cpu_consumed_time,
h.memory_used
FROM dba_hist_rsrc_pdb h, v$pdbs p
WHERE h.con_id = p.con_id
AND h.snap_id > (SELECT max(snap_id)-10 FROM dba_hist_snapshot)
ORDER BY h.snap_id DESC, p.name;
11. 常见坑与排错
11.1 PDB 资源争抢
现象:一个 PDB 占用过多资源影响其他 PDB。
修复:
-- 1. 设置 Utilization Limit
EXEC DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'cdb_plan',
pluggable_database => 'bad_pdb',
utilization_limit => 30
);
-- 2. 设置 Shares
EXEC DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'cdb_plan',
pluggable_database => 'bad_pdb',
shares => 1
);
11.2 PDB 内存不足
现象:PDB ORA-04031。
修复:
-- 1. 检查 PDB 内存配置
ALTER SESSION SET CONTAINER = hrpdb;
SHOW PARAMETER sga_target;
-- 2. 调整内存
ALTER SYSTEM SET sga_target=4G SCOPE=BOTH;
-- 3. 检查 CDB 内存
ALTER SESSION SET CONTAINER = CDB$ROOT;
SHOW PARAMETER sga_target;
11.3 Resource Manager 未启用
现象:PDB 资源未受限制。
修复:
-- 1. 启用 Resource Manager
ALTER SYSTEM SET resource_manager_plan='cdb_plan' SCOPE=BOTH;
-- 2. 验证
SHOW PARAMETER resource_manager_plan;
11.4 并行查询失败
现象:PDB 并行查询报错。
修复:
-- 1. 检查并行配置
ALTER SESSION SET CONTAINER = hrpdb;
SHOW PARAMETER parallel_max_servers;
-- 2. 调整
ALTER SYSTEM SET parallel_max_servers=20 SCOPE=BOTH;
12. 最佳实践
- 使用 Resource Manager:PDB 资源隔离
- 关键业务高 Shares:保证 CPU
- 非关键业务低 Utilization Limit:限制资源
- PDB 内存限制:避免内存争抢
- PDB Lockdown Profile:限制功能
- 监控资源使用:v$rsrc_pdb
- 设置 CPU Count:明确限制
- PDB Sessions 限制:避免连接耗尽
- 19c+ 使用 IOPS 限制:I/O 隔离
- 定期审查计划:业务变化调整
13. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Managing PDBs with Resource Manager” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/
[2] Oracle Multitenant Administrator’s Guide 19c, “Resource Allocation Among PDBs” https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/