1.生产端:环境准备
为了进行SPA测试,在生产数据库中创建了SPA测试专用用户,避免与其他用户相互混淆与可能产生的误操作。

CREATE USER SPA IDENTIFIED BY SPA DEFAULT TABLESPACE SYSAUX;
GRANT DBA TO SPA;
GRANT ADVISOR TO SPA;
GRANT SELECT ANY DICTIONARY TO SPA;
GRANT ADMINISTER SQL TUNING SET TO SPA;

2.生产端:采集数据

具体采集步骤如下:
1). 获取AWR快照的边界ID

SET LINES 188 PAGES 1000
COL SNAP_TIME FOR A22
COL MIN_ID NEW_VALUE MINID
COL MAX_ID NEW_VALUE MAXID
SELECT MIN(SNAP_ID) MIN_ID, MAX(SNAP_ID) MAX_ID
FROM DBA_HIST_SNAPSHOT
WHERE END_INTERVAL_TIME > trunc(sysdate)-10
ORDER BY 1; MIN_ID MAX_ID
---------- ----------
178978 179488

2). 创建SQL Set

EXEC DBMS_SQLTUNE.DROP_SQLSET (SQLSET_NAME => 'SQLSET_D',SQLSET_OWNER => 'SPA');
EXEC DBMS_SQLTUNE.CREATE_SQLSET (SQLSET_NAME=> 'SQLSET_D',DESCRIPTION=> 'SQL Set Create at : '||TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),SQLSET_OWNER=> 'SPA');
select OWNER,OBJECT_NAME,OBJECT_ID,OBJECT_TYPE,CREATED,LAST_DDL_TIME from dba_objects where OWNER in ('SPA');

3). 抓取SQL
从AWR中提取

nohup sqlplus / as sysdba << EOF &
set SQLBL on
set lines 199
set pages 9999
set timing on
spool LOAD_SQLSET.log
DECLARE
SQLSET_CUR DBMS_SQLTUNE.SQLSET_CURSOR;
BEGIN
OPEN SQLSET_CUR FOR
SELECT VALUE(P) FROM TABLE(
DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY(178978,179488,
'PARSING_SCHEMA_NAME IN (''AAAA'',''BBBBB'')',
NULL, NULL, NULL, NULL, 1, NULL, 'ALL')) P;
DBMS_SQLTUNE.LOAD_SQLSET(
SQLSET_NAME => 'SQLSET_D',
SQLSET_OWNER => 'SPA',
POPULATE_CURSOR => SQLSET_CUR,
LOAD_OPTION => 'MERGE',
UPDATE_OPTION => 'ACCUMULATE');
CLOSE SQLSET_CUR;
END;
/
spool off
exit
EOF

4). 打包SQL Set

EXEC DBMS_SQLTUNE.CREATE_STGTAB_SQLSET ('SQLSET_D_AWR', 'SPA', 'SYSAUX');
nohup sqlplus / as sysdba << EOF &
set SQLBL on
set lines 199
set pages 9999
set timing on
spool PACK_STGTAB_SQLSET.log
EXEC DBMS_SQLTUNE.PACK_STGTAB_SQLSET (SQLSET_NAME=> 'SQLSET_D',SQLSET_OWNER=> 'SPA',STAGING_TABLE_NAME=> 'SQLSET_D_AWR',STAGING_SCHEMA_OWNER => 'SPA');
spool off
exit
EOF

3.生产端:导出数据
将采集到的数据打包后,需要将其中生产库导出,并传输到测试服务器中,用于在测试数据库中进行SPA测试工作。
1). 在操作系统中,导出打包后的SQL Set数据

chown oracle:oinstall dmp
vi expdp.sh
expdp \'/ as sysdba\' DIRECTORY=XTTS DUMPFILE=SPA.dmp TABLES=spa.SQLSET_D_AWR LOGFILE=spa.log nohup sh expdp.sh &

4.测试端:环境准备
为了进行SPA测试,在测试数据库中创建SPA测试专用用户,避免与其他用户相互混淆与可能产生的误操作。

