执行流程
Replay 流程
Database Replay 实施的流程是workload_capture->workload preprocess->replay client prepare->replay->generate replay report,对于同一个capture可以进行多次replay
执行数据库
生产数据库:用于workload_capture,即负载捕获
迁移数据库:用于workload_ preprocess和replay,即负载预处理和负载重放
Replay client :用于发起workload的客户端进程
生产数据库
创建capture目录
需要确保目录下无任何文件
mkdir -p /home/oracle/capdir
create or replace directory capdir as '/home/oracle/capdir';
查询是否有原来的capture任务
SQL> SELECT id, name FROM dba_workload_captures;
根据id 用以下进行删除:
SQL> exec dbms_workload_capture.delete_capture_info(2);
创建过滤器
过滤器可以通过START_CAPTURE 过程的DEFAULT_ACTION 参数,参数值 INCLUDE 排除(默认) 或者 EXCLUDE 包含 过滤器。
创建 HEAGLEDB 用户执行信息的过滤器:
EXEC DBMS_WORKLOAD_CAPTURE.ADD_FILTER ('filter_user1','USER','HEAGLEDB');
过滤器其他方式:
capture 所有的信息,可以跳过add_filter设置
查询过滤器
select * from dba_workload_filters;
运行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);
|
常用全库捕获: BEGIN DBMS_WORKLOAD_CAPTURE.start_capture (name => 'pri_capture_1', dir =>'CAPDIR', duration => NULL); END; / |
如果上面使用过滤器,可以使用以下语法。 注意:exclude 意思是包含上面过滤器中的任务 :
BEGIN
DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
name => 'pri_capture_1',
dir => 'CAPDIR',
default_action => ' EXCLUDE ',
duration => NULL);
END;
/
Sql 执行
生产数据库运行阶段。
停止 capture
|
BEGIN DBMS_WORKLOAD_CAPTURE.finish_capture; END; / |
获取capture ID
|
SELECT DBMS_WORKLOAD_CAPTURE.get_capture_info('CAPDIR') FROM dual; select id, name, status,dir_path from dba_workload_captures;
|
查询捕获信息
可以在捕获路径下获取已生成的报告wcr_cr.html、wcr_cr.text。
|
set pagesize 0 long 30000000 longchunksize 2000 line 150 spool pri_capture.html select dbms_workload_capture.report ( 11 ,'HTML') from dual; spool off 注:11 为的capture id。
|
导出awr报告
exec dbms_workload_capture.export_awr (capture_id => 11);
注:11 为的capture id。
查询dba_workload_captures
|
select id,AWR_BEGIN_SNAP,AWR_END_SNAP from dba_workload_captures; |
迁移数据库
创建directory
cap and capfiles 上传到目标服务器
创建directory
mkdir -p /oracle/replay
CREATE OR REPLACE DIRECTORY db_replay_capture_dir AS '/oracle/replay';
节点1
scp -r /oracle/replay/* oracle@168.68.19.138:/oracle/replay/
加载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等文件。
初始化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。
检查replay的状态:
|
set lin 160 col name for a20 col status for a20 select name,status from dba_workload_replays; |
启动重放客户端
评估客户端需求
wrc MODE=calibrate REPLAYDIR=/oracle/replay
前台执行replay:
wrc system/mhqx1190 mode=replay replaydir=/oracle/replay
可以后台执行 (可选)
nohup wrc system/mhqx1190 mode=replay replaydir=/oracle/replay &
执行replay
执行时间跟生产库获取的时间有关
|
exec DBMS_WORKLOAD_REPLAY.START_REPLAY; select id, name, status from dba_workload_replays; |
初始状态:PREPARE
执行状态:IN PROGRESS
完成状态:COMPLETED
停止replay
如果希望在完成replay 前stop replay过程,调用CANCEL_REPLAY 过程即可。
exec DBMS_WORKLOAD_REPLAY.CANCEL_REPLAY ();
获取replay报告
select id, name, status from dba_workload_replays;
set pagesize 0 long 30000000 longchunksize 2000 line 150
spool /home/oracle/replay_report.html
select dbms_workload_replay.report(replay_id => 46 ,format => 'HTML') from dual;
spool off
注:46为上面的replay id。
导入capture awr数据
导入Capture AWR data 到测试数据库,比较replay AWR data
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; /
输出: 1
select dbms_workload_capture.import_awr(capture_id => 1, staging_schema => 'SYSTEM') from dual;
输出:1959014922
SQL> select snap_id,dbid from dba_hist_snapshot where dbid= 1959014922 ;
SNAP_ID DBID
---------- ----------
3212 1959014922
3213 1959014922
获取capture信息
SQL> select id, awr_begin_snap, awr_end_snap from dba_workload_captures;
1 3212 3213
获取replay信息
SQL> select id, awr_begin_snap, awr_end_snap from dba_workload_replays;
3 6414 6415
比较capture和replay
|
set serveroutput on spool /home/ora19c/compare_period_report.html declare v_rlt clob; v_replay_id1 number := 46; 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; / |
awr 性能比较报告
生成awr比较报告
set pagesize 0 long 30000000 longchunksize 2000 heading off line 1000
spool / home / oracle / replay / awrdiff_10g_11g.html
SELECT output
FROM TABLE ( DBMS_WORKLOAD_REPOSITORY.AWR_DIFF_REPORT_HTML ( dbid1 => 1959014922 ,
inst_num1 => 1 ,
bid1 => 3212 ,
eid1 => 3213 ,
dbid2 => 2791053097 ,
inst_num2 => 1 ,
bid2 => 6414 ,
eid2 => 6415 ));
spool off
测试完成,删除capture和replay
SQL> SELECT id, name FROM dba_workload_captures;
SQL> exec dbms_workload_capture.delete_capture_info(2);
SQL> select id, awr_begin_snap, awr_end_snap from dba_workload_replays;
SQL> exec DBMS_WORKLOAD_REPLAY.DELETE_REPLAY_INFO (1);
