【RAT】Oracle Real Application Testing(真用应用测试)介绍

本文主要介绍 Oracle Real Application Testing,未实战 —By Firsouler 2021.4.23

1.介绍

Oracle Real Application Testing选项能够执行Oracle数据库的真实测试。通过捕获生产工作负载并在生产部署之前评估系统更改对这些工作负载的影响,Oracle Real Application Testing将与系统更改相关的不稳定风险降至最低。SQL性能分析器和数据库重放是Oracle Real Application Testing的关键组件。根据要测试的系统更改的性质和影响,以及要执行测试的系统类型,可以使用其中一个或两个组件来执行测试。

Oracle RAT 主要有两个功能,SQL Performance Analyzer(SPA) 和 Database Replay(DB Replay)。 具体如下:

2.SPA

可以使用SPA来分析任何类型的系统更改对SQL性能的影响,包括:

  • 数据库更新升级
  • 操作系统或硬件相关配置改变
  • 用户改变
  • 数据库初始化参数改变
  • 刷新优化器统计信息
  • SQL优化操作

如下图所示,SPA主要工作是:

  • 测试SQL查询性能方面改变的结果
  • 在生产环境中捕获包括统计信息与绑定变量的SQL负载
  • 在测试环境中重新执行SQL查询

spa_process

SPA具体过程如下

--sql 样例
myworkload.sql 
connect sh/sh 
SELECT /*+ my_query */ p.prod_name, s.time_id, t.week_ending_day, SUM(s.amount_sold) 
FROM sales s, products p, times t 
WHERE s.time_id=t.time_id 
AND s.prod_id = p.prod_id 
GROUP BY p.prod_name, s.time_id, t.week_ending_day; 
SELECT /*+ my_query */ p.prod_name, s.time_id, t.week_ending_day, 
SUM(s.amount_sold) 
FROM sales s, products p, times t 
WHERE s.time_id=t.time_id 
AND s.prod_id = p.prod_id 
GROUP BY p.prod_name, s.time_id, t.week_ending_day; 
SELECT /*+ my_query */ p.prod_category, t.week_ending_day, s.cust_id, SUM(s.amount_sold) 
FROM sales s, products p, times t 
WHERE s.time_id = t.time_id 
AND s.prod_id = p.prod_id 
AND p.prod_category = 'Photo' 
GROUP BY p.prod_category, t.week_ending_day, s.cust_id; 
SELECT /*+ my_query */ p.prod_subcategory_desc, t.week_ending_day, SUM(s.amount_sold) 
FROM sales s, products p, times t 
WHERE s.time_id = t.time_id 
AND s.prod_id = p.prod_id 
AND p.prod_subcategory_desc LIKE '%Audio' 
GROUP BY p.prod_subcategory_desc, t.week_ending_day;

从生产环境中捕获SQL工作量负载

  • SQL调优集(STS)用于存储SQL工作负载
  • STS包括: SQL文本、绑定变量、执行计划、执行统计
  • 对于一个时间段内的游标缓存进行增量捕获并放置于STS
  • SQL调优集过滤与排除不需要的SQL
  • 可传输的STS用来将工作量负载移至测试系统

参考命令

1) Create the Sql Tuning Set (STS).

--create_sts.sql 
-- create my sql tuning set and populate it from the cursor cache 
var sts_name varchar2(30); 
exec :sts_name := 'small_sh_sts_4'; 
exec dbms_sqltune.drop_sqlset(:sts_name); 
exec dbms_sqltune.create_sqlset(:sts_name, 'small demo workload to test SQLPA'); 
DECLARE 
stscur dbms_sqltune.sqlset_cursor; 
BEGIN 
OPEN stscur FOR 
SELECT VALUE(P) 
FROM TABLE(dbms_sqltune.select_cursor_cache( 
'sql_text like ''SELECT /*+ my_query%''', 
null, null, null, null, null, null, 'ALL')) P; 
-- populate the sqlset 
dbms_sqltune.load_sqlset(:sts_name, stscur); 
end; 
/
-- check content of sts 
select sql_id, plan_hash_value, buffer_gets, elapsed_time, substr(sql_text,1, 30 
) text, executions 
from dba_sqlset_statements 
where sqlset_name = :sts_name 
order by sql_id, plan_hash_value;

2) Create a task to run Sql Performance Analyzer

--create_sqlpa_task.sql 
---create sql task 
-- declare vars 
var tname varchar2(30); 
var sname varchar2(30); 
-- init vars 
exec :sname := 'small_sh_sts_4'; 
exec :tname := 'my_sqlpa_demo_task'; 
-- 1. create a task with a purpose of change impact analysis 
------------------------------------------------------------ 
exec :tname := dbms_sqlpa.create_analysis_task(sqlset_name => :sname, - 
task_name => :tname); 
-- 2. check task status 
--------------------------- 
SELECT task_name, status 
FROM user_advisor_tasks 
WHERE task_name = :tname;

产生变化前执行SQL

  • 建立SQL工作负载性能基线
  • 捕获SQL执行计划与统计信息
  • 连续执行SQL(非并发)
  • 每个SQL只执行一次
  • 忽略DDL语句
  • 可选择只做执行计划解析选项
--beforechange.sql 
--Now I am ready to run the Before Change Execute 
begin 
DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( 
task_name => 'my_sqlpa_demo_task', 
execution_type => 'TEST EXECUTE', 
execution_name => 'BEFORECHANGE'); 
end; 
/
--Using a Database link
begin
DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(
task_name => 'my_sqlpa_demo_task',
execution_type => 'TEST EXECUTE',
execution_name => 'BEFORECHANGE',
execution_params => dbms_advisor.arglist('DATABASE_LINK', '&dblink_name'));
end;
/
--We can check the status of this task.
select execution_name,status, execution_end 
from DBA_ADVISOR_EXECUTIONS where task_name='my_sqlpa_demo_task';

