设为首页 收藏本站
查看: 1578|回复: 0

[经验分享] OCP读书笔记(16)

[复制链接]

尚未签到

发表于 2015-6-16 12:43:44 | 显示全部楼层 |阅读模式
  使用者组
  创建资源用户组OLTP_GRP,将用户HR,OE加入此组:
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.create_consumer_group(
    consumer_group => 'OLTP_GRP',
    comment => '',      
    cpu_mth => 'ROUND-ROBIN'
  );
  dbms_resource_manager.submit_pending_area();
      BEGIN
            dbms_resource_manager_privs.grant_switch_consumer_group('HR', 'OLTP_GRP', false);
            dbms_resource_manager_privs.grant_switch_consumer_group('OE', 'OLTP_GRP', false);
      END;
END;
  创建资源用户组BATH_GRP,将用户BI,SH加入此组:
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.create_consumer_group(
    consumer_group => 'BATH_GRP',
    comment => '',
    cpu_mth => 'ROUND-ROBIN'
  );
  dbms_resource_manager.submit_pending_area();
  BEGIN
    dbms_resource_manager_privs.grant_switch_consumer_group('BI', 'BATH_GRP', false);
    dbms_resource_manager_privs.grant_switch_consumer_group('SH', 'BATH_GRP', false);
  END;
END;
  将HR,OE的初始化用户组制定为OLTP_GRP
  BEGIN
      dbms_resource_manager.set_initial_consumer_group(
            user => 'HR',
            consumer_group => 'OLTP_GRP'
      );
END;
  BEGIN
      dbms_resource_manager.set_initial_consumer_group(
            user => 'OE',
            consumer_group => 'OLTP_GRP'
      );
END;
  将BI,SH的初始化用户组制定为BATH_GRP
  BEGIN
      dbms_resource_manager.set_initial_consumer_group(
            user => 'BI',
            consumer_group => 'BATH_GRP'
      );
END;
  BEGIN
      dbms_resource_manager.set_initial_consumer_group(
            user => 'SH',
            consumer_group => 'BATH_GRP'
      );
END;
  创建一个资源计划“MY_DAY_PLAN”,并对CPU进行资源分配:
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.create_plan( 'MY_DAY_PLAN', '');
  dbms_resource_manager.create_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'BATH_GRP',
        comment => '',
        cpu_p1 => NULL, cpu_p2 => 20, cpu_p3 => NULL, cpu_p4 => NULL,
        cpu_p5 => NULL, cpu_p6 => NULL, cpu_p7 => NULL, cpu_p8 => NULL,
        parallel_degree_limit_p1 => NULL,
        active_sess_pool_p1 => NULL,
        queueing_p1 => NULL,
        switch_group => '',
        switch_time => NULL,
        switch_estimate => false,
        max_est_exec_time => NULL,
        undo_pool => NULL,
        max_idle_time => NULL,
        max_idle_blocker_time => NULL,
        switch_time_in_call => NULL
  );
  dbms_resource_manager.create_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'OLTP_GRP',
        comment => '',
        cpu_p1 => NULL, cpu_p2 => 80, cpu_p3 => NULL, cpu_p4 => NULL,
        cpu_p5 => NULL, cpu_p6 => NULL, cpu_p7 => NULL, cpu_p8 => NULL,
        parallel_degree_limit_p1 => NULL,
        active_sess_pool_p1 => NULL,
        queueing_p1 => NULL,
        switch_group => '',
        switch_time => NULL,
        switch_estimate => false,
        max_est_exec_time => NULL,
        undo_pool => NULL,
        max_idle_time => NULL,
        max_idle_blocker_time => NULL,
        switch_time_in_call => NULL
  );
  dbms_resource_manager.create_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'OTHER_GROUPS',
        comment => '',
        cpu_p1 => NULL, cpu_p2 => NULL, cpu_p3 => 100, cpu_p4 => NULL,
        cpu_p5 => NULL, cpu_p6 => NULL, cpu_p7 => NULL, cpu_p8 => NULL,
        parallel_degree_limit_p1 => NULL,
        active_sess_pool_p1 => NULL,
        queueing_p1 => NULL,
        switch_group => '',
        switch_time => NULL,
        switch_estimate => false,
        max_est_exec_time => NULL,
        undo_pool => NULL,
        max_idle_time => NULL,
        max_idle_blocker_time => NULL,
        switch_time_in_call => NULL
  );
  dbms_resource_manager.create_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'SYS_GROUP',
        comment => '',
        cpu_p1 => 100, cpu_p2 => NULL, cpu_p3 => NULL, cpu_p4 => NULL,
        cpu_p5 => NULL, cpu_p6 => NULL, cpu_p7 => NULL, cpu_p8 => NULL,
        parallel_degree_limit_p1 => NULL,
        active_sess_pool_p1 => NULL,
        queueing_p1 => NULL,
        switch_group => '',
        switch_time => NULL,
        switch_estimate => false,
        max_est_exec_time => NULL,
        undo_pool => NULL,
        max_idle_time => NULL,
        max_idle_blocker_time => NULL,
        switch_time_in_call => NULL
  );
  dbms_resource_manager.submit_pending_area();
  dbms_resource_manager.switch_plan( plan_name => 'MY_DAY_PLAN', sid => 'orcl' );