CREATE USER SPA IDENTIFIED BY SPA DEFAULT TABLESPACE SYSAUX;
GRANT DBA TO SPA;
GRANT ADVISOR TO SPA;
GRANT SELECT ANY DICTIONARY TO SPA;
GRANT ADMINISTER SQL TUNING SET TO SPA;
sys/Oracle123@pdb vi impdp.sh
impdp \'sys/Oracle123@pdb as sysdba\' DIRECTORY=XTTS DUMPFILE=SPA.dmp LOGFILE=impspa.log nohup sh impdp.sh

5.spa分析

conn spa/SPA
EXEC DBMS_SQLTUNE.unpack_stgtab_sqlset(sqlset_name => 'SQLSET_D',replace => TRUE,staging_table_name => 'SQLSET_D_AWR',staging_schema_owner => 'SPA');
创建analysis_task DECLARE V_SPA_NAME VARCHAR2(100);
BEGIN
V_SPA_NAME:=dbms_sqlpa.create_analysis_task(sqlset_name => 'SQLSET_D',task_name => 'SQLSET_D_TASK');
dbms_output.put_line('spa_name='||v_spa_name);
end;
/ select OWNER ,OBJECT_NAME,OBJECT_TYPE,STATUS,CREATED,LAST_DDL_TIME from dba_objects where OBJECT_NAME='SQLSET_D_AWR'; DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(
task_name IN VARCHAR2,
parameter IN VARCHAR2,
value IN VARCHAR2,
test_execute_dop IN NUMBER DEFAULT 0,
compare_resultset IN BOOLEAN DEFAULT TRUE); exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SQLSET_D_TASK',parameter=>'TEST_EXECUTE_DOP' ,value=>4);

6.生成trc
生成11G 的trail

nohup sqlplus spa/SPA << EOF &
set SQLBL on
set lines 199
set pages 9999
set timing on
spool execute_analysis_task1.log
exec dbms_sqlpa.execute_analysis_task(task_name => 'SQLSET_D_TASK',execution_type => 'CONVERT SQLSET',execution_name => 'SPA_11G');
spool off
exit
EOF

生成19c 的trail

nohup sqlplus spa/SPA << EOF &
set SQLBL on
set lines 199
set pages 9999
set timing on
spool execute_analysis_task2.log
exec dbms_sqlpa.execute_analysis_task(task_name => 'SQLSET_D_TASK',execution_type => 'TEST EXECUTE',execution_name => 'SPA_19C');
spool off
exit
EOF

elapsed_time比较

nohup sqlplus spa/SPA << EOF &
set SQLBL on
set lines 199
set pages 9999
set timing on
spool execute_analysis_task3.log
exec dbms_sqlpa.execute_analysis_task(task_name => 'SQLSET_D_TASK',execution_type => 'COMPARE PERFORMANCE',execution_name => 'compare_elp_time',execution_params => dbms_advisor.argList('comparison_metric','elapsed_time'));
spool off
exit
EOF

buffer_gets 比较

nohup sqlplus spa/SPA << EOF &
set SQLBL on
set lines 199
set pages 9999
set timing on
spool execute_analysis_task4.log
exec dbms_sqlpa.execute_analysis_task(task_name => 'SQLSET_D_TASK',execution_type => 'COMPARE PERFORMANCE', execution_name => 'compare_buff_gets', execution_params => dbms_advisor.argList('comparison_metric','buffer_gets'));
spool off
exit
EOF

disk_reads 比较

begin
DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(
task_name => 'SQLSET_D_TASK',
execution_type => 'COMPARE PERFORMANCE',
execution_name => 'compare_disk_reads',
execution_params => dbms_advisor.arglist('comparison_metric', 'disk_reads') );
end;
/

7.生成比较报告

