背 景
某客户的现场oracle数据库迁移到国产数据库Goldendb,需要在Goldendb数据库进行性能测试,于是考虑使用RAT中的Database Replay,模拟现网的运行,来发现数据迁移、兼容性、性能等各种问题。
RAT介绍
Oracle Real Application Testing(简称RAT)是oracle的一个重要的feature,其推出的初衷是为了满足数据中心变更后,有很好的方法和工具去衡量这些变更对于生产环境的应用带来的影响,更好地评估诸如硬件升级、软件升级、架构变化等等对于客户应用程序的影响。
Real Application Testing其实有两个解决方法,分别是Database Replay和SPA(SQL Performance Analyzer)。以前有用过SPA就不做介绍了,本次主要介绍RAT的使用以及我在使用过程中遇到的问题。
Database Replay,数据库回放顾名思义可以理解为一个录像机,通过在源系统上把实时应用产生的负载录制下来,并拿到变更后的环境进行播放,从而进行一个对比。
数据库回放分为四个阶段完成:录制、预处理、回放、结果分析和报告。
RAT测试过程
3.1 确定wcr采集数据库信息
根据业务侧的需求对相应的数据库以及对应用户进行采集,以下为例子。
数据库名称:qazwsx
用户:1、2、3、4、5、6、7
3.2 wcr采集文件共享目录挂载
首先创建一个操作系统目录,用于存放WCR录制的文件,由于是RAC环境,因此要求是一个4节点共享的目标,例如我们这里用的是NFS目录挂接到4个节点上,以下操作命令需要使用root用户执行:
创建共享盘目录:
mkdir -p /wcr
挂载nfs共享盘,根据现场提供情况来执行:
mount -t nfs -o vers=3,timeo=600,nolock 10.x.x.x: /QDJZH-300G wcr
授权共享盘目录给oracle用户使用:
chow\n -R oracle:oinstall /wcr
3.3 创建RAT文件目录以及数据库目录
1)服务器创建目录操作
SQL> with t as (select substr(to_char(to_date('09:00','hh24:mi')+
(rownum-1)*1/24,'hh24mi'),1,2) i from dual connect by rownum<=24) select 'mkdir -p wcr/rat/rat'||i from t;
输出批量执行结果在服务器上面执行:
mkdir -p /wrc/rat/rat01
mkdir -p /wrc/rat/rat02
mkdir -p /wrc/rat/rat03
mkdir -p /wrc/rat/rat04
mkdir -p /wrc/rat/rat05
mkdir -p /wrc/rat/rat06
mkdir -p /wrc/rat/rat07
mkdir -p /wrc/rat/rat08
mkdir -p /wrc/rat/rat09
mkdir -p /wrc/rat/rat10
mkdir -p /wrc/rat/rat11
mkdir -p /wrc/rat/rat12
mkdir -p /wrc/rat/rat13
mkdir -p /wrc/rat/rat14
mkdir -p /wrc/rat/rat15
mkdir -p /wrc/rat/rat16
mkdir -p /wrc/rat/rat17
mkdir -p /wrc/rat/rat18
mkdir -p /wrc/rat/rat19
mkdir -p /wrc/rat/rat20
mkdir -p /wrc/rat/rat21
mkdir -p /wrc/rat/rat22
mkdir -p /wrc/rat/rat23
mkdir -p /wrc/rat/rat00
2)数据库创建目录以及赋权
SQL> with t as (select substr(to_char(to_date('09:00','hh24:mi')+
(rownum-1)*1/24,'hh24mi'),1,2) i from dual connect by rownum<=24) select 'create directory rat'||i||' as ''/wcr/rat/rat'||i||''';' directory from t union all select 'grant read,write on directory rat'||i||' to public;' from t;
输出结果:
create directory rat10 as'/wrc/rat/rat10';
createdirectory rat11 as'/wrc/rat/rat11';
createdirectory rat12 as'/wrc/rat/rat12';
createdirectory rat13 as'/wrc/rat/rat13';
createdirectory rat14 as'/wrc/rat/rat14';
createdirectory rat15 as'/wrc/rat/rat15';
createdirectory rat16 as'/wrc/rat/rat16';
createdirectory rat17 as'/wrc/rat/rat17';
createdirectory rat18 as'/wrc/rat/rat18';
createdirectory rat19 as'/wrc/rat/rat19';
createdirectory rat20 as'/wrc/rat/rat20';
createdirectory rat21 as'/wrc/rat/rat21';
createdirectory rat22 as'/wrc/rat/rat22';
createdirectory rat23 as'/wrc/rat/rat23';
createdirectory rat00 as'/wrc/rat/rat00';
createdirectory rat01 as'/wrc/rat/rat01';
createdirectory rat02 as'/wrc/rat/rat02';
createdirectory rat03 as'/wrc/rat/rat03';
createdirectory rat04 as'/wrc/rat/rat04';
createdirectory rat05 as'/wrc/rat/rat05';
createdirectory rat06 as'/wrc/rat/rat06';
createdirectory rat07 as'/wrc/rat/rat07';
createdirectory rat08 as'/wrc/rat/rat08';
createdirectory rat09 as'/wrc/rat/rat09';
grantread,write ondirectory rat10 topublic;
grantread,write ondirectory rat11 topublic;
grantread,write ondirectory rat12 topublic;
grantread,write ondirectory rat13 topublic;
grantread,write ondirectory rat14 topublic;
grantread,write ondirectory rat15 topublic;
grantread,write ondirectory rat16 topublic;
grantread,write ondirectory rat17 topublic;
grantread,write ondirectory rat18 topublic;
grantread,write ondirectory rat19 topublic;
grantread,write ondirectory rat20 topublic;
grantread,write ondirectory rat21 topublic;
grantread,write ondirectory rat22 topublic;
grantread,write ondirectory rat23 topublic;
grantread,write ondirectory rat00 topublic;
grantread,write ondirectory rat01 topublic;
grantread,write ondirectory rat02 topublic;
grantread,write ondirectory rat03 topublic;
grantread,write ondirectory rat04 topublic;
grantread,write ondirectory rat05 topublic;
grantread,write ondirectory rat06 topublic;
grantread,write ondirectory rat07 topublic;
grantread,write ondirectory rat08 topublic;
grantread,write ondirectory rat09 topublic;
3.4 创建自动采集脚本
[oracle@19c wcr]$ v\i wcr.sh
#!/bin/sh
if [[ -f ~/.profile ]]
then
. ~/.profile
fi
if [[ -f ~/.bash_profile ]]
then
. ~/.bash_profile
fi
STTIME=`date "+%Y-%m-%d %H:%M:%S"`
echo'current time is :' $STTIME
sqlplus -s as sysdba <<EOF >>/wrc/rat/rat.log
alter session set container=qazwsx;
set echo on
set serveroutput on
exec dbms_workload_capture.finish_capture;
exec dbms_workload_capture.add_filter(fname =>'FILTER_1',fattribute => 'USER',fvalue => '1');
exec dbms_workload_capture.add_filter(fname =>'FILTER_2',fattribute => 'USER',fvalue => '2');
exec dbms_workload_capture.add_filter(fname =>'FILTER_3',fattribute => 'USER',fvalue => '3');
exec dbms_workload_capture.add_filter(fname =>'FILTER_4',fattribute => 'USER',fvalue => '4');
exec dbms_workload_capture.add_filter(fname =>'FILTER_5',fattribute => 'USER',fvalue => '5');
exec dbms_workload_capture.add_filter(fname =>'FILTER_6',fattribute => 'USER',fvalue => '6');
exec dbms_workload_capture.add_filter(fname =>'FILTER_7',fattribute => 'USER',fvalue => '7');
DECLARE
n varchar2(10);
BEGIN
select substr(TO_CHAR(SYSDATE, 'HH24:MI:SS'),1,2) into n from dual;
dbms_output.put_line(n);
dbms_workload_capture.start_capture(name => 'GB_YYMMDD_'||n, dir => 'RAT'||n, default_action=>'EXCLUDE', duration => 3600);
END;
/
EOF
脚本参数说明:
fname是本次捕捉任务的名称;
fattribute是固定USER;
fvalue是本次捕捉用户名
duration是捕捉时间,上面设置了3600,也就是捕捉1小时,该参数可以设置为NULL,就是无时间限制地录制,直到发起停止命令。
3.5 添加定时
本次任务计划每小时执行一次,抓取整整一天的报告。
[oracle@19c wcr]$ crontab -l
00-23 * * * sh wcr/wcr.sh >> /wcr/wcr..log
3.6 数据库查看采集状态
SQL>set pagesize 300
set linesize 200
col NAME for a20
col dir_Path for a30
col status for a30
select id,name,status,start_time,end_time,connects,user_calls,dir_path,(sysdate-START_TIME)*3600*24fromdba_workload_captures;
3.7 手动停止采集信息
SQL>exec dbms_workload_capture.finish_capture;

本文作者:张 聪(上海新炬中北团队)
本文来源:“IT那活儿”公众号