产生变化后执行SQL

  • 手工实施计划的改变,如数据库升级/打补丁、优化统计刷新、Schema变化、数据库参数变化、调优活动
  • 变化后重新执行SQL,如收集新的SQL执行计划与统计信息
-- afterchange.sql
begin 
DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( 
task_name => 'my_sqlpa_demo_task', 
execution_type => 'TEST EXECUTE', 
execution_name => 'AFTERCHANGE'); 
end; 
/

对比分析性能

  • 使用不同指标对比性能,如使用时间、CPU时间、优化器成本等
  • SPA包含会显示每一个SQL的变化影响,如优化SQL、回退SQL、非变化SQL、带错误SQL
  • 使用SQL优化向导与SQL计划基线来修改回退的SQL
--compare_runs.sql 
begin 
DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( 
task_name => 'my_sqlpa_demo_task', 
execution_type => 'COMPARE PERFORMANCE', 
execution_name => 'DEMOTASK', 
execution_params => dbms_advisor.arglist( 
'comparison_metric', 
'buffer_gets')); 
end; 
/
--report.sql
set long 100000 longchunksize 100000 linesize 200 head off feedback off echo off 
spool report.html 
SELECT dbms_sqlpa.report_analysis_task('my_sqlpa_demo_task', 'HTML', 'ALL','ALL') FROM dual; 
spool off
SPA报告
SPA价值
  • 在最终用户受到影响之前可以识别SQL性能的衰减
  • SPA可以对发生任何改变的SQL执行计划锁引起的影响进行帮助
  • 可对成百上千的sql声明自动进行跟踪
  • 可以低系统影响下捕获SQL工作量负载
  • 与修正衰减的SQL调优向导和SQL计划基线进行集成

3.DB Replay

db_replay

如上图所示,数据库重放,主要目的

  • 使用真实的生产环境工作负载来测试数据库负载和性能
  • 定位应用程序的可扩展性和并发性问题
  • 在上线前修改问题以降低迁移的风险
  • 11g以上版本可以做Replay

生产系统要 10.2.0.4 以上, 测试系统 11.1以上

工作负载捕获

  • 将所有外部客户端的请求捕获至二进制文件
  • 排除系统后台与内部的活动
  • 捕获时的最小性能影响
  • 支持RAC,共享与本地文件系统
  • 可以按感兴趣的时间段执行捕获,如峰值、月末处理期等。

开销 一般在2.5-7%之间

--创建负载文件存放目录
mkdir -p /home/oracle/capture
create or replace directory cap as '/home/oracle/capture';
--开始负载捕获
exec dbms_workload_repository.create_snapshot();
exec dbms_wrokload_capture.start_capture(name=>'pdbrat_cap',dir=>'CAP');
--运行swingbench,模拟产生负载
--结束负载
exec dbms_workload_capture.finish_capture();
exec dbms_workload_repository.create_snapshot();

处理负载文件

  • 在测试数据库服务器上,将捕获的负载处理成可以重放的格式
  • 只需要处理一次,可以多次重放
  • 对于RAC数据库,捕获文件需要放到同一位置进行处理
  • 推荐采用共享文件系统
--目标库
mkdir -p /home/oracle/replay
--确保目标库中数据对象与源库一样
create pluggable database pdbreplay from pdbrat file_name_convert=('pdbrat','pdbreplay');
--open,创建相关目录
create or replace directory replay as '/tmp/replay';
grant read,write on directory replay to public;
--执行预处理
exec dbms_workload_replay.process_capture('REPLAY');
--评估 需要多少客户端等
wrc mode=calibrate replaydir=/home/oracle/replay

工作负载重放

  • 工作负载重放保留捕获系统的时间段,并发与依赖关系
  • 重放设备是一个消费进程负载和想重放系统发送请求的指定客户端程序
  • 重放设备由一个或多个客户端组成,为了事项高并发性工作流,可能需要启动多个客户端去推动工作负载
--初始化
exec dbms_workload_replay.initialize_replay(replay_name=>'repjob',replay_dir=>'REPLAY');
--映射连接
select conn_id,capture_conn,replay_conn from dba_workload_connection_map where replay_id=1;
--修改为测试库连接
select 'exec dbms_workload_replay.remap_connect('||conn_id||'. ''(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.80.99)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME= PDBREPLAY)))'');' from dba_workload_connection_map where replay_id=1;
--重放配置,同步重发
exec dbms_workload_replay.prepare_replay(synchronization=TURE,connect_time_scale=>100,think_time_scale=>100,think_time_auto_correct=> FALSE);
--开启重放客户端
wrc admin/oracle@pdbreplay replaydir=/home/oracle/replay
--启动重放
exec dbms_workload_repository.create_snapshot();
exec dbms_workload_replay.start_replay;
exec dbms_workload_repository.create_snapshot();
--生成报告,html格式或者text格式
select max(id) from dba_workload_replays where status='COMPLETED';
set pages 0 long 999999
spool /home/oracle/replay_report.html
select dbms_workload_replay.report(1,'HTML') from dual;

重放分析和报告

重放过程进度可监控, 提供了全面的报告以供分析,三种报告

  • 数据差异:对比每个调用返回的行数并报告差异
  • 错误差异: 对每个调用,都会报告错误差异(新错误:重发出现的、未找到:捕获出现重发为出现、变异:不同的错误)
  • 性能差异:提供性能信息,awr/ash等

两种方式的选择

spa_dbreplay

参考:

请使用浏览器的分享功能分享到微信等