sqlplus SPA/SPA
set long 999999999 longchunksize 999999999 linesize 200 head off feedback off echo off spool all.html
select dbms_sqlpa.report_analysis_task('SQLSET_D_TASK','HTML','ALL','ALL') FROM DUAL;
spool off spool elapsed_time.html
SELECT dbms_sqlpa.report_analysis_task('SQLSET_D_TASK', 'HTML', 'ALL','ALL', execution_name=>'compare_elp_time') FROM dual;
spool off set long 999999999 longchunksize 999999999 linesize 200 head off feedback off echo off
spool buffer_gets.html
SELECT dbms_sqlpa.report_analysis_task('SQLSET_D_TASK', 'HTML', 'ALL','ALL', execution_name=>'compare_buff_gets') FROM dual;
spool off set long 999999999 longchunksize 999999999 linesize 200 head off feedback off echo off
spool disk_reads.html
SELECT dbms_sqlpa.report_analysis_task('SQLSET_D_TASK', 'HTML', 'ALL','ALL', execution_name=>'compare_disk_reads') FROM dual;
spool off set long 999999999 longchunksize 999999999 linesize 200 head off feedback off echo off
spool errors.html
SELECT dbms_sqlpa.report_analysis_task('SQLSET_D_TASK', 'HTML', 'errors','all') FROM dual;
spool off; spool unsupport.html
SELECT dbms_sqlpa.report_analysis_task('SQLSET_D_TASK', 'HTML', 'unsupported','all') FROM dual;
spool off;

总结:

1.SPA用户只需要dba权限应该就可以了。
2.采集数据可以通过如下方式获取:
   a) 转化AWR中SQL为SQL Tuning Set
   b) 转化Share Pool中SQL为SQL Tuning Set
   c) 采集Cursor中SQL为SQL Tuning Set
   d) 从现有SQL Tuning Set提取SQL

3.19C 可以通过DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER设置并行度,根据cpu的个数进行适当设置。如果并行设置很小,spa会跑很久。并行设置过大,   oracle有可能用不上,对主机负载也会有压力,一般设置为cpu个数的一半。

4.相关包:dbms_sqlpa
https://docs.oracle.com/database/121/ARPLS/d_sqlpa.htm#ARPLS68365

5.相关视图:

a)DBA_ADVISOR_TASKS --查看分析任务
b) DBA_SQLSET --查看set
c) DBA_ADVISOR_DEF_PARAMETERS --查看参数设置
d) DBA_ADVISOR_SQLSTATS --查看sql的执行情况
e) dba_sqlset_statements --查看sql的执行情况

6.在执行期间,awr数据会增长很快,注意SYSAUX表空间使用情况。关于改表空间的清理,见另一篇文章。
7.设置相关参数

a)关于目标端执行时间过长,可以使用设置超时参数
exec dbms_sqlpa.set_analysis_default_parameter('LOCAL_TIME_LIMIT',1800);
select parameter_value from dba_advisor_def_parameters where advisor_name='SQL Performance Analyzer' and parameter_name='LOCAL_TIME_LIMIT';
PARAMETER_VALUE
--------------------------------------------------------------------------------
1800

6)调整负载参数
exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SPA_19C_0614_TASK',parameter => 'workload_impact_threshold',value => 0);
exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SPA_19C_0614_TASK',parameter => 'sql_impact_threshold',value => 0);

8.关于并行,当并行开很大(cores),会导致实例重启。即使使用alter system set parallel_force_local=FALSE;让任务在多个节点执行,依旧会导致节点重启。开到特别大的时候,两个节点都会重启。

9.每一步的相关回退操作和相关mos
--exec DBMS_SQLTUNE.CANCEL_TUNING_TASK('SPA_19C_2021_0621_TASK');
--exec DBMS_SQLTUNE.DROP_TUNING_TASK('SPA_19C_2021_0621_TASK');
--exec dbms_sqltune.drop_sqlset('SPA_19C_2021_0621','XTTS');
--drop table XTTS.SPA2021_0621;

ORA-13757: Can't drop SQL Tuning Set (Doc ID 1276524.1)
datapatch failed with "ORA-13647: Setting of parameter ALTERNATE_PLAN_LIMIT is disallowed during task execution " (Doc ID 2710316.1)

Changing a Tuning Task Parameter While it is Running Gets "ORA-13647: Setting of parameter LOCAL_TIME_LIMIT is disallowed during task execution" (Doc ID 1597819.1)

