第一部分 执行流程
1.1 Replay 流程
Database Replay实施的流程是workload_capture->workload preprocess->replay client prepare->replay->generate replay report,对于同一个capture可以进行多次replay
1.2 相关执行数据库
生产数据库:用于workload_capture,即负载捕获
迁移数据库:用于workload_ preprocess和replay,即负载预处理和负载重放
Replay client:用于发起workload的客户端进程
第二部分 生产数据库
2.1 创建capture目录
需要确保目录下无任何文件(目录rac各节点都要建),目录用来存放capture数据
mkdir -p /home/oracle/capdir
create or replace directory capdir as '/home/oracle/capdir';
2.2 创建过滤器(可选)
过滤器可以通过START_CAPTURE 过程的DEFAULT_ACTION 参数,参数值INCLUDE为排除过滤器或者EXCLUDE为包含过滤器。
创建TPCC用户执行信息的过滤器:
EXEC DBMS_WORKLOAD_CAPTURE.ADD_FILTER ('filter_user1', 'USER', 'TPCC');
过滤器其他方式:
exec dbms_workload_capture.ADD_FILTER( fname IN VARCHAR2, fattribute IN
VARCHAR2,fvalueIN VARCHAR2);
fattribute:
INSTANCE_NUMBER - type NUMBER
USER - type STRING
MODULE - type STRING
ACTION - type STRING
PROGRAM - type STRING
SERVICE - type STRING
PDB - type STRING
exec
dbms_workload_capture.add_filter(fname=>'filter_prog1',fattribute=>'PROGRAM',fvalue=>'%OMS%');
exec dbms_workload_capture.add_filter(fname=>'filter_prog2',fattribute=>'PROGRAM',fvalue=>'%emagent%');
capture 所有的信息,可以跳过过滤器设置
查询过滤器
select * from dba_workload_filters;
删除过滤器
exec DBMS_WORKLOAD_CAPTURE.DELETE_FILTER('filter_user1');
2.3 运行Capture
10g数据库需要开启PRE_11G_ENABLE_CAPTURE
alter system set PRE_11G_ENABLE_CAPTURE=true;
函数:
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
name IN VARCHAR2,
dir IN VARCHAR2,
duration IN NUMBER DEFAULT NULL,
default_action IN VARCHAR2 DEFAULT 'INCLUDE',
auto_unrestrict IN BOOLEAN DEFAULT TRUE,
capture_sts IN BOOLEAN DEFAULT FALSE,
sts_cap_interval IN NUMBER DEFAULT 300);
注意:过滤器默认是排除,如果需要包含过滤器内容,default_action值需要设置为EXCLUDE。
Duration单位为秒,设置为NULL时,则captureprocess 必须手工调用FINISH_CAPTURE 过程来结束。
BEGIN
DBMS_WORKLOAD_CAPTURE.start_capture (name => 'test_capture_1',
dir =>'CAPDIR',
default_action=>'EXCLUDE'
duration => NULL);
END;
/
指定时间捕获:
BEGIN
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
name => 'test_capture_1',
dir => 'CAPDIR',
duration => 3600);
END;
/
2.4 生产库业务进行
生产数据库运行阶段
2.5 停止capture
BEGIN
DBMS_WORKLOAD_CAPTURE.finish_capture;
END;
若指定时间捕获,则可查看捕获状态是否完成,也可以手动进行停止捕获
select id, name, status,dir_path from dba_workload_captures where id = (select max(id) from dba_workload_captures);
ID NAME STATUS DIR_PATH
----- ---------------- --------------- -------------------------
2 test_capture_1 COMPLETED /home/oracle/capdir
2.6 捕获生成文件
capture捕获生成的文件如下:
total 18252
-rw-r--r--. 1 oracle oinstall 9294509 Feb 25 11:06 wcr_5wp4fn4002vhm.rec
-rw-r--r--. 1 oracle oinstall 9308639 Feb 25 11:06 wcr_5wp4fnc002vhp.rec
-rw-r--r--. 1 oracle oinstall 6495 Feb 25 11:06 wcr_5wp4fnn002vhr.rec
-rw-r--r--. 1 oracle oinstall 1239 Feb 25 11:06 wcr_5wp4g8w002v4q.rec
-rw-r--r--. 1 oracle oinstall 40590 Feb 25 11:06 wcr_cr.html
-rw-r--r--. 1 oracle oinstall 20386 Feb 25 11:06 wcr_cr.text
-rw-r--r--. 1 oracle oinstall 168 Feb 25 11:06 wcr_fcapture.wmd
-rw-r--r--. 1 oracle oinstall 98 Feb 25 11:03 wcr_scapture.wmd
2.8 导出awr报告
exec dbms_workload_capture.export_awr (capture_id => 2);
导出的awr报告可以导入到目标库上,用来做对比,生成compare period report需要。
$ ls -l
total 25656
-rw-r--r--. 1 oracle oinstall 9294509 Feb 25 11:06 wcr_5wp4fn4002vhm.rec
-rw-r--r--. 1 oracle oinstall 9308639 Feb 25 11:06 wcr_5wp4fnc002vhp.rec
-rw-r--r--. 1 oracle oinstall 6495 Feb 25 11:06 wcr_5wp4fnn002vhr.rec
-rw-r--r--. 1 oracle oinstall 1239 Feb 25 11:06 wcr_5wp4g8w002v4q.rec
-rw-r-----. 1 oracle oinstall 7565312 Feb 25 11:17 wcr_ca.dmp
-rw-r--r--. 1 oracle oinstall 10926 Feb 25 11:17 wcr_ca.log
-rw-r--r--. 1 oracle oinstall 40590 Feb 25 11:06 wcr_cr.html
-rw-r--r--. 1 oracle oinstall 20386 Feb 25 11:06 wcr_cr.text
-rw-r--r--. 1 oracle oinstall 168 Feb 25 11:06 wcr_fcapture.wmd
-rw-r--r--. 1 oracle oinstall 98 Feb 25 11:03 wcr_scapture.wmd
2.9 查询dba_workload_captures
可以获取到capture ID和capture的snap信息
SQL> select id,AWR_BEGIN_SNAP,AWR_END_SNAP from dba_workload_captures;
2 10 11
第三部分 目标数据库
3.1 创建directory
上传到目标服务器(RAC各节点目录下数据都要传输)
scp -r /home/oracle/capdir/* 192.168.199.1:/home/oracle/replay/
创建directory
mkdir -p /home/oracle/replay
CREATE OR REPLACE DIRECTORY db_replay_capture_dir AS '/home/oracle/replay';
3.2 创建过滤器
创建方式:
exec DBMS_WORKLOAD_REPLAY.ADD_FILTER (fname IN VARCHAR2,fattribute IN
VARCHAR2,fvalue IN VARCHAR2);
fattribute可以使用如下:
• USER
• MODULE
• ACTION
• PROGRAM
• SERVICE
• CONNECTION_STRING
按用户创建
exec DBMS_WORKLOAD_REPLAY.ADD_FILTER ('replay_filter1','USER','TPCC');
创建了过滤器,该部分内容执行将被过滤掉,不执行。
3.3 加载capture日志
使用PROCESS_CAPTURE过程来准备capture logs。
exec DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE ('DB_REPLAY_CAPTURE_DIR');
执行完毕后,会生成wcr_process.wmd,wcr_login.pp, wcr_seq_data.extb, wcr_scn_order.extb , wcr_conn_data.extb等文件。
[oracle@oracle11g pp11.2.0.4.0]$ pwd
/home/oracle/replay/pp11.2.0.4.0
[oracle@oracle11g pp11.2.0.4.0]$ ls -l
total 1600
-rw-r--r--. 1 oracle oinstall 3522 Feb 25 13:14 wcr_calibrate.xml
-rw-r-----. 1 oracle oinstall 12288 Feb 25 13:14 wcr_commits.extb
-rw-r-----. 1 oracle oinstall 12288 Feb 25 13:14 wcr_conn_data.extb
-rw-r-----. 1 oracle oinstall 12288 Feb 25 13:14 wcr_data.extb
-rw-r-----. 1 oracle oinstall 757760 Feb 25 13:14 wcr_dep_graph.extb
-rw-r--r--. 1 oracle oinstall 290 Feb 25 13:14 wcr_login.pp
-rw-r--r--. 1 oracle oinstall 35 Feb 25 13:14 wcr_process.wmd
-rw-r-----. 1 oracle oinstall 12288 Feb 25 13:14 wcr_references.extb
-rw-r-----. 1 oracle oinstall 806912 Feb 25 13:14 wcr_scn_order.extb
-rw-r-----. 1 oracle oinstall 12288 Feb 25 13:14 wcr_seq_data.extb
3.4初始化replay
使用Initializing replay 装载metadata到tables里:
EXEC DBMS_WORKLOAD_REPLAY.initialize_replay (replay_name => 'replay', replay_dir => 'DB_REPLAY_CAPTURE_DIR');
将数据改成PREPARE REPLAY 模式:
exec DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY();
默认synchronization参数TRUE,按commit数据的顺序在数据库里重新执行一遍sql。
如果设置为False,不按commit顺序执行,跟实际会有数据分歧。
exec DBMS_WORKLOAD_REPLAY.prepare_replay (synchronization => FALSE);
检查replay的状态:
SQL> col name for a20
SQL> col status for a20
SQL> select name,status from dba_workload_replays;
NAME STATUS
--------------- ----------------------------------------
replay PREPARE
3.5启动重放客户端
评估客户端需求
wrc MODE=calibrate REPLAYDIR= =/home/oracle/replay
$ wrc system/oracle mode=replay replaydir=/home/oracle/replay
Workload Replay Client: Release 11.2.0.4.0 - Production on Tue Feb 25 13:29:23 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Wait for the replay to start (13:29:23)--等候replay执行
Replay client 1 started (13:30:46)
Replay client 1 finished (13:34:39--完成replay执行
执行之后,replay client 被暂停,并等待start replay 。
3.6执行replay
执行时间跟生产库获取的时间有关
SQL> exec DBMS_WORKLOAD_REPLAY.START_REPLAY;
PL/SQL procedure successfully completed.
SQL> select id, name, status from dba_workload_replays;
ID NAME STATUS
---------- --------------- ----------------------------------------
11 replay COMPLETED
初始状态:PREPARE
执行状态:IN PROGRESS
完成状态:COMPLETED
3.7手动停止replay
如果希望在完成replay 前stop replay过程,调用CANCEL_REPLAY 过程即可。
SQL> exec DBMS_WORKLOAD_REPLAY.CANCEL_REPLAY ();
3.8获取replay报告
先获取replay_id:
select id, name, status from dba_workload_replays;
获取replay报告:
SQL> set pagesize 0 long 30000000 longchunksize 2000
SQL> spool /home/oracle/replay_report.html
SQL> select dbms_workload_replay.report(replay_id => 11,format => 'HTML') from dual;
SQL> spool off
3.9导入capture awr数据
导入Capture AWR data 到目标数据库,可以与replay AWR data做比较,参见3.13.1生成awr比较报告
set serveroutput on
declare
capid number := 0;
BEGIN
capid := DBMS_WORKLOAD_CAPTURE.GET_CAPTURE_INFO(dir =>'DB_REPLAY_CAPTURE_DIR');
dbms_output.put_line('capid is ' || capid);
END;
/
capid is 2(capture ID)
上面获取的为capture ID,通过capture ID可以获取掉awr导入到目标库后的dbid,查询如下:
–查询出导入awr的dbid
SQL> select dbms_workload_capture.import_awr(capture_id => 2, staging_schema => 'SYSTEM') from dual;
892927038
–查询出导入awr的snap id
SQL> select snap_id,dbid,begin_interval_time,end_interval_time from dba_hist_snapshot where dbid=892927038;
3.10获取capture信息
SQL> select id, awr_begin_snap, awr_end_snap from dba_workload_captures;
2 10 11
3.11获取replay信息
SQL> select id, awr_begin_snap, awr_end_snap from dba_workload_replays;
11 149 150
3.12比较capture和replay
set serveroutput on
spool /home/oracle/compare_period_report.html
declare
v_rlt clob;
v_replay_id1 number:=2;
v_replay_id2 number:= null;
v_snum number:=1;
v_length number;
v_char varchar2(32767);
begin
dbms_workload_replay.compare_period_report(replay_id1=>v_replay_id1,
replay_id2=>v_replay_id2,format=>'HTML',result=>v_rlt);
v_length:=dbms_lob.GETLENGTH(v_rlt);
while ( v_snum < v_length ) loop
v_char:=dbms_lob.substr(lob_loc=>v_rlt,amount=>32767,offset=>v_snum);
v_snum:=v_snum+32767;
dbms_output.put_line(v_char);
end loop;
end;
/
spool off
3.12.1数据库信息比较

3.12.2变化信息

3.12.3Top Sql变化

3.12.4硬件信息比较

3.12.5运行时间对比信息





3.13 awr性能比较报告
3.13.1生成awr比较报告
通过当前实例的awr和导入capture awr数据,获取dbid和snap id,生成awr比较报告。
set pagesize 0 long 30000000 longchunksize 2000 heading off
spool /home/oracle/awrdiff.html
SELECT output FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_DIFF_REPORT_HTML(
dbid1 => 812624484,
inst_num1 => 1,
bid1 => 10,
eid1 => 11,
dbid2 => 1560552774,
inst_num2 => 1,
bid2 => 149,
eid2 => 150));
spool off
3.13.2主机配置比较

3.13.3数据库内存配置

3.13.4 Load Profile

3.13.5 Top事件

3.13.6 Time Model

3.13.7 Wait Classes

3.13.8 Sql比较





3.14测试完成,删除capture和replay
查询ID,并删除
SQL> select id, awr_begin_snap, awr_end_snap from dba_workload_replays;
ID AWR_BEGIN_SNAP AWR_END_SNAP
---------- -------------- ------------
2 144 145
11 149 150
SQL> exec DBMS_WORKLOAD_REPLAY.DELETE_REPLAY_INFO (1);
PL/SQL procedure successfully completed.
SQL> exec DBMS_WORKLOAD_REPLAY.DELETE_REPLAY_INFO (11);
PL/SQL procedure successfully completed.
第四部分 总结
步骤略多,希望对你有帮助





