使用者组

创建资源用户组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被执行

OCP读书笔记(16) - 管理资源的更多相关文章

  1. OCP读书笔记(14) - 管理数据库性能

    搜集统计信息 1. dbms_stats gather_schema_stats 1)option:有四个选项: a.gather empty:只分析目前还没有搜集过统计信息的表 SQL> co ...

  2. OCP读书笔记(13) - 管理内存

    SGA 1. 什么是LRULRU表示Least Recently Used,也就是指最近最少使用的buffer header链表LRU链表串联起来的buffer header都指向可用数据块 2. 什 ...

  3. OCP读书笔记(15) - 管理SQL性能调优

    SQL Tuning Advisor(STA): 使用oracle提供的程序包进行sql优化 SQL> conn scott/tiger SQL), name )); SQL> inser ...

  4. webpack笔记二 管理资源

    webpack笔记二 管理资源 webpack最出色的功能之一就是除了引入JavaScript,还可以通过loader引入任何其它类型的文件. 加载CSS 为了在JavaScript模块中import ...

  5. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  6. OCP读书笔记(19) - 数据库空间管理

    传输表空间:将linux下的数据库中的test表空间传输到windows平台下的数据库 在传输表空间前,先确定一下源库与目标数据库字符集一致: select * from nls_database_p ...

  7. OCP读书笔记(18) - 空间管理

    OLTP 表压缩 压缩始终是非常占用CPU的过程,并且需要花费一定时间,通常,如果压缩数据,则数据必须解压缩后才能使用.虽然此要求在数据仓库环境中是可以接受的但在OLTP环境中可能无法接受 现在,在O ...

  8. 《Troubleshooting SQL Server》读书笔记-内存管理

    自调整的数据库引擎(Self-tuning Database Engine) 长期以来,微软都致力于自调整(Self-Tuning)的SQL Server数据库引擎,用以降低产品的总拥有成本.从SQL ...

  9. OCA读书笔记(8) - 管理用户安全

    创建用户:create user +用户 default tablespace + 表空间名 identified + 验证方式 SQL> create user easthome profil ...

随机推荐

  1. BZOJ 1257: [CQOI2007]余数之和sum( 数论 )

    n >= k 部分对答案的贡献为 k * (n - k) n < k 部分贡献为 ∑ (k - ⌊k / i⌋ * i)  = ∑  , ⌊k / i⌋ 相等的数是连续的一段, 此时这段连 ...

  2. 基于visual Studio2013解决面试题之1204大数组查找

     题目

  3. 基于visual Studio2013解决C语言竞赛题之1022最大数最小数

         题目 解决代码及点评 /************************************************************************/ ...

  4. 公司简介 - CCDI悉地国际-工程实践专业服务的引领者

    公司简介 - CCDI悉地国际-工程实践专业服务的引领者 关于悉地国际         CCDI悉地国际(以下简称"CCDI")创立于1994年,是在城市建设和开发领域从事综合专业 ...

  5. ARMv8 Linux内核head.S源码分析

    ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...

  6. Oracle管道函数(Pipelined Table Function)介绍

    一 概述: 1.管道函数即是能够返回行集合(能够使嵌套表nested table 或数组 varray)的函数,我们能够像查询物理表一样查询它或者将其  赋值给集合变量. 2.管道函数为并行运行,在普 ...

  7. HTML学习笔记(七)

    1.       假设想让div中的内容(content)垂直居中,能够将line-height的值设置与div的高度相等来实现. 2.       超伪类链接的四种形式: watermark/2/t ...

  8. Ubuntu下SVN命令行递归加入文件夹文件(免去一个一个的加入 --force)

    因为在Linux下一直没有找到好的svn工具(类似于TortiseSVN的).当然eSVN这些也不错,但就是使用上认为还不是很习惯.终于还是选择了svn原始的命令行工具来进行版本号控制操作. 命令行的 ...

  9. Tomcat 乱码设置

    如果表单是以get方式提交就会出现中文乱码这时可以在tomcat中配置解决中文乱码问题. 方法如下:在tomcat的conf文件夹下的conf中找到server.xml文件 找到 Connector ...

  10. Linux 静态库&动态库调用

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...