RAC 攻击 - Oracle 集群数据库实战 / 调度程序测试
外观
在 RAC 中,PL/SQL 可以运行在任何一个节点上,在设计流程时必须考虑到这一点。我们将通过两个简单的测试来简要了解这一特性。
首先,我们来看看调度程序。请注意,此实验室依赖于在 并行查询测试 中创建的 PXTEST 服务。
- 以 oracle 身份登录节点 collabn1 并确认 pxtest 服务在实例 RAC2 上运行。collabn1:/home/oracle[RAC1]$ srvctl status service -d RAC -s pxtest 服务 pxtest 正在实例(s) RAC2 上运行 collabn1:/home/oracle[RAC1]$
- 关闭服务。collabn1:/home/oracle[RAC1]$ srvctl stop service -d RAC -s pxtest collabn1:/home/oracle[RAC1]$
- 以 sh 身份登录 RAC1 服务,并创建一个作业类别和一个 PL/SQL 过程,我们可以从作业中执行。请注意,服务名称区分大小写!collabn1:/home/oracle[RAC1]$ sqlplus sh/sh@RAC1 exec dbms_scheduler.create_job_class('TESTOFF1',service=>'pxtest'); create or replace procedure traceme(id varchar2) as x number; begin execute immediate 'alter session set tracefile_identifier=||id||'; dbms_session.session_trace_enable(true,true); select count(*) into x from sh.customers; dbms_session.session_trace_disable(); end; /
- 安排作业立即运行,并使用与 PXTEST 服务绑定的作业类别。检查它是否已运行。连续多次查询 user_schedule_jobs 表。发生了什么事?select job_name, schedule_type, job_class, enabled, auto_drop, state from user_scheduler_jobs; begin dbms_scheduler.create_job('TESTJOB1','PLSQL_BLOCK', job_action=>'traceme(scheduler01);', job_class=>'TESTOFF1',enabled=>true); end; / select job_name, schedule_type, job_class, enabled, auto_drop, state from user_scheduler_jobs;
- 启动 PXTEST 服务并再次检查作业状态。确保连续多次查询 user_schedule_jobs 表。(耐心等待至少一分钟。) 作业是否已执行?如果是,那么是在哪个节点上执行的?host srvctl start service -d RAC -s pxtest select job_name, schedule_type, job_class, enabled, auto_drop, state from user_scheduler_jobs; host ssh collabn2 ls -sh /u01/app/oracle/diag/rdbms/rac/RAC2/trace/*scheduler01.trc host ssh collabn1 ls -sh /u01/app/oracle/diag/rdbms/rac/RAC1/trace/*scheduler01.trc
- 修改 PXTEST 服务以在两个节点上运行并停止它。SQL> host srvctl modify service -d RAC -s pxtest -n -i RAC1,RAC2 SQL> host srvctl stop service -d RAC -s pxtest
- 提交 20 个作业来运行程序,然后启用服务。(这样所有作业都应该几乎同时被安排。) 它们在哪个节点(s) 上执行?begin FOR i IN 10..29 LOOP dbms_scheduler.create_job('TESTJOB'||i,'PLSQL_BLOCK', job_action=>'traceme(scheduler'||i||');', job_class=>'TESTOFF1',enabled=>true); END LOOP; end; / select job_name, schedule_type, job_class, enabled, auto_drop, state from user_scheduler_jobs; SQL> host srvctl start service -d RAC -s pxtest select job_name, schedule_type, job_class, enabled, auto_drop, state from user_scheduler_jobs; host ssh collabn2 ls -sh /u01/app/oracle/diag/rdbms/rac/RAC2/trace/*scheduler*.trc host ssh collabn1 ls -sh /u01/app/oracle/diag/rdbms/rac/RAC1/trace/*scheduler*.trc