10.官方文档参考:

PL/SQL Packages and Types Reference>dbms_sqlpa

11.spa分析
a)在捕获sql和重放的过程中,由于数据量的变化,会影响sql的性能判断,可以通过设置optimizer_features_enable参数,来进行手工对比。
b)spa分析error中,最常见的问题就是cursor_sharing 为FORCE,捕获的变量不全,导致sql变量缺失执行报错。
c)重点分析sql
strings sql.list | while read sql ; do
echo ${sql}_11g.html
echo "<h1>SQL: ${SQL} </h1>" > ${sql}.html
echo "<h2>Before: prod 11g, After: 19C DB, optimizer_features_enable=19.1.0 </h2>" >> ${sql}.html
grep -A 10000 -B 16 ": $sql" buffer_gets_19c.html | sed -n '1,/SQL Details/p' >> ${sql}.html
echo "<h2>Before: prod 11g, After: 19C DB, optimizer_features_enable=11.2.0.4 </h2>" >> ${sql}.html
grep -A 10000 -B 16 ": $sql" buffer_gets.html | sed -n '1,/SQL Details/p' >> ${sql}.html
done

select sql19.sql_id
,sql19.BUFFER_GETS/greatest(sql11.BUFFER_GETS,1) get_diff1
,sql19.BUFFER_GETS/greatest(org11.BUFFER_GETS,1) get_diff2
,sql11.BUFFER_GETS SQL11_Get,sql19.BUFFER_GETS SQL19_Get,org11.BUFFER_GETS org11_Get
,sql11.ELAPSED_TIME SQL11_els,sql19.ELAPSED_TIME SQL19_els,org11.ELAPSED_TIME SQL19_els
,sql11.PLAN_HASH_VALUE SQL11_phv,sql19.PLAN_HASH_VALUE SQL19_phv
from
DBA_ADVISOR_SQLSTATS sql19,DBA_ADVISOR_SQLSTATS sql11,
(select sql_id,sum(buffer_gets)/greatest(1,sum(executions)) buffer_gets,sum(ELAPSED_TIME)/greatest(1,sum(executions)) ELAPSED_TIME
from dba_sqlset_statements org11
where sqlset_name = 'SPA_19C_0614' group by sql_id) org11
where sql19.TASK_NAME = 'SPA_19C_0614_TASK' and sql11.TASK_NAME='SPA_19C_2021_0621_TASK'
and sql19.sql_id = sql11.sql_id and sql19.sql_id = org11.sql_id
and sql11.BUFFER_GETS is not null and sql19.BUFFER_GETS is not null
and sql19.BUFFER_GETS/greatest(sql11.BUFFER_GETS,1)>1.05
and sql19.BUFFER_GETS/greatest(org11.BUFFER_GETS,1)>1.05
and sql19.PLAN_HASH_VALUE!=sql11.PLAN_HASH_VALUE
order by get_diff1 desc;

12.抓取一个好的时段的spa,将会为分析工作带来便利。生产一般都是在线系统,测试数据如果能和生产保持一致是一种理想状态。所以,我们能做的就是在做spa的时候,让测试环境和生产的差异尽可能的小,即,测试迁移完成后,取迁移前的一段时间做。

