对于Oracle RAC集群数据库,有两种资源管理方式:Administrator Managed(管理员管理的),Policy Managed(策略管理的)

要理解这两个概念,首先应该了解Server Pools(服务器池),以下内容译自Oracle官方文档

服务器池是集群的逻辑拆分————集群被拆分到服务器池中,这被分配用于承载数据库或应用程序。服务器池由crsctl命令和srvctl命令来管理。

在集群中,服务器池的名字必须唯一,也就是不同服务器池不能有相同的名字。

服务器池管理有两种风格,即“Administrator Managed(管理员管理的)”和“Policy Managed(策略管理的)”

Administrator Managed(管理员管理的)
由数据库管理员来指定数据库资源应该在哪些服务器上运行,并在需要时手工放置资源。这种管理策略是在以前的版本中使用的。

Policy Managed(策略管理的)
数据库管理员指定数据库在哪个服务器池(除generic和free之外)中运行。由Oracle Clusterware负责把数据库资源放到某个服务器。

以下是实验操作,实验环境是一套两节点的11.2.0.4 RAC

查看已有的Server Pools(由grid用户执行)
 [grid@yyjdb01 ~]$ crsctl status serverpool -f
 NAME=Free
 IMPORTANCE=0
 MIN_SIZE=0
 MAX_SIZE=-1
 SERVER_NAMES=
 PARENT_POOLS=
 EXCLUSIVE_POOLS=
 ACL=owner:grid:rwx,pgrp:oinstall:rwx,other::r-x
 ACTIVE_SERVERS=NAME=Generic
 IMPORTANCE=0
 MIN_SIZE=0
 MAX_SIZE=-1
 SERVER_NAMES=yyjdb01 yyjdb02
 PARENT_POOLS=
 EXCLUSIVE_POOLS=
 ACL=owner:grid:r-x,pgrp:oinstall:r-x,other::r-x
 ACTIVE_SERVERS=yyjdb01 yyjdb02NAME=ora.yyj11g_test_db
 IMPORTANCE=0
 MIN_SIZE=0
 MAX_SIZE=-1
 SERVER_NAMES=yyjdb01 yyjdb02
 PARENT_POOLS=Generic
 EXCLUSIVE_POOLS=
 ACL=owner:oracle:rwx,pgrp:oinstall:rwx,other::r--
 ACTIVE_SERVERS=yyjdb01 yyjdb02NAME=ora.yyj11gsrvpool
 IMPORTANCE=0
 MIN_SIZE=0
 MAX_SIZE=2
 SERVER_NAMES=
 PARENT_POOLS=
 EXCLUSIVE_POOLS=
 ACL=owner:oracle:rwx,pgrp:oinstall:rwx,other::r--
 ACTIVE_SERVERS=其中的Free、Generic是默认已有的,不能分配给数据库
 ora.yyj11g_test_db是当前数据库的,虽然该数据库不是Policy Managed,但只要创建了数据库就会有一个同名的服务器池分配给它
 ora.yyj11gsrvpool是通过dbca创建的,这是尝试用dbca静默创建一个Policy Managed数据库失败后的产物 也可以使用srvctl命令查看当前已有的server pools,比如
 [grid@yyjdb01 ~]$ srvctl config srvpool
 Server pool name: Free
 Importance: 0, Min: 0, Max: -1
 Candidate server names: 
 Server pool name: Generic
 Importance: 0, Min: 0, Max: -1
 Candidate server names: yyjdb01,yyjdb02
 Server pool name: yyj11gsrvpool
 Importance: 0, Min: 0, Max: 2
 Candidate server names: 注意上面用srvctl config srvpool查看的内容不包含yyj11g_test_db
尝试删除yyj11gsrvpool池(这个命令执行后没有反馈直接回到命令行就说明已删除)
 srvctl remove srvpool -g yyj11gsrvpool再用srvctl查看就已经没有了
 [grid@yyjdb01 ~]$ srvctl config srvpool
 Server pool name: Free
 Importance: 0, Min: 0, Max: -1
 Candidate server names: 
 Server pool name: Generic
 Importance: 0, Min: 0, Max: -1
 Candidate server names: yyjdb01,yyjdb02 尝试添加一个新的server pool,先看一下命令帮助
 [grid@yyjdb01 ~]$ srvctl add srvpool -hAdds a server pool to the Oracle Clusterware.