END;
  确认用户的初始化用户组:
  conn /as sysdba
alter user hr account unlock identified by hr;
alter user oe account unlock identified by oe;
alter user bi account unlock identified by bi;
alter user sh account unlock identified by sh;
  grant select on v_$session to hr,oe,bi,sh;
grant select on v_$mystat to hr,oe,bi,sh;
  conn hr/hr
select resource_consumer_group from v$session where sid=(select sid from v$mystat where rownum=1);
  conn bi/bi
select resource_consumer_group from v$session where sid=(select sid from v$mystat where rownum=1);
  我们不仅可以通过指定用户与资源用户组的映射关系,从而指定用户所产生的session所属的用户组,我们还可以通过其他映射关系来指定session属于哪个用户组
  资源管理器提供了很多种映射用户组的方法,比如我们可以指定某个特定的客户端计算机名称登录到数据库产生的session属于某个用户组,也可以指定通过某个特定的应用程序登录到数据库所产生的session属于某个用户组等
  由于我们可以设置登录到操作系统的用户所对应的用户组(比如oracle对应os_grp组),同时设置登录数据库用户所对应的用户组(比如用户HR对应OLTP_GRP),因此就存在一个问题,当这两种设置存在矛盾时,应该怎么办?比如,我们以oracle用户登录操作系统,然后以HR用户登录到数据库,这时产生的session到底属于哪个用户组呢?
通过设定这些映射的优先级来解决这个问题,默认情况下,操作系统用户映射关系的优先级比数据库用户映射关系低
  测试对CPU的限制
在hr和bi下分别运行死循环:
conn hr/hr
declare
    i number;
    j number;
begin
    i := 0;
    loop
        j := sqrt(i);
        i := i + 1;
    end loop;
end;
conn bi/bi
declare
    i number;
    j number;
begin
    i := 0;
    loop
        j := sqrt(i);
        i := i + 1;
    end loop;
end;
  对并行度的限定
  在没有对BATH_GRP进行限定之前:
  conn sh/sh
  select sid from v$mystat where rownum=1;
  select /*+parallel(sales,6)*/ * from sales;
  conn /as sysdba
  select sid, qcsid, degree from v$px_session where qcsid=159;
  对其限定后:
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.update_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'BATH_GRP',
        new_comment => '',
        new_parallel_degree_limit_p1 => 3
  );
  dbms_resource_manager.submit_pending_area();
