转载

数据库负荷重放(Database replay)

Oracle 11g开始支持数据库负荷重放(Database Replay)功能,通过捕获生产服务器上的工作负荷,然后在测试系统上重放工作负荷,以此来帮助评估测试系统上性能的变化,辅助解决性能问题。


使用Database Replay,需要执行四个主要步骤:

1)捕获工作负荷

2)预处理工作负荷

3)重放工作负荷

4)分析和报告


记录过程自身在生产系统上带来的开销极低。但是根据捕获时间的长短,需要保证拥有足够的磁盘空间来保存捕获的工作负荷。如果磁盘空间用尽,则捕获过程将停止。如果可能,务必在无活动会话时开始捕获过程。虽然可以捕获正在进行中的事务,但可能无法正常重放,因为这样只会在目标系统重放每个正在进行的事务的一部分。捕获操作不包含诸如SQL*Loader操作、Oracle流、闪回查询、OCI对象导航、非基于SQL的对象访问、远程describecommit命令。


以下示范Database replay功能的使用:


一、生产库上的操作


1、用syssystem用户身份登录,创建用户、表和目录并授权:

sqlplus / as sysdba

grant dba to player identified by player;

create table player.t1 as select * from all_objects;

create directory play_d as 'd:/play_d';

grant all on directory play_d to public;


2、开始捕获,两个参数是自定义的捕获名称和保存捕获的Oracle目录:

exec dbms_workload_capture.start_capture('cap1', 'PLAY_D');


3、以新的用户身份连接,运行生成数据库工作负荷的PL/SQL块:

conn player/player


declare

    m number;

begin

    for i in 1 .. 1000 loop

        select count(1) into m from t1 where object_id = 1;

    end loop;

end;

/


4、以syssystem用户身份连接,终止捕获并预处理捕获信息为可以在目标系统上重放的重放文件:

conn / as sysdba

exec dbms_workload_capture.finish_capture;

exec dbms_workload_replay.process_capture('PLAY_D');


二、测试库上的操作


1、用syssystem用户身份登录,创建用户、表和目录并授权,与生产库对应:

sqlplus / as sysdba

grant dba to player identified by player;

create table player.t1 as select * from all_objects;

create directory play_d as 'd:/play_d';

grant all on directory play_d to public;


2、将生产库play_d目录中的内容复制到测试库的play_d中。


3、重放的数据库状态准备:

exec dbms_workload_replay.initialize_replay('cap1', 'PLAY_D');

exec dbms_workload_replay.prepare_replay;


4、在操作系统命令提示符下启动重放客户端,重新创建所有客户端请求。一个重放客户端可以重放来自许多会话的语句:

C:/Users/Administrator>wrc player/player replaydir=d:/play_d


Workload Replay Client: Release 11.2.0.1.0 - Production on 星期五 1月 19 11:07:35 2018


Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


Wait for the replay to start (11:07:35)


5、回到SQL*Plus中启动重放,这将允许创建的客户端开始运行捕获的工作负荷中的语句:

exec dbms_workload_replay.start_replay;


6、检索重放报告:


首先获取ID

select id, capture_id, directory, start_time, end_time from dba_workload_replays;


        ID CAPTURE_ID DIRECTORY                      START_TIME          END_TIME

---------- ---------- ------------------------------ ------------------- -------------------

         1          1 PLAY_D                         2018-01-19 03:08:54


执行检索,可以生成HTML格式的文件或者生成TEXT格式的文件:

spool d:/play_d/report.html

select dbms_workload_replay.report(1, 'HTML') from dual;

spool off


根据需要,也可以用以下PL/SQL程序检索和生成报告:

declare

    capt_dir_id number;

    curr_replay_id number;

    replay_report  clob;

begin

    capt_dir_id := dbms_workload_replay.get_replay_info(dir => 'PLAY_D');

    select max(id)

      into curr_replay_id

      from dba_workload_replays

     where capture_id = capt_dir_id;

    replay_report := dbms_workload_replay.report(replay_id => curr_replay_id,

                                                 format    => dbms_workload_replay.type_text);

end;

/


研究生成的报告,注意ReplayCaptureDB Time值:


数据库负荷重放(Database replay)


7、以player用户身份连接,向表中添加一个主键约束:

conn player/player

alter table t1 add constraint t1_pk primary key(object_id);


8、重复3456步骤,观察重放报告中DB Time值的变化,说明定义约束后性能的提高。


9、使用delete_replay_info过程删除重放目录中的报告,参数中指定需要删除的报告ID

exec dbms_workload_replay.delete_replay_info(1);


10、清理测试用户和目录:

drop user player cascade;

drop directory play_d;

正文到此结束
Loading...