Server Pool 在 Oracle 12c RAC 多租户中仅负责 CDB 实例的节点分配与故障转移,不提供 PDB 级隔离;真正的租户隔离依赖 PDB Resource Manager、IORM 及专用 service 配置。

Oracle 12c RAC 中 Server Pool 本身不提供多租户(CDB/PDB)级别的隔离能力,它只负责实例级资源调度;真正的租户隔离必须依赖 CDB 内部的 PDB + Resource Manager + IORM 组合实现。
Server Pool 在 RAC 多租户场景中实际起什么作用
Server Pool 是 Oracle Clusterware 的资源分组机制,用于将节点按用途划分(如 pool1 专跑核心 PDB,pool2 跑报表类 PDB),但它只控制“哪些节点上运行哪个 CDB 实例”,不感知 PDB 存在。一个 CDB 实例启动后,所有 PDB 默认可被该实例服务——Server Pool 不会阻止 PDB_A 的连接请求路由到本该服务 PDB_B 的实例上。
常见误用现象:srvctl add database -d cdb1 -g pool1 后以为 PDB_A 就只在 pool1 节点运行,结果发现 SELECT con_id, name FROM v$pdbs 在所有节点都可见,且连接未受限制。
- Server Pool 管理的是
database(即 CDB 实例)的启动位置和故障转移范围 - 它无法限制客户端连向某个 PDB 时被路由到哪个节点——这由 SCAN listener 和 service_name 的注册方式决定
- 若想让某 PDB “尽量”只在特定节点活动,必须配合 service 配置:用
srvctl add service创建专用 service,并指定-serverpool pool1和-pdb pdb_a
真正起租户隔离作用的是 PDB-level Resource Manager + IORM
RAC 环境下,PDB 间 CPU、I/O、并发会话的硬隔离,靠的是 CDB 层启用的 Instance Caging + I/O Resource Management(IORM),而非 Server Pool。IORM 在 12.1.0.2+ 支持跨节点协调,是 RAC 多租户资源隔离的核心。
典型配置漏掉就会失效:
- 必须在 CDB$ROOT 中执行
ALTER SYSTEM SET resource_manager_plan='MIXED_WORKLOAD_PLAN' SCOPE=BOTH,否则 PDB 级计划不生效 - 每个 PDB 内需创建并启用自己的资源计划:进入
ALTER SESSION SET CONTAINER=pdb_a后运行CREATE PLAN pdb_a_plan...,再ALTER SYSTEM SET resource_manager_plan='pdb_a_plan' - IORM 配置需在 CDB$ROOT 中通过
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE显式为每个 PDB 分配SHARE或UTILIZATION_LIMIT - 若未设置
UTILIZATION_LIMIT,高负载 PDB 可能吃光整个 CDB 的 I/O 带宽,哪怕它被绑在单独 Server Pool
service_name 是连接隔离的关键入口,不是 Server Pool
用户访问 PDB 的路径是:tnsnames.ora 指向一个 service_name → SCAN listener 根据该 service 注册信息路由到对应 CDB 实例 → 实例根据 service 关联的 PDB 属性自动切换容器上下文。这个链条里,Server Pool 只影响实例在哪跑,service 才决定“谁可以连谁”。
实操要点:
- 每个 PDB 应创建独立 service:
srvctl add service -d cdb1 -s pdb_a_svc -r cdb1_1 -a cdb1_2 -pdb pdb_a - service 必须带
-pdb参数,否则连接时不会自动进 PDB,而是连到 CDB$ROOT - 不要复用默认 service(如
cdb1),否则所有 PDB 共享同一入口,彻底失去连接层隔离 - 客户端连接串必须明确指定
service_name=pdb_a_svc,不能只写sid=cdb1
RAC 中 PDB OPEN 状态与 Server Pool 无关,但影响可用性
新建 PDB 默认为 MOUNTED,RAC 下必须在每个节点手动 ALTER PLUGGABLE DATABASE pdb_a OPEN,否则即使 service 已注册,连接也会报 ORA-65086: cannot open pluggable database。这个操作跟 Server Pool 无任何关系,是 RAC 多实例环境的基本要求。
容易踩的坑:
- 只在一个节点执行
OPEN,其他节点仍是MOUNTED,导致部分连接失败 - 未用
srvctl modify database -d cdb1 -s "pdb_a_svc,pdb_b_svc"将 service 与数据库绑定,导致重启后 service 不自动注册 - 忘记在
spfile中设置enable_pluggable_database=TRUE,导致实例启动后 PDB 无法自动 OPEN
Server Pool 是粗粒度的节点分组工具,而多租户隔离是细粒度的会话级、I/O 级、内存级控制。把隔离期望全压给 Server Pool,等于跳过了 Oracle 多租户最核心的资源管理层——PDB 自身的 Resource Manager 和 CDB 层的 IORM 配置,这两处一旦漏设,再严格的 Server Pool 划分也挡不住资源争抢。


