END;
  conn sh/sh
  select sid from v$mystat where rownum=1;
  select /*+parallel(sales,6)*/ * from sales;
  conn /as sysdba
  select sid, qcsid, degree from v$px_session where qcsid=140;
  可以看到,虽然只指定了并行度为6,但是使用资源管理器对其限定后,只产生3个从属进程
  设置活动的会话数(session个数)
  当用户组里某个用户所产生的会话数超过了session数的限定值时,如果还要再产生session,则会将session放入队列,直到当前正在活动的session变为不活动时,等待活动的session才开始活动,该队列为先进先出的规则,注意,并行执行时产生的从属进程不算作活动的session,我们可以控制试图活动的session在队列里存放的时间长度,这叫超时。如果在队列里的session等待时间超过指定的时间,则该session被切断。
  对OLTP_GRP进行限定
  conn /as sysdba
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.update_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'BATH_GRP',
        new_comment => '',
        new_active_sess_pool_p1 => 2,
        new_queueing_p1 => 5
  );
  dbms_resource_manager.submit_pending_area();
END;
  以bi用户连入数据库,开两个会话,并运行死循环
  conn bi/bi
  declare
    i number;
    j number;
begin
    i := 0;
    loop
        j := sqrt(i);
        i := i + 1;
    end loop;
end;
  conn bi/bi
  declare
    i number;
    j number;
begin
    i := 0;
    loop
        j := sqrt(i);
        i := i + 1;
    end loop;
end;
  开第三个session
  conn bi/bi
  ERROR:
ORA-07454: queue timeout, 5 second(s), exceeded
  select sysdate from dual;
select sysdate from dual
                    *
ERROR at line 1:
ORA-07454: queue timeout, 5 second(s), exceeded
  将其中一个session,kill掉
  select sysdate from dual;
  产生UNDO的数量
  conn /as sysdba
grant select on dba_objects to hr;
  conn hr/hr
create table test as select * from dba_objects;
  conn /as sysdba
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.update_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'OLTP_GRP',
        new_comment => '',
        new_undo_pool => 1
  );
  dbms_resource_manager.submit_pending_area();
END;
  超出了限制,报错。
  update test set OBJECT_NAME=lpad('abc',100);
update test set OBJECT_NAME=lpad('abc',100)
       *
ERROR at line 1:
ORA-30027: Undo quota violation - failed to get 60 (bytes)
  估计执行时间的上限
  当session还没开始较长时间的操作之前就被终止
  conn hr/hr
create table test as select * from dba_objects;
  conn /as sysdba
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.update_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'OLTP_GRP',
        new_comment => '',
        new_max_est_exec_time => 1
  );
  dbms_resource_manager.submit_pending_area();
END;
  conn hr/hr
  select count(*) from test;
  ERROR at line 1:
ORA-07455: estimated execution time (2 secs), exceeds limit (1 secs)
  使用者组切换
  当session执行时间的上限超过了指定的值后,切换到另一个组
  conn /as sysdba
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.update_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'OLTP_GRP',
        new_comment => '',
        new_switch_group => 'BATH_GRP',
        new_switch_time => 10
  );
  dbms_resource_manager.submit_pending_area();
END;
  以HR用户打开一个session,执行死循环
  conn hr/hr
  declare
    i number;
    j number;
begin
    i := 0;
    loop
        j := sqrt(i);
        i := i + 1;
    end loop;
end;
  打开监视器,10秒钟后发现以hr登录的session被切换到了BATH_GRP
  设置空闲时间的上限
  conn /as sysdba
  BEGIN
  dbms_resource_manager.clear_pending_area();
  dbms_resource_manager.create_pending_area();
  dbms_resource_manager.update_plan_directive(
        plan => 'MY_DAY_PLAN',
        group_or_subplan => 'OLTP_GRP',
        new_comment => '',
        new_max_idle_time => 5,
        new_max_idle_blocker_time => 10
  );
  dbms_resource_manager.submit_pending_area();
END;
  conn hr/hr
连接到数据库后,什么都不干,超过5秒运行任何操作都报错如:
  select sysdate from dual;
ERROR at line 1:
ORA-02396: exceeded maximum idle time, please connect again
  conn hr/hr
update employees set first_name='aaa' where employee_id=108;
  conn hr/hr
update employees set first_name='aaa' where employee_id=108;
  当超过10秒后,第一个session会被中断,第二个session被执行

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-77956-1-1.html 上篇帖子: interval 下篇帖子: 构架师之路(2) 开闭原则(Open-Closed Principle,OCP)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表