@@@客户***数据库STATSPACK报告无法生成TOP SQL章节问题处理过程

本文描述了在Oracle 9.2.0.8版本中遇到的STATSPACK无法生成TOPSQL章节的问题及解决方案。通过调整STATSPACK快照参数、禁用并重建索引等步骤,最终解决了因主键约束导致的数据插入失败问题。

关键字:
STATSPACK

作者:
ioriakyo

一、问题描述:

数据库版本:ORACLE 9.2.0.8 单机
操作系统版本:AIX 5308

1、成功执行STATSPACK.SNAP。
2、执行SNAP操作后,PERFSTAT用户下的stats$sqltext表没有产生任何记录信息。
3、STATSPACK报告无法生成TOP SQL章节。

[@more@]

二、处理分析过程:

1、使用以下函数修改STATSPACK快照级别和阀值:
SQL>execute statspack.snap(i_snap_level=>0,i_modify_parameter=>'true');
SQL>execute statspack.modify_statspack_parameter(i_buffer_gets_th=>100000,i_disk_reads_th=>100000);
并通过查询stats$statspack_parameter表,确定快照级别修改生效。

分析与结论:STATSPACK报告无法生成TOP SQL章节。


2、查看STATSPACK程序,并使用PLSQL Developer工具进行测试:
发现对stats$sqltext表进行插入的过程无法成功执行:
while (not (l_insert_done) and l_counter < l_counter_maxvalue) loop
begin
insert into stats$sqltext
( hash_value
, text_subset
, piece
, sql_text
, address
, command_type
, last_snap_id
)
select /*+ ordered use_nl(vst) */
vst.hash_value
, new_sql.text_subset
, vst.piece
, vst.sql_text
, vst.address
, vst.command_type
, new_sql.snap_id
from (select hash_value
, address
, text_subset
, snap_id
from stats$sql_summary ss
where ss.snap_id = l_snap_id
and ss.dbid = p_dbid
and ss.instance_number = p_instance_number
and not exists (select 1
from stats$sqltext sst
where sst.hash_value = ss.hash_value
and sst.text_subset = ss.text_subset
and sst.piece = 0
)
) new_sql
, v$sqltext vst
where vst.hash_value = new_sql.hash_value
and vst.address = new_sql.address
order by vst.hash_value, new_sql.text_subset
, vst.piece; -- deadlock avoidance
l_insert_done := TRUE;
exception
when DUP_VAL_ON_INDEX then
l_counter := l_counter + 1;
end;
end loop;
l_counter := 0;
l_insert_done := FALSE;

分析与结论:测试进入死循环,l_counter_maxvalue定义值100,尝试100次后跳出循环。


3、将程序中的SQL语句截取修改,尝试手动插入操作:
insert into stats$sqltext
( hash_value
, text_subset
, piece
, sql_text
, address
, command_type
, last_snap_id
)
select /*+ ordered use_nl(vst) */
vst.hash_value
, new_sql.text_subset
, vst.piece
, vst.sql_text
, vst.address
, vst.command_type
, new_sql.snap_id
from (select hash_value
, address
, text_subset
, snap_id
from stats$sql_summary ss
where ss.snap_id = 8
and ss.dbid = 1638417141
and ss.instance_number = 1
) new_sql
, v$sqltext vst
where vst.hash_value = new_sql.hash_value
and vst.address = new_sql.address
order by vst.hash_value, new_sql.text_subset, vst.piece;

分析与结论:告警插入失败,违反STATS$SQLTEXT_PK唯一索引约束。


4、将STATS$SQLTEXT表的主键DISABLE,并建立一个普通索引,重新测试SNAP过程。

分析与结论:可以正常生成STATSPACK报告的TOP SQL章节。

三、总结:

1、这个故障主要是由于违反了主键约束,导致STATS$SQLTEXT表无法正常插入数据产生。

2、处理的同时也对STATS$SQLTEXT表进行了多次truncate操作,但仍然存在违反了主键约束的报错,可能存在BUG。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25152497/viewspace-1047752/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25152497/viewspace-1047752/

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 QueueForMcu 基于单片机实现的队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数单片机平台。 开源代码:https://.com/xiaoxinpro/QueueForMcu 一、特性 动态创建队列对象 动态设置队列数据缓冲区 静态指定队列元素数据长度 采用值传递的方式保存队列数据 二、快速使用 三、配置说明 目前QueueForMcu只有一个静态配置项,具体如下: 在文件 中有一个宏定义 用于指定队列元素的数据长度,默认是 ,可以根据需要更改为其他数据类型。 四、数据结构 队列的数据结构为 用于保存队列的状态,源码如下: 其中 为配置项中自定义的数据类型。 五、创建队列 1、创建队列缓存 由于我们采用值传递的方式保存队列数据,因此我们在创建队列前要手动创建一个队列缓存区,用于存放队列数据。 以上代码即创建一个大小为 的队列缓存区。 2、创建队列结构 接下来使用 创建队列结构,用于保存队列的状态: 3、初始化队列 准备好队列缓存和队列结构后调用 函数来创建队列,该函数原型如下: 参数说明: 参考代码: 六、压入队列 1、单数据压入 将数据压入队列尾部使用 函数,该函数原型如下: 参数说明: 返回值说明: 该函数会返回一个 枚举数据类型,返回值会根据队列状态返回以下几个值: 参考代码: 2、多数据压入 若需要将多个数据(数组)压入队列可以使用 函数,原理上循环调用 函数来实现的,函数原型如下: 参数说明: 当数组长度大于队列剩余长度时,数组多余的数据将被忽略。 返回值说明: 该函数将返回实际被压入到队列中的数据长度。 当队列中的剩余长度富余...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值