这是一个自己负责实施的项目,由于原来的版本是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做性能测试相关推荐

  1. oracle9i升11g,[原创]总结9i升级11g遇到的问题

    问题三 1.错误描述 9i升级到11g之后执行储存过程报错 ORA-29471: DBMS_SQL 访问被拒绝 ORA-06512: 在 "SYS.DBMS_SQL", line ...

  2. oracle 10G 升级到11G

    Oracle从10g升级到11g详细步骤 数据库旧版本:10.2.0.4 数据库新版本:11.2.0.2 OS 版本: Solaris 10 参考文档:Complete Checklist for M ...

  3. Oracle 9i,10g/11g,12c中的i,g,c分别代表什么含义

    Oracle 9i,10g/11g,12c中的i,g,c分别代表什么含义 i是internet的意思,表明当时是internet互联网盛行的年代. g是grid,网格运算.为了迎合分布式计算而推出的版 ...

  4. oracle 10g升级到11g

    Linux 上Oracle RAC 10g 升级到 Oracle RAC 11g 了解如何在 Oracle Enterprise Linux 5 上逐步将 Oracle RAC 10g 第 2 版升级 ...

  5. oracle各版本手动升级任我行-升级矩阵

    从今天开始,全面整理oracle低版本到高版本的手动升级方法,针对的平台是unix. 从低版本到高版本可能的升级组合如下(以下内容将持续更新): --------------------------- ...

  6. 手动升级oracle,oracle各版本手动升级任我行-升级矩阵

    从今天开始,全面整理oracle低版本到高版本的手动升级方法,针对的平台是unix. 从低版本到高版本可能的升级组合如下(以下内容将持续更新): --------------------------- ...

  7. Analytic Functions in Oracle 8i and 9i

    原文地址:http://balance9.bokee.com/5534690.html Analytic Functions in Oracle 8i and 9i Oracle 8i and 9i分 ...

  8. oracle 升级 32升级64 utlirp,Oracle 10G 32位升级64位

    window2003 平台下 Oracle 10G 32位升级64位 最近遇到在同一机器将oracle10.2DB_win32数据库升级到oracle10.2DB_win64,查找了相关的资料经多次试 ...

  9. Oracle Enqueue Lock Type Reference including 11g new lock

    Oracle Enqueue Lock Type Reference including 11g new lock 内部视图x$ksqst记录了以enqueue type分类的队列管理统计信息(Enq ...

最新文章

  1. PHP、jQuery、jQueryPager结合实现Ajax分页
  2. 【收藏】Kubernetes(十七) 基于NFS的动态存储申请
  3. html页面取js里面的值,如何在javascript中获取HTML元素的样式值?
  4. WinAPI: GetUserName - 获取当前用户名
  5. Angular父子组件通过服务传参
  6. PMC 任命Edward Sharp为首席战略及技术官
  7. 如何把滑动条变好看一点
  8. nb模块怎么访问php文件,一个非常NB的动态聊天程序_PHP教程
  9. 自动计数报警器c语言程序,自动计数报警器.ppt
  10. Eclipse如何优化(转)
  11. GitHub图片加载不出来解决方案(超详细图文教程)
  12. 网站模板制作有什么技巧呢?
  13. 固态和机械硬盘组raid_SSD+机械硬盘Raid 0成最佳搭配?_浦科特 PX-M5Pro_固态硬盘评测-中关村在线...
  14. 【深度学习】目标检测算法 YOLO 最耐心细致的讲解
  15. oracle fnd global,Oracle EBS R12 - 利用fnd_conc_global.set_req_globals设置子请求的Parent Request ID...
  16. xml在线格式化工具
  17. 解决C语言编译undefined reference to ‘pow’问题
  18. 微信小程序开发需要什么前提条件?
  19. Android解析XML的三种方式
  20. 客户端与服务器信息交互的流程,客户端与服务器的交互流程

热门文章

  1. 模型理论5_建筑模型与沙盘制作课程教学总结
  2. 12.8 创建空白图片
  3. 脚本语言有哪些?各自有哪些优劣呢?
  4. 信息系统项目管理师——信息化和信息系统
  5. 公网ipv6远程桌面
  6. HDU 5454 Excited Database【线段树】
  7. 立创开源 51编程炫酷心形流水灯
  8. ADSL后台初始密码大全
  9. 中国的chatGpt-中国chatGPT软件
  10. 关于Linux报错解决方案:READ FPDMA QUEUED