此文已由作者赵欣授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
7.1 在rac双节点上分别限制不同用户的CPU最大使用率
创建g21和g22两个用户
CREATE USER G21 IDENTIFIED BY g21 DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;
GRANT CONNECT TO G21;
GRANT DBA TO G22;
CREATE USER G22 IDENTIFIED BY g22 DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;
GRANT CONNECT TO G22;
GRANT DBA TO G22;
创建控制用户g21的资源计划
创建未决区SQL> EXECUTE dbms_resource_manager.create_pending_area;
创建用户组
SQL> EXECUTE dbms_resource_manager.create_consumer_group (consumer_group => 'g2rac1', comment => 'g2rac1');
创建资源计划
SQL> EXECUTE DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN=> 'g2test1',CPU_MTH => 'EMPHASIS',COMMENT => ' g2 rac1plan');
创建资源计划指令
SQL> BEGIN
dbms_resource_manager.create_plan_directive
(plan => 'g2test1',
group_or_subplan => 'G2rac1',
comment => 'Limit cpu time',
MAX_UTILIZATION_LIMIT => 30);
dbms_resource_manager.create_plan_directive
(plan => 'g2test1',
group_or_subplan => 'OTHER_GROUPS',
comment => 'other time'
);
End;
/
这里需要记住每个plan中都必须有other_groups用户组,并且用命令指定时需要有COMMENT行
验证未决区SQL> EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
提交未决区SQL> EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
指派用户
EXECUTE dbms_resource_manager_privs.grant_switch_consumer_group('G21','G2rac1', true);
EXECUTE dbms_resource_manager.set_initial_consumer_group ('G21','G2rac1');
创建控制用户g22的资源计划
EXECUTE dbms_resource_manager.create_pending_area;
EXECUTE dbms_resource_manager.create_consumer_group (consumer_group => 'g2rac2', comment => 'g2rac2');
EXECUTE DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN=> 'g2test2',CPU_MTH => 'EMPHASIS',COMMENT => ' g2 rac2plan');
创建资源计划指令
SQL> BEGIN
dbms_resource_manager.create_plan_directive
(plan => 'g2test2',
group_or_subplan => 'G2rac2',
comment => 'Limit cpu time',
MAX_UTILIZATION_LIMIT => 30);
dbms_resource_manager.create_plan_directive
(plan => 'g2test2',
group_or_subplan => 'OTHER_GROUPS',
comment => 'other time'
);
End;
/
这里需要记住每个plan中都必须有other_groups用户组,并且用命令指定时需要有COMMENT行
验证提交未决区
EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
指派用户
EXECUTE dbms_resource_manager_privs.grant_switch_consumer_group('G22','G2rac2', true);
EXECUTE dbms_resource_manager.set_initial_consumer_group ('G22','G2rac2');
在节点一上控制g21用户,节点2上控制g22用户
启动资源计划SQL> ALTER SYSTEM SET resource_manager_plan='g2test1' sid='racdb1';
SQL> ALTER SYSTEM SET resource_manager_plan='g2test2' sid='racdb2';
节点一上看到
节点二上看到
模拟方式 |
节点一cpu情况 |
节点二cpu情况 |
模拟oracle单纯cpu高使用率 |
|
可用看到cpu的us使用基本被控制在30%
7.2 在某个节点上限制某个用户的会话超过IO数量即被关闭会话连接
通过em控制2号节点上IO数量超过100个,相关会话被关闭
直接修改g2test2这个资源计划
点击编辑即可进入修改,在阀值选项卡中设置IO请求限制为100
这样针对2号节点上g22用户的IO请求数量限制就完成了
对一个有10万行的表做查询
出现如下报错
7.3 使用crontab来完成对两个节点上相关资源计划的控制
由于时间窗口是整个数据库做调整,故而在单实例状态下通过时间窗口来控制不同时间的资源计划在rac下无法针对每个实例有对应的资源计划。可以改为在每个节点用自身的crontab来调用脚本完成资源计划的配置。
脚本如下:
sqlplus "/ as sysdba"<
ALTER SYSTEM SET resource_manager_plan='g2test2' sid='racdb2';
exit;
通过这个简单的脚本基础上做修改即可实现。
从11G开始oracle在强势推出它的exadata(在本文撰写期间已经推出到x3版本),跑在exadata上的11G数据库可以控制我们前文所说的资源以及在IO上做更强大的控制。这样我们的业务系统基于资源管理计划可以很好的分配各种用户甚至是各个实例的cpu等资源的使用分配,可以更好的解决单个主机多个数据库,或者是多个数据库整合到单一数据库后的资源控制问题以及rac下配合负载均衡来实现不同主机对应主要对应不同业务的目标实现。
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。