oracle spa性能测试,9i升级到11g用SPA做性能测试
这是一个自己负责实施的项目,由于原来的版本是9i,比较老,而且是跨版本升级到11g,所以不能简单用sqlset迁移做性能测试,下面简单介绍下我的操作方法:
--在生产库中利用10046抓取SQL Trace,由于要抓的trace比较多,所以临时放在其他空间足够的目录里
alter system set user_dump_dest='/oradata_rman_bak/udump' scope=memory;
alter system set events '10046 trace name context forever , level 4';
alter system set events '10046 trace name context off';
alter system set user_dump_dest='/oracle/admin/c3prd/udump' scope=memory;
然后利用alter system获取10046 trace要格外小心,他会追踪开启10046这个时间点之后的所有会话,如果在这期间有rman备份,那会是灾难,数据库会有严重的性能问题,而且如果会话运行结束了,但是没有断开,这个会话会一直被追踪,所以我还是建议用脚本单独开启或停止用户会话的追踪,也可以避免一个系统的定期job,脚本可以参考如下,你也可以根据生产的实际情况进行调整:
CREATE OR REPLACE PROCEDURE
P_ENABLE_TRACE(I_ENABLE_RANGE NUMBER)
AS
BEGIN
IF
(I_ENABLE_RANGE = 0) THEN
FOR X IN
(SELECT SID, SERIAL# SERIAL
FROM V$SESSION
WHERE MACHINE NOT IN ('xhdb-server3','xhdb-server4')
AND USERNAME NOT IN ('SYS','SYSTEM','PERFSTAT')) LOOP
DBMS_SUPPORT.START_TRACE_IN_SESSION(X.SID, X.SERIAL, TRUE, FALSE);
END
LOOP;
ELSE
FOR X IN
(SELECT SID, SERIAL# SERIAL
FROM V$SESSION
WHERE MACHINE NOT IN ('xhdb-server3','xhdb-server4')
AND USERNAME NOT IN ('SYS','SYSTEM','PERFSTAT')
AND LOGON_TIME > SYSDATE-I_ENABLE_RANGE/1440) LOOP
DBMS_SUPPORT.START_TRACE_IN_SESSION(X.SID, X.SERIAL, TRUE, FALSE);
END
LOOP;
END IF;
END;
/
在生产库抓取的所有trace文件,都需要打包传输到测试服务器上,并在测试数据库中进行SQL重演。
--在生产库中创建Mapping表
CREATE TABLE MAPPING_TABLE AS
SELECT OBJECT_ID ID, OWNER, SUBSTR(OBJECT_NAME, 1, 30) NAME
FROM DBA_OBJECTS
WHERE OBJECT_TYPE NOT IN( 'CONSUMER GROUP', 'EVALUATION CONTEXT', 'FUNCTION', 'INDEXTYPE'
, 'JAVA CLASS', 'JAVA DATA', 'JAVA RESOURCE', 'LIBRARY', 'LOB'
, 'OPERATOR', 'PACKAGE', 'PACKAGE BODY', 'PROCEDURE', 'QUEUE'
, 'RESOURCE PLAN', 'SYNONYM', 'TRIGGER', 'TYPE', 'TYPE BODY')
UNION ALL
SELECT USER_ID id, USERNAME owner, NULL name
FROM DBA_USERS;
--导出生产库的Mapping表,并传到测试库
exp \'/ as sysdba\' prdmapping.dmp log=exp_mapping_table.log tables=MAPPING_TABLE
--将Mapping表导入到测试数据库中
imp \'/ as sysdba\' file=/oradata_rman_bak/udump/prdmapping.dmp log=imp_mapping_table.log full=y
从生产库传过来的trace文件,需要统一放在一个指定的目录中,然后需要在测试库中创建指向trace目录的数据库目录对象。
create directory DIR_TRACE as '/udump/udump';
需要在测试库中创建一个SQL Tuning Set,且将生产库抓取的trace文件信息导入到测试数据库中:
declare
mycur dbms_sqltune.sqlset_cursor;
begin
dbms_sqltune.create_sqlset('9i_prod_wkld_ora92');
open mycur for select value(p)
from table(dbms_sqltune.select_sql_trace(
directory => 'DIR_TRACE',
file_name => '%ora%',
mapping_table_name => 'MAPPING_TABLE',
select_mode => dbms_sqltune.SINGLE_EXECUTION)) p;
dbms_sqltune.load_sqlset( sqlset_name => '9i_prod_wkld_ora92',
populate_cursor => mycur,
commit_rows => 1000);
close mycur;
end;
/
需要在测试库创建一个SPA工作任务,用于进行本次的SQL性能比较。
variable sts_task VARCHAR2(64);
EXEC :sts_task := DBMS_SQLPA.CREATE_ANALYSIS_TASK( -
task_name => '9i_11g_spa_ora92', -
description => 'Upgrade from 9208 to 11203, SQL Testing', -
sqlset_name => '9i_prod_wkld_ora92');
创建SPA工作任务之后,需要从STS(SQL Tuning Set)中获取所有的SQL在原生产库9i中的执行信息:
exec dbms_sqlpa.execute_analysis_task( -
task_name => '9i_11g_spa_ora92', -
execution_name => '9i_trial_ora92', -
execution_type => 'CONVERT SQLSET', -
execution_desc => '9i sql trial generated from STS');
然后在原生产库抓取到的SQL,都需要在测试库中执行,并记录其执行信息。
exec dbms_sqlpa.execute_analysis_task( -
task_name => '9i_11g_spa_ora92',-
execution_name => '11g_trial_ora92_4',-
execution_type => 'TEST EXECUTE',-
execution_desc => 'remote test-execute trial on 11g db');
创建9i和11g的各自trail之后,可以对比两次执行的SQL统计信息。
exec dbms_sqlpa.execute_analysis_task( -
task_name => '9i_11g_spa_ora92', -
execution_name => 'compare_9i_112_elapsed_4', -
execution_type => 'COMPARE PERFORMANCE', -
execution_params => dbms_advisor.arglist( -
'COMPARISON_METRIC', 'ELAPSED_TIME', -
'EXECUTION_NAME1','9i_trial_ora92', -
'EXECUTION_NAME2','11g_trial_ora92_4'), -
execution_desc => 'Compare 9i elapsed time');
其中COMPARISON_METRIC参数可以有多个选择,比如有elapsed_time,CPU_TIME,BUFFER_GETS
做完SQL性能对比之后,可以从数据库中取出SQL性能变化报告。我们主要关注3中类型的SQL性能报告:
1、 所有SQL性能变化;
2、 所有不被SPA支持的SQL列表
3、 所有执行出现错误的SQL列表
对于这三种类型的报告,分别可以使用以下方式获取:
--设置环境
set lines 188 pages 9999 long 999999 trim on trims on
--获取所有SQL的性能变化情况
spool spa_ora92_elapsed_20130422.html
select xmltype(dbms_sqlpa.report_analysis_task( -
'9i_11g_spa_ora92', 'html', 'all', 'all', null, 100, -
'compare_9i_112_elapsed_4')).getclobval(0,0) from dual;
spool off
--获取不支持的SQL列表
spool spa_ora92_elapsed_unsupported_20130422.html
select xmltype(dbms_sqlpa.report_analysis_task( -
'9i_11g_spa_ora92', 'html', 'unsupported', 'all', null, 100, -
'compare_9i_112_elapsed_4')).getclobval(0,0) from dual;
spool off
--获取所有执行出错的SQL列表
spool spa_ora92_elapsed_errors_20130422.html
select xmltype(dbms_sqlpa.report_analysis_task( -
'9i_11g_spa_ora92', 'html', 'errors', 'all', null, 100, -
'compare_9i_112_elapsed_4')).getclobval(0,0)-
from dual;
spool off
最后打开html文件查看是否有性能下降的sql或其他错误信息,可以及时纠正,以免正式升级后出现问题。
oracle spa性能测试,9i升级到11g用SPA做性能测试相关推荐
- oracle9i升11g,[原创]总结9i升级11g遇到的问题
问题三 1.错误描述 9i升级到11g之后执行储存过程报错 ORA-29471: DBMS_SQL 访问被拒绝 ORA-06512: 在 "SYS.DBMS_SQL", line ...
- oracle 10G 升级到11G
Oracle从10g升级到11g详细步骤 数据库旧版本:10.2.0.4 数据库新版本:11.2.0.2 OS 版本: Solaris 10 参考文档:Complete Checklist for M ...
- Oracle 9i,10g/11g,12c中的i,g,c分别代表什么含义
Oracle 9i,10g/11g,12c中的i,g,c分别代表什么含义 i是internet的意思,表明当时是internet互联网盛行的年代. g是grid,网格运算.为了迎合分布式计算而推出的版 ...
- oracle 10g升级到11g
Linux 上Oracle RAC 10g 升级到 Oracle RAC 11g 了解如何在 Oracle Enterprise Linux 5 上逐步将 Oracle RAC 10g 第 2 版升级 ...
- oracle各版本手动升级任我行-升级矩阵
从今天开始,全面整理oracle低版本到高版本的手动升级方法,针对的平台是unix. 从低版本到高版本可能的升级组合如下(以下内容将持续更新): --------------------------- ...
- 手动升级oracle,oracle各版本手动升级任我行-升级矩阵
从今天开始,全面整理oracle低版本到高版本的手动升级方法,针对的平台是unix. 从低版本到高版本可能的升级组合如下(以下内容将持续更新): --------------------------- ...
- Analytic Functions in Oracle 8i and 9i
原文地址:http://balance9.bokee.com/5534690.html Analytic Functions in Oracle 8i and 9i Oracle 8i and 9i分 ...
- oracle 升级 32升级64 utlirp,Oracle 10G 32位升级64位
window2003 平台下 Oracle 10G 32位升级64位 最近遇到在同一机器将oracle10.2DB_win32数据库升级到oracle10.2DB_win64,查找了相关的资料经多次试 ...
- Oracle Enqueue Lock Type Reference including 11g new lock
Oracle Enqueue Lock Type Reference including 11g new lock 内部视图x$ksqst记录了以enqueue type分类的队列管理统计信息(Enq ...
最新文章
- PHP、jQuery、jQueryPager结合实现Ajax分页
- 【收藏】Kubernetes(十七) 基于NFS的动态存储申请
- html页面取js里面的值,如何在javascript中获取HTML元素的样式值?
- WinAPI: GetUserName - 获取当前用户名
- Angular父子组件通过服务传参
- PMC 任命Edward Sharp为首席战略及技术官
- 如何把滑动条变好看一点
- nb模块怎么访问php文件,一个非常NB的动态聊天程序_PHP教程
- 自动计数报警器c语言程序,自动计数报警器.ppt
- Eclipse如何优化(转)
- GitHub图片加载不出来解决方案(超详细图文教程)
- 网站模板制作有什么技巧呢?
- 固态和机械硬盘组raid_SSD+机械硬盘Raid 0成最佳搭配?_浦科特 PX-M5Pro_固态硬盘评测-中关村在线...
- 【深度学习】目标检测算法 YOLO 最耐心细致的讲解
- oracle fnd global,Oracle EBS R12 - 利用fnd_conc_global.set_req_globals设置子请求的Parent Request ID...
- xml在线格式化工具
- 解决C语言编译undefined reference to ‘pow’问题
- 微信小程序开发需要什么前提条件?
- Android解析XML的三种方式
- 客户端与服务器信息交互的流程,客户端与服务器的交互流程