WEB开发网
开发学院数据库MSSQL Server 如何找出引起ORA-1652的SQL 阅读

如何找出引起ORA-1652的SQL

 2008-08-26 09:56:00 来源:WEB开发网   
核心提示:在alert文件中,我们可能会看到这样的报错信息:WedAug2017:16:372008ORA-1652:unabletoextendtempsegmentby128intablespaceDBA_TEMP要解决这个问题,如何找出引起ORA-1652的SQL,我们首先要导致这个问题的SQL,可能方法有几种:1、设置e

在alert文件中,我们可能会看到这样的报错信息: 

WedAug2017:16:372008
ORA-1652:unabletoextendtempsegmentby128intablespaceDBA_TEMP

要解决这个问题,我们首先要导致这个问题的SQL,可能方法有几种:

1、设置events

alter system set events '1652 trace name errorstack level 1';

这种方法有一定局限:

1)它不能获取已发生的1652的错误信息,只能对以后出现1652错误时生成一个trace文件;

2)用events,不清楚会对数据库有什么不好的影响。

2、查询V$SQL视图:

如select * from v$sql order by direct_writes/executions desc;

这种方法的局限性是:

1)因为很难知道V$SQL视图中的SQL执行时间,难以确认具体是那个SQL导致错误的

2)引起问题的SQL极有可能已经被age out了

3、 生成错误发生时的awr、statspack报表,从报表中的SQL ordered by Reads部分找出SQL

这种方法更不可靠,因为:

1) SQL ordered by Reads读写的不一定是临时表空间

2) awr/statspack报表是根据物理读的总量排序的,如果导致问题的SQL执行次数少,那也是不会出现在这些报表中的。

4、查询awr相关视图

对于10G来说,这种方法是最可行、最准确的。

 SELECTDISTINCTTO_CHAR(SUBSTR(b.sql_text,1,4000))
  FROMsys.WRH$_SQLTEXTb
  WHEREb.sql_idIN
  (SELECTsql_id
  FROM
  (SELECTa.sql_id
  FROMsys.WRH$_SQLSTATa
  WHEREa.parsing_schema_nameNOTIN('SYS')
  ANDa.executions_total>0
  ANDa.direct_writes_total>0
  ANDa.SNAP_IDIN
  (SELECTSNAP_ID
  FROMsys.WRM$_SNAPSHOT
  WHEREto_date('2008:08:2017:20:08','yyyy:mm:ddhh24:mi:ss')BETWEENbegin_interval_timeANDend_interval_time
  )
  ORDERBYa.direct_writes_total/a.executions_totalDESC
  )
  WHERErownum<=10
  );

基本上,结果中的第一句只要不是insert /*+ append */之类的语句,那么它就极有可能是导致ORA-1652的SQL。

如果是9i,用statspack,也可以用类似的SQL从statspack视图查到需要的结果。

Tags:如何 找出 引起

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接