4.1 KiB
Executable File
4.1 KiB
Executable File
Setup user workload
create user XIZOR identified by secret;
grant connect, resource to XIZOR;
grant unlimited tablespace to XIZOR;
connect XIZOR/secret
DROP TABLE test1 purge;
CREATE TABLE test1(id NUMBER, descr VARCHAR(50));
-- execute 4 times in order to generate 2.000.000 lines
DECLARE
i NUMBER;
nbrows NUMBER;
BEGIN
SELECT NVL(MAX(id),0) INTO i FROM test1;
i:=i+1;
nbrows:=i+5000000;
LOOP
EXIT WHEN i>nbrows;
INSERT INTO test1 VALUES(i, RPAD('A',49,'A'));
i:=i+1;
END LOOP;
COMMIT;
END;
/
select count(*) from test1;
Setup capture environement
create or replace directory dbcapture AS '/home/oracle/rat';
Filter capture in order to catch only our user ations:
exec dbms_workload_capture.add_filter('XIZOR user','USER','XIZOR');
col type format a10
col status format a10
col name format a20
col attribute format a10
col value format a30
SET lines 150
SELECT type,status,name,attribute,value FROM dba_workload_filters;
Start capture
exec dbms_workload_capture.start_capture(name => 'XIZOR capture', dir => 'DBCAPTURE', default_action => 'EXCLUDE');
SET lines 150
col name FOR a20
col directory FOR a20
col status FOR a20
col filters_used FOR 999
SELECT id,name,directory,status,filters_used from DBA_WORKLOAD_CAPTURES;
Run user worlkoad
Run as XIZOR user:
SET serveroutput ON SIZE 999999
DECLARE
i NUMBER;
random_id NUMBER;
maxid NUMBER;
stmt VARCHAR2(100);
BEGIN
SELECT NVL(MAX(id),0) INTO maxid FROM test1;
FOR i IN 1..10 LOOP
random_id:=ROUND(DBMS_RANDOM.VALUE(1,maxid));
DBMS_OUTPUT.PUT_LINE('UPDATE test1 SET id=' || random_id || ' WHERE id=' || random_id || ';');
UPDATE test1 SET id=random_id WHERE id=random_id;
END LOOP;
COMMIT;
END;
/
Finish capture
exec DBMS_WORKLOAD_CAPTURE.FINISH_CAPTURE(timeout => 0, reason => 'Load test over');
Generate capture report:
SET lines 150
SET pagesize 1000
SET LONG 999999
SET longchunksize 150
select DBMS_WORKLOAD_CAPTURE.report(1,'HTML') from dual;
Prepare replay environement
exec DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE('DBCAPTURE');
exec DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY(replay_name => 'XIZOR replay', replay_dir => 'DBCAPTURE');
SET lines 150
col name FOR a20
col directory FOR a20
col status FOR a20
select id,name,directory,status from dba_workload_replays;
exec DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY();
Calibrate replay:
wrc replaydir=/home/oracle/rat mode=calibrate
(optional) change structure
Before running the replay we will change the structure on database in order to generate a real difference between capture and replay scenario:
create index test1_idx_id ON test1(id);
exec dbms_stats.gather_table_stats('XIZOR','TEST1');
Replay
Create a user for RAT replay:
create user rat_user identified by secret;
create role rat_role;
grant create session to rat_role;
grant execute on dbms_workload_capture to rat_role;
grant execute on dbms_workload_replay to rat_role;
grant create session to rat_role;
grant create any directory to rat_role;
grant select_catalog_role to rat_role;
grant execute on dbms_workload_repository to rat_role;
grant administer sql tuning set to rat_role;
grant oem_advisor to rat_role;
grant create job to rat_role;
grant become user to rat_role;
grant rat_role to rat_user;
Start worker client:
wrc rat_user/secret replaydir=/home/oracle/rat
Start the replay:
exec DBMS_WORKLOAD_REPLAY.START_REPLAY();
Check replay status and wait until status is COMPLTED:
SET lines 150
col name FOR a20
col directory FOR a20
col status FOR a20
select id,name,directory,status from dba_workload_replays;
Generate reply report
Identify the ID of the replay and generate the report:
SET lines 150
SET pagesize 1000
SET LONG 999999
SET longchunksize 150
SELECT dbms_workload_replay.report(1,'HTML') FROM dual;