知识大全 oraclestatspack详解

Posted

篇首语:赚钱之道很多,但是找不到赚钱的种子,便成不了事业家。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 oraclestatspack详解相关的知识,希望对你有一定的参考价值。

  oracle Statspack从Oracle 被引入 马上成为DBA和Oracle专家用来诊断数据库性能的强有力工具 通过Statspack我们可以很容易的确定Oracle数据库的瓶颈所有 记录数据库性能状态 也可以使远程技术人员迅速了解的的数据库运行状况 所以 了解和使用Statspack对于DBA来说至关重要

  在Statspack发布之前 我们经常用来诊断数据库的工具是两个脚本utlbstat sql和utlestat sql BSTAT/ESTAT是一个非常简单的性能诊断工具 UTLBSTAT获得开始时很多V$视图的快照 UTLESTST通过先前的快照和当前视图生成一个报表 实际上此报表相当于statspack的两个采样点

  Statspack通过连续的采样 能够给我们提供很重要的趋势分析数据 这是一个巨大的进步

  所以 能够使用Statspack的环境 就尽量不使用BSTAT/ESTAT方式来诊断数据库问题

  (Oracle 以前的版本使用Statspack 需要使用statscbps sql脚本建立一个V$buffer_pool_statistics视图 可以到oracle网站上下载 )

  原理

   运行oracle自带脚本 生成一系列的统计表

   生成快照 采样(运行statspack snap可生成快照 一般通过自动任务生成快照)

   根据快照生成报告

  一 准备

   检查部分参数值

   job_queue_process 为了能够建立自动任务 执行数据收集 此参数必须大于

  alter system set job_queue_processess= ;

  timed_statistics 设置为true 使收集的时间信息存储在V$sessstats和V$sysstats等动态性能视图中 但会消耗资源 可以在使用Satspack之前设为true 采样过后 把该参数动态修改为false

  alter system set timed_statistics=true;

   脚本

  使用此功能 需要运行oracle自带脚本 在数据库中生成一系列的表和视图 用于收集各种信息

  脚本位于%oracle_home%\\rdbms\\admin目录下 oracle 下是一组以stat开头的文件 以后的版本是一组以sp开头的文件

  二 安装

   以sysdba身份登录

   i可以用internal用户登录 sqlplus internal

   i及以后版本 可以用sys用户以sysdba身份登录 sqlplus / as sysdba

  (最好转到脚本所有目录%oracle_home%\\rdbms\\admin 便于执行脚本)

   创建表空间 用于保存采样数据

  create tablespace perfstat datafile e:\\hs \\dat\\perstat ora

  size m

  extent management local;

  Statspack的报表数据还是相当占空间的 特别是在多次连续采样的情况下 所以不能太小 最小 M 否则创建对象会失败

   运行脚本 安装statspack

  Oracle %oracle_home%\\rdbms\\admin\\statscre sql

   以后 %oracle_home%\\rdbms\\admin\\spcreate sql

   脚本会创建用户perfstat 需要指定此用户密码

  输入 perfstat_password 的值:  perfstat

   需要输入用户perfstat使用的表空间 指定新建的表空间即可

  输入 default_tablespace 的值:   perfstat

   需要指定用户perfstat使用的临时表空间

  输入 temporary_tablespace 的值:  tmp

   安装成功 可以看到如下信息

  Creating Package STATSPACK

  程序包已创建

  没有错误

  Creating Package Body STATSPACK

  程序包体已创建

  没有错误

  NOTE:

  SPCPKG plete Please check spcpkg lis for any errors

   查看错误信息

  NT下

  host find ORA * LIS

  host find err * LIS

  Unix下

  grep ORA * lis

  grep err * lis

  如果出现错误 可以运行脚本删除相关内容 @%oracle_home%\\rdbms\\admin\\spdrop sql

  (注意 也要在sysdba下运行脚本删除相关对象)

  然后再重新运行脚本安装

  这个安装过程创建了一系列的表 用于存入采样数据

  查看新建表

  select dt table_name from dba_tables dt where dt owner= PERFSTAT

  conn perfstat/perfstat

  select table_name from user_tables;

  三 测试statspack

  用perfstat用户连接

  (如果你刚执行完@spcreate 则oracle默认将当前用户切换为perfstat )

  运行statspack snap可以产生系统快照 运行两次 产生两次快照

  SQL> execute statspack snap;

  PL/SQL 过程已成功完成

  SQL> execute statspack snap;

  PL/SQL 过程已成功完成

  然后执行脚本%oracle_home%\\rdbms\\admin\\spreport sql就可以生成基于两个时间点的报告

   需要输入起始快照ID和结束快照ID 以及报告文件名

  Specify the Begin and End Snapshot Ids

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  输入 begin_snap 的值: 

  Begin Snapshot Id specified:

  输入 end_snap 的值: 

  End   Snapshot Id specified:

  输入 report_name 的值:  e:\\s report txt

  如果一切正常 说明安装成功

   查看产生的快照

  select t snap_id to_char(t snap_time yyyy mm dd hh:mi:ss ) as S_Time t snapshot_exec_time_s from STATS$SNAPSHOT t;

  四 规划自动任务

  安装之后 我们就可以设置定时任务 定时采样 收集数据

   使用系统脚本

  使用脚本spauto sql来定义自动任务

  spauto sql在关键内容

  begin

  select instance_number into :instno from v$instance;

  dbms_job submit(:jobno statspack snap; trunc(sysdate+ / HH ) trunc(SYSDATE+ / HH ) TRUE :instno);

  mit;

  end;

  执行spquto 就建立了一个每小时执行一次的数据收集计划

  这个Job任务定义了收集数据(执行statspack snap)的时间间隔为 小时

  一天 小时 分钟 >

   / HH 每小时一次

   / MI 每半小时一次

   / MI 每 分钟一次

   / MI 每 分钟一次

  关于采样间隔 通常建议 小时 如有特殊需要 可以设置更短 如半小时 但不推荐更短 因为statpack的执行本身需要消息资源 太短的采样对系统的性能会产生较大的影响(甚至会使statspack的执行出现在采样数据中)

   使用自定义语句

   )可以用以下语句创建一个job 我们设定其每个小时自动收集一次采样

  Variable  job  number ;

  begin

  dbms_job submit(:job statspack snap; trunc( sysdate + / hh ) trunc(sysdate+ / hh ) );

  mit ;

  end ;

  /

  查看当前job

  set linesize

  col schema_user for a

  col what for a

  col interval for a

  col next_d for a

  SQL> select job schema_user to_char(next_date yyyymmdd hhmiss ) as next_D interval what from user_jobs;

  JOB SCHEMA_USER  NEXT_D             INTERVAL        WHAT

  

   PERFSTAT         trunc(sysdate+ statspack snap;

  / hh )

   )再创建一个job 让它在第二天凌晨自动停止采样job的执行

  查出job编号 执行以下语句

  Variable  job  number ;

  begin

  dbms_job submit(:job dbms_job broken( true); trunc( sysdate + ) null );

  mit ;

  end ;

  /

   查看任务

  set linesize

  col schema_user for a

  col what for a

  col interval for a

  col next_d for a

  select job next_date next_sec what from user_jobs;

  select job schema_user to_char(next_date yyyymmdd hhmiss ) as next_D interval what from user_jobs;

   查看产生的快照

  select t snap_id to_char(t snap_time yyyy mm dd hh:mi:ss ) as S_Time t snapshot_exec_time_s from STATS$SNAPSHOT t;

  五 生成报告

  同测试一样

  用perfstat用户连接

  执行脚本%oracle_home%\\rdbms\\admin\\spreport sql 输入起始快照ID和结束快照ID 以及报告文件名 生成statspack报告

  一次statspack报告不能跨越一次停机 但是之前或之后的连续区间 收集的信息依然有效 你可以选择之前或之后的采样生成report

  如果中间停过机 会收到以下错误信息

  第 行出现错误:

  ORA : The instance was shutdown beeen snapshots and

  ORA : 在 line

  六 后续处理

   移除定时任务

  当你完成一个采样报告 你应该及时移除这个job任务 遗漏一个无人照顾的job是非常危险的……

   查看任务并移除任务

  select job next_date next_sec what from user_jobs;

  execute dbms_job remove( ID )

   删除历史数据

   ) 删除采样数据

  只要删除stat$snapshot数据表中的相应数据 其他表中的数据会相应的级连删除

  select max(snap_id) from stats$snapshot;

  delete from stats$snapshot where snap_id<= ;

  删除过程中 你可以看到所有相关的表都被锁定了

  select a object_id a oracle_username b object_name

  from v$locked_object a dba_objects b

  where a object_id=b object_id

   ) truncate统计信息表 使用脚本sptrunc sql删除所有的采样数据但保留statspack的库结构

  如果有大量数据 直接delete采样数据是非常缓慢的 使用脚本sptrunc sql可以快速的删除所有统计信息

  查看脚本 可以看出是用truncate table截掉所有相关的表中的内容

  truncate table STATS$FILESTATXS;

  truncate table STATS$TEMPSTATXS;

  

  delete from STATS$DATABASE_INSTANCE;

   ) 删除statspack所有数据和各种对象 使用脚本spdrop sql 全部删除 不留痕迹!但有表空间在~~

  七 其它重要脚本

   spuexp par 数据导出用参数文件 主要内容如下

  file=spuexp dmp log=spuexp log press=y grants=y indexes=y rows=y constraints=y owner=PERFSTAT consistent=y

  我们可以使用以下命令导出

  exp perfstat/perfstat parfile=spuexp par

  例

  E:\\oracle\\product\\ \\db_ \\RDBMS\\ADMIN>exp perfstat/perfstat parfile=spuexp par

   删除数据脚本 spdtab sql 删除表及同义词 spdusr sql删除用户

   oracle 新增脚本

   )用于升级statspack对象的脚本 需要sysdba权限 升级前请先备份存在的schema数据

  spup sql 用于升级 版本的模式至 版本

  spup sql 如果从statspack 升级 需要运行这个脚本

  spup sql 从statspack 升级 需要运行这个脚本 然后运行spup sql

   )sqrepsql sql 用于根据给定的SQL Hash值生成SQL报告

  九 调整statspack的收集门限

  statspack有两种类型的收集选项

  level 级别 控制收集数据的类型

  threshold 门限 设置收集的数据阀值

  都保存在表stats$statspack_parameter中

   级别(level) 有三种快照级别 默认值为

   查看当前level级别

  select snap_level from stats$statspack_parameter;

   )level= 一般性能统计 包括等待事件 系统事件 系统统计 回滚段统计 行缓存 SGA 会话 锁 缓冲池统计等等

   )level= 在level 的基础上 增加SQL语句的收集 SQL语句收集结果记录在ststs$sql_summary表中

   )level= 增加子锁统计 包括level 的所有内容 还会将附加子锁的入stats$latc_children表中 使用这个级别需要慎重 建议在oracle support的指导下进行

  可以通过statspack包修改缺省的级别设置 如

  SQL>execute statspack snap(i_snap_level=> i_modify_parameter=> true );

  通过这条语句

  以后的收集级别都将是 级

  如果你只是想修改本次收集级别 可以忽略i_modify_parameter参数 如下

  SQL>execute statspack snap(i_snap_level=> );  (???是 么?)

   快照门限 只应用于stats$sql_summary表中获取的Sql语句

  因为每一个快照都会收集很数据 及sql语句 所以stats$sql_summary很快就会成为statspack中最大的表

   查看当前各种门限

  select executions_th disk_reads_th parse_calls_th buffer_gets_th from stats$statspack_parameter;

  各种门限

   )executions_th sql语句执行的数量(默认值= )

   )disk_reads_th sql语句执行的磁盘读入数量(默认值= )

   )parse_calls_th sql语句执行的解析调用数量(默认值= )

   )buffer_gets_th sql语句执行的缓冲区获取数量(默认值= )

  任何一个门限值超过以上参数就会产生一条记录

  通过调用statspack modify_statspack_parameter函数我们可以改变门限的默认值

  SQL>execute statspack modify_statspack_parameter(i_buffer_get_th=> i_disk_reads_th=> ;

  十 Statspack 报告分析

  Statspack 报告分为如下部分

     数据库总体信息

  含实例 版本 是否RAC CPU 物理内存 oracle内存设置等等

     每秒每事务的资源消耗情况

     实例的各组件的命中率

     共享池总体情况(Shared Pool Statistics)

     等待时间最长的前 个等待事件(Top Timed Events)

  含前 等待事件 两次采样间cpu占用 内存分配等信息 Oracle各版本等待事件并不完全相同 数量依版本升高而增加 关于各项等待事情的说明 三思之前的 学习动态性能表 系列文章中有过介绍 有心的朋友可以去搜搜看

   DB 所有等待事件(Wait Events) Total wait time>= 的事件

     后台等待事件(Background Wait Events) Total wait time>= 的事件

     柱状显示的等待事件(Wait Event Histogram) 显示各等待事件不同响应时间的比例

     根据CPU开销进行排序的SQL(SQL ordered by CPU)

     根据执行时间进行排序的SQL(SQL ordered by Elapsed)

     根据BufferGets进行排序的SQL(SQL ordered by Gets)

     根据物理读进行排序的SQL(SQL ordered by Reads)

     根据执行次数排序的SQL(SQL ordered by Executions)

     根据解析调用次数排序的SQL(SQL ordered by Parse Calls)

     实例记录的各项活动的统计数据(Instance Activity Stats)

     表空间的IO统计(Tablespace IO Stats)

     数据文件的IO统计(File IO Stats)

     数据文件读柱状图形式统计(File Read Histogram Stats)

   Buffer 池统计数据(Buffer Pool Statistics) 含实例恢复的统计数据 buffer池大小设置建议等等

   PGA 统计数据(PGA Aggr Target Stats) 含PGA缓存命中率 柱状图形式的统计以及PGA设置建议等等

     进程的内存占用情况(Process Memory Summary Stats) 含占用内存较多的进程等

   undo 段摘要

   undo 段统计

     锁存器的当前情况

     锁存器睡眠等待统计

     锁存器失败情况

     数据字典cache性能统计(Dictionary Cache Stats)

     库缓存的活动情况(Library Cache Activity)

   Rule 集(Rule Sets)

     共享池设置建议(Shared Pool Advisory)

   SGA 摘要(SGA Memory Summary)

   SGA 统计信息(SQL Memory Statistics)

cha138/Article/program/Oracle/201311/18097

相关参考

详解白癜风的分期变化

详解白癜风的分期变化,临床上白癜风的病情还是分不同的发病阶段来进行治疗的。通过对白癜风症状的分期可以有效的进行阶段治疗。任何的白癜风患者都希望尽快了解自己的症状和早日恢复。专家详解白癜风的分期变化,要

详解白癜风的分期变化

详解白癜风的分期变化,临床上白癜风的病情还是分不同的发病阶段来进行治疗的。通过对白癜风症状的分期可以有效的进行阶段治疗。任何的白癜风患者都希望尽快了解自己的症状和早日恢复。专家详解白癜风的分期变化,要

趋势指标-MACD详解

趋势指标-MACD详解MACD称为指数平滑异同移动平均线。MovingAverageConvergenceandDivergence)。是从双移动平均线发展而来的,由快的移动平均线减去慢的移动平均线。

知识大全 OracleGrant详解

OracleGrant详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  GRANT  名称  

知识大全 急!(详解)

请问重庆和四川里面有哪些好的中学!急!(详解)重庆这边:重庆一中,南开中学,三中,八中,七中,巴蜀中学重庆和成都都有哪些好的中学?重庆最好的中学有重庆一中,重庆市南开中学,重庆市巴蜀中学,重庆八中,西

知识大全 求详解

如何在cooleditpro音轨上拖动音乐,急!求详解在多轨里,在波形上按住鼠标右键即可拖动波形移动。cooleditpro软件中怎样在音轨上拖动音块?直接选取区域后,用鼠标右键直接拖动就可以了coo

知识大全 OracleProfile使用详解

OracleProfile使用详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一目的  Or

知识大全 ORACLENUMBER类型详解

ORACLENUMBER类型详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  >NUMB

知识大全 求详解,谢谢

在这些短周期元素Mg、Al、Si、O中,其单质晶体微粒间存在两种相互作用的是_____元素.求详解,谢谢!  以下文字资料是由(全榜网网www.cha138.com)小编

知识大全 Asp函数详解

Asp函数详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Cbool(string)转换为布尔值