Oracle PDB 资源管理与隔离

Oracle PDB 资源管理与隔离

适用版本:Oracle Database 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

多租户环境中,PDB 共享 CDB 资源(CPU、内存、I/O)[1],需要资源管理:

资源隔离机制
CPUResource Manager Shares
内存SGA/PGA 限制
I/OUtilization 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 参数

参数说明
sharesCPU 份额(相对值)
utilization_limitCPU 利用率上限(0-100%)
parallel_server_limit并行服务器上限
memory_limit内存上限(%)
memory_min内存下限(%)
fetal_pctundo 限制

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_targetSGA 目标大小
sga_min_sizeSGA 最小保证
pga_aggregate_limitPGA 硬上限
pga_aggregate_targetPGA 目标

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. 最佳实践

  1. 使用 Resource Manager:PDB 资源隔离
  2. 关键业务高 Shares:保证 CPU
  3. 非关键业务低 Utilization Limit:限制资源
  4. PDB 内存限制:避免内存争抢
  5. PDB Lockdown Profile:限制功能
  6. 监控资源使用:v$rsrc_pdb
  7. 设置 CPU Count:明确限制
  8. PDB Sessions 限制:避免连接耗尽
  9. 19c+ 使用 IOPS 限制:I/O 隔离
  10. 定期审查计划:业务变化调整

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/