暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

Oracle DB replay实践

原创 Digital Observer 2024-11-14
1202

第一部分 执行流程

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数据库信息比较

image.png

3.12.2变化信息

image.png

3.12.3Top Sql变化

image.png

3.12.4硬件信息比较

image.png

3.12.5运行时间对比信息

image.png
image.png
image.png
image.png
image.png

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主机配置比较

image.png

3.13.3数据库内存配置

image.png

3.13.4 Load Profile

image.png

3.13.5 Top事件

image.png

3.13.6 Time Model

image.png

3.13.7 Wait Classes

image.png

3.13.8 Sql比较

image.png
image.png
image.png
image.png
image.png

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.

第四部分 总结

步骤略多,希望对你有帮助
hhh6.jpg

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论