Usage: srvctl add srvpool -g <pool_name> [-l <min>] [-u <max>] [-i <importance>] [-n "<server_list>"] [-f]
     -g <pool_name>           Server pool name
     -l <min>                 Minimum size of the server pool (Default value is 0)
     -u <max>                 Maximum size of the server pool (Default value is -1 for unlimited maximum size)
     -i <importance>          Importance of the server pool (Default value is 0)
     -n "<server_list>"       Comma separated list of candidate server names
     -f                       Force the operation even though some resource(s) will be stopped
     -h                       Print usage参数解释
 -g  服务器池的名字
 -l  服务器池的最小尺寸(默认为0)
 -u  服务器池的最大尺寸(默认为-1,也就是无限制,在使用dbca创建policy managed数据库时,这个值就是节点的个数)
 -i  服务器池的重要程度(默认为0)
 -n  逗号分开的候选服务器名列表
 -f  强制,即使某些资源将被停止也执行操作添加一个名叫yyjsrvpool的服务器池(无反馈直接回到命令行说明添加成功)
 srvctl add srvpool -g yyjsrvpool -n "yyjdb01,yyjdb02"查看一下刚刚创建的yyjsrvpool服务器池
 [grid@yyjdb01 ~]$ srvctl config srvpool
 Server pool name: Free
 Importance: 0, Min: 0, Max: -1
 Candidate server names: 
 Server pool name: Generic
 Importance: 0, Min: 0, Max: -1
 Candidate server names: yyjdb01,yyjdb02
 Server pool name: yyjsrvpool
 Importance: 0, Min: 0, Max: -1
 Candidate server names: yyjdb01,yyjdb02 查看一下yyj11g_test_db数据库的配置(注意最后一行指出是Admin Managed)
 [grid@yyjdb01 ~]$ srvctl config database -d yyj11g_test_db
 Database unique name: yyj11g_test_db
 Database name: 
 Oracle home: /u01/app/oracle/product/11.2/dbhome_1
 Oracle user: oracle
 Spfile: +DATA/yyj11g_test_db/spfileyyj11g.ora
 Domain: 
 Start options: open
 Stop options: immediate
 Database role: PRIMARY
 Management policy: AUTOMATIC
 Server pools: yyj11g_test_db
 Database instances: yyj11g1,yyj11g2
 Disk Groups: DATA,ARCH
 Mount point paths: 
 Services: 
 Type: RAC
 Database is administrator managed 把yyj11g_test_db数据库指派给新建的yyjsrvpool服务器池
 srvctl modify database -d yyj11g_test_db -g yyjsrvpool但是报错了,提示没有权限
 [grid@yyjdb01 ~]$ srvctl modify database -d yyj11g_test_db -g yyjsrvpool
 PRCD-1130 : Failed to convert administrator-managed database yyj11g_test_db into a policy-managed database to use server pool yyjsrvpool
 PRCR-1071 : Failed to register or update resource ora.yyj11g_test_db.db
 CRS-0245:  User doesn't have enough privilege to perform the operation改用oracle用户执行(无反馈回到命令行,说明成功)
 [root@yyjdb01 ~]# su - oracle
 Last login: Tue Nov 15 21:28:39 CST 2022
 [oracle@yyjdb01 ~]$ srvctl modify database -d yyj11g_test_db -g yyjsrvpool
 [oracle@yyjdb01 ~]$ 检查一下数据库配置,发现已变成Policy Managed
 [oracle@yyjdb01 ~]$ srvctl config database -d yyj11g_test_db
 Database unique name: yyj11g_test_db
 Database name: 
 Oracle home: /u01/app/oracle/product/11.2/dbhome_1
 Oracle user: oracle
 Spfile: +DATA/yyj11g_test_db/spfileyyj11g.ora
 Domain: 
 Start options: open
 Stop options: immediate
 Database role: PRIMARY
 Management policy: AUTOMATIC
 Server pools: yyjsrvpool
 Database instances: 
 Disk Groups: DATA,ARCH
 Mount point paths: 
 Services: 
 Type: RAC
 Database is policy managed 上面的操作成功的把yyj11g_test_db数据库从Admin Managed改成了Policy Managed,那么是不是可以反过来更改呢?
 没有直接的命令能把一个Oracle数据库从Policy Managed改成Admin Managed,但可以通过把数据库从RAC集群中移除再加入,使其重新回到Admin Managed状态 1. 关闭集群数据库
 srvctl stop database -d yyj11g_test_db2. 把数据库从集群中移除
 [oracle@yyjdb01 ~]$ srvctl remove database -d yyj11g_test_db
 Remove the database yyj11g_test_db? (y/[n]) y3. 把数据库重新加入集群(注意yyj11g_test_db是数据库db_unique_name的值)
 srvctl add database -d yyj11g_test_db -p "+DATA/yyj11g_test_db/spfileyyj11g.ora" -o $ORACLE_HOME4. 添加数据库实例
 srvctl add instance -d yyj11g_test_db -i yyj11g1 -n yyjdb01
 srvctl add instance -d yyj11g_test_db -i yyj11g2 -n yyjdb025. 开启数据库
 srvctl start database -d yyj11g_test_db 再查看数据库配置,就可以看到是Admin Managed模式了(最后一行)
 [oracle@yyjdb01 ~]$ srvctl config database -d yyj11g_test_db
 Database unique name: yyj11g_test_db
 Database name: 
 Oracle home: /u01/app/oracle/product/11.2/dbhome_1
 Oracle user: oracle
 Spfile: +DATA/yyj11g_test_db/spfileyyj11g.ora
 Domain: 
 Start options: open
 Stop options: immediate
 Database role: PRIMARY
 Management policy: AUTOMATIC
 Server pools: yyj11g_test_db
 Database instances: yyj11g1,yyj11g2
 Disk Groups: DATA,ARCH
 Mount point paths: 
 Services: 
 Type: RAC
 Database is administrator managed