Oracle 12c RAC中配置Policy-Managed数据库必须在DBCA创建阶段显式指定,不可后期更改;需启用Policy-Managed模式、预建自定义服务器池、使用service_name连接,并手动触发资源重平衡。

Oracle 12c RAC 中配置 Policy-Managed 数据库,不是在已有 Admin-Managed 数据库上切换模式,而是必须从 dbca 创建阶段就指定策略管理方式;否则创建完成后无法更改。
创建时必须启用 Policy-Managed 模式
Admin-Managed 是默认行为,只要没显式选择策略管理,dbca 就会按传统方式绑定实例到固定节点。Policy-Managed 的核心是把数据库交给服务器池(Server Pool)托管,由 Clusterware 动态调度实例位置和数量。
- 图形界面中:在 DBCA “Database Configuration Options” 页面,勾选 “Policy Managed Database”(不是“Administrator Managed”)
- 静默模式关键参数:
-databaseType POLICY_MANAGED,且必须同时指定-serverPoolName(如ora.mypool),不能用默认的Generic或Free - 若漏掉
-databaseType POLICY_MANAGED,即使后续手动修改服务器池,数据库资源也不会自动迁移或扩缩容——它仍被锁定在初始节点上
服务器池(Server Pool)需提前规划并验证
Policy-Managed 数据库运行依赖于自定义服务器池,而 Free 和 Generic 是系统保留池,不可用于承载用户数据库。
- 创建池示例(以 grid 用户执行):
crsctl create serverpool ora.mypool -attr "MIN_SIZE=1,MAX_SIZE=2,IMPORTANCE=10" - 确认池已生效:
crsctl status serverpool ora.mypool -f,输出中ACTIVE_SERVERS应包含至少一个节点名 - 常见错误:
srvctl add database -d mydb -o $ORACLE_HOME -c POLICY -y AUTOMATIC -g ora.mypool失败,往往因为ora.mypool的MAX_SIZE小于预期实例数,或池中无节点处于 ACTIVE 状态 - 注意:服务器池名字区分大小写,且不能含下划线以外的特殊字符(如点号在部分版本中会导致
srvctl解析失败)
数据库实例名不再固定,连接必须用 service_name
Policy-Managed 下,实例名后缀(如 mydb_1, mydb_2)由 Clusterware 动态分配,不按节点主机名顺序生成,也无法预测。直接连 mydb1 这类硬编码实例名会失败。
- 必须通过
srvctl config service -d mydb查看注册的服务名(如mydb_srv),应用连接字符串中使用该service_name -
srvctl start database -d mydb启动后,实际运行几个实例、在哪几个节点上,取决于服务器池当前可用节点数和MIN_SIZE/MAX_SIZE设置,不是人为指定 - 误用
tnsnames.ora中指向单个 VIP 或实例的连接描述符,会导致负载不均或连接中断——必须用 SCAN + service_name
资源变更后需手动触发重平衡
Policy-Managed 的“自动”仅体现在实例启停和分布上,不包括内存、CPU、IO 等运行时资源的动态调整。比如扩容节点后,新节点不会自动分担现有 PDB 负载。
- 添加节点到服务器池后,需手动触发:
crsctl modify serverpool ora.mypool -attr "MAX_SIZE=3",再执行srvctl relocate database -d mydb -n rac3(可选) - 如果数据库已启用 Resource Manager,确保 CDB 级计划(
DBMS_RESOURCE_MANAGER.CREATE_PLAN)已启用,否则 PDB 间无 CPU 隔离 - 最容易被忽略的一点:
srvctl stop database -d mydb不会清空服务器池中的预留资源,再次启动时可能因池容量不足而失败——建议配合crsctl status serverpool实时观察ACTIVE_SERVERS和SERVER_NAMES是否一致


