SPA测试的更多相关文章

  1. 关于Oracle开启自动收集统计信息的SPA测试

    主题:关于Oracle开启自动收集统计信息的SPA测试 环境:Oracle RAC 11.2.0.4(Primary + Standby) 需求:生产Primary库由于历史原因关闭了自动统计信息的收 ...

  2. 记录一则完整的SPA(10g->11g)测试过程

    生产端:Windows 2008 + Oracle 10.2.0.5 测试端:RHEL 6.5 + Oracle 11.2.0.4 需求:因为Oracle跨越大版本,优化器.新特性变动较多,需要进行S ...

  3. SPA 介绍

    SQL 性能分析器(SPA)工具概览 作为 Oracle Real Application Testing 选件/特性,这篇文章将提供一个关于 SQL 性能分析器(SPA)工具的简要概览.这是此系列的 ...

  4. 18c新特性的一些小结(from JimmyHe)

    Oracle 18c在2018-02-16 release出来的,还是秉承着Oracle的cloud first理念,18c现在cloud和Engineered Systems上推出,想在传统的机器上 ...

  5. 11g SPA (sql Performance Analyze) 进行升级测试

    注;转自http://ju.outofmemory.cn/entry/77139 11G的新特性SPA(SQL Performance Analyze)现在被广泛的应用到升级和迁移的场景.当然还有一些 ...

  6. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  7. 使用backbone的history管理SPA应用的url

    本文介绍如何使用backbone的history模块实现SPA应用里面的URL管理.SPA应用的核心在于使用无刷新的方式更改url,从而引发页面内容的改变.从实现上来看,url的管理和页面内容的管理是 ...

  8. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  9. 使用 AngularJS 开发一个大规模的单页应用(SPA)

      本文的目标是基于单页面应用程序开发出拥有数百页的内容,包括认证,授权,会话状态等功能,可以支持上千个用户的企业级应用. 下载源代码 介绍 (SPA)这样一个名字里面蕴含着什么呢? 如果你是经典的S ...

随机推荐

  1. [SWMM]软件启动不了,出现 “ RPC服务器不可用 ” 错误

    [问题]打开SWMM5.1软件时,初选"RPC服务器不可用"的错误 [解决]计算机管理--服务 设置Print Spooler服务状态为启动,并设置为自启动.

  2. bootStrap模态框与select2合用时input不能获取焦点、模态框内部滑动,select选中跳转

    bootStrap模态框与select2合用时input不能获取焦点 在bootstrap的模态框里使用select2插件,会导致select2里的input输入框没有办法获得焦点,没有办法输入. 把 ...

  3. React 性能调优记录(下篇),如何写高性能的代码

    react性能非常重要,性能优化可以说是衡量一个react程序员水平的重要标准. 减少你的渲染 这个大家都明白,只要是父组件中用了子组件,子组件就算没用prop也会进行依次渲染, 可以用pureCom ...

  4. Springboot 日志、配置文件、接口数据如何脱敏?老鸟们都是这样玩的!

    一.前言 核心隐私数据无论对于企业还是用户来说尤其重要,因此要想办法杜绝各种隐私数据的泄漏.下面陈某带大家从以下三个方面讲解一下隐私数据如何脱敏,也是日常开发中需要注意的: 配置文件数据脱敏 接口返回 ...

  5. centos7 ftp 拒绝连接

    2021-09-03 1. 问题描述 刚才在重新搭建 ftp 服务器时,发现 ftp 拒绝连接,想起来我还没启动 vsftpd 服务,尝试启动却无法启动 vsftpd 服务 2. 解决方法 使用命令 ...

  6. Win10 安装WSL2与 Linux子系统

    Win10安装Linux子系统 1. 正常情况 步骤1 - 启用 Windows Linux版本子系统(Windows Subsystem for Linux) dism.exe /online /e ...

  7. Spring事物入门简介及AOP陷阱分析

    转载请注明出处: https://www.cnblogs.com/qnlcy/p/15237377.html 一.事务的定义 事务(Transaction),是指访问并可能更新数据库中各种数据项的一个 ...

  8. Django——实现最基础的评论功能(只有一级评论)

    我对评论功能的理解: --------(1)数据库建一个评论的表 --------(2)前端建一个提交评论的form表单 --------(3)表单提交评论内容后写入到数据库评论表中 -------- ...

  9. Python - 面向对象编程 - 实战(6)

    需求 设计一个培训机构管理系统,有总部.分校,有学员.老师.员工,实现具体如下需求: 有多个课程,课程要有定价 有多个班级,班级跟课程有关联 有多个学生,学生报名班级,交这个班级对应的课程的费用 有多 ...

  10. 排查dubbo接口重复注销问题,我发现了一个巧妙的设计

    背景 我在公司内负责自研的dubbo注册中心相关工作,群里经常接到业务方反馈dubbo接口注销报错.经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会 ...