从Oracle 11g开始支持数据库负荷重放(Database Replay)功能,通过捕获生产服务器上的工作负荷,然后在测试系统上重放工作负荷,以此来帮助评估测试系统上性能的变化,辅助解决性能问题。
使用Database Replay,需要执行四个主要步骤:
1)捕获工作负荷
2)预处理工作负荷
3)重放工作负荷
4)分析和报告
记录过程自身在生产系统上带来的开销极低。但是根据捕获时间的长短,需要保证拥有足够的磁盘空间来保存捕获的工作负荷。如果磁盘空间用尽,则捕获过程将停止。如果可能,务必在无活动会话时开始捕获过程。虽然可以捕获正在进行中的事务,但可能无法正常重放,因为这样只会在目标系统重放每个正在进行的事务的一部分。捕获操作不包含诸如SQL*Loader操作、Oracle流、闪回查询、OCI对象导航、非基于SQL的对象访问、远程describe和commit命令。
以下示范Database replay功能的使用:
一、生产库上的操作
1、用sys或system用户身份登录,创建用户、表和目录并授权:
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、以sys或system用户身份连接,终止捕获并预处理捕获信息为可以在目标系统上重放的重放文件:
conn / as sysdba
exec dbms_workload_capture.finish_capture;
exec dbms_workload_replay.process_capture('PLAY_D');
二、测试库上的操作
1、用sys或system用户身份登录,创建用户、表和目录并授权,与生产库对应:
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;
/
研究生成的报告,注意Replay和Capture的DB Time值:
7、以player用户身份连接,向表中添加一个主键约束:
conn player/player
alter table t1 add constraint t1_pk primary key(object_id);
8、重复3、4、5、6步骤,观察重放报告中DB Time值的变化,说明定义约束后性能的提高。
9、使用delete_replay_info过程删除重放目录中的报告,参数中指定需要删除的报告ID:
exec dbms_workload_replay.delete_replay_info(1);
10、清理测试用户和目录:
drop user player cascade;
drop directory play_d;