如何解决Oracle数据库等待事件? (oracle数据库等待事件)

Oracle数据库等待事件是数据库性能调优过程中不可避免的问题。等待事件是指当用户请求执行某个操作时,当操作涉及到某些资源(如CPU、磁盘、网络等)无法满足操作请求时,系统会使操作有所等待,这个等待过程就是等待事件。等待事件往往会导致系统响应缓慢,严重影响数据库性能,因此必须采取一系列措施加以解决。

1. 了解等待事件

需要了解Oracle中各种等待事件并进行分类。常见的等待事件包括I/O等待、CPU等待、网络等待、锁等待等。针对不同的等待事件要采取不同的解决措施。

2. 优化查询

查询语句的优化可以是提高Oracle数据库性能的有效手段。优化查询主要包括以下几个方面:

(1)优化查询语句的where条件

where条件的优化可以显著提升查询效率。可以通过建立索引或调整查询语句来优化where条件。

(2)避免全表扫描

全表扫描将遍历整个表,性能较低。可以通过建立索引、使用分区表或限制查询结果来避免全表扫描。

(3)尽量避免使用复杂查询

复杂查询语句的效率较低。应尽量避免在查询语句中使用嵌套或子查询等复杂语句。

3. 确保适当的资源分配

Oracle数据库等待事件通常是由于资源不足引起的。因此,为了提高Oracle数据库性能,必须确保适当的资源分配。其中包括:

(1)为相关的表和索引建立适当的资源

建立适当的表和索引可以显著提高数据库性能。可以通过动态重建索引、合并分散的表来提高资源利用率。

(2)分配足够的内存

分配足够的内存可以避免Oracle数据库的内存不足导致的等待事件。在分配内存时,应确保预留足够的内存以处理高并况。

(3)分配足够的磁盘空间

为Oracle数据库分配足够的磁盘空间可以避免存储相关操作的等待事件。

4. 应用SQL调优工具

SQL调优工具可以帮助数据库管理员快速诊断等待事件并提供有效的解决方案。其中最常用的工具包括SQL Trace、Statspack和AWR。这些工具可以根据不同的等待事件类型提供详细的信息和相应的解决措施。

5. 采取高可用性技术

高可用性技术可以提高数据库的性能和稳定性,并避免因数据库时钟退化、网络中断等导致的等待事件。常见的高可用性技术包括数据镜像、RAC集群、数据复制等。

解决Oracle数据库等待事件是提高数据库性能的关键一步。通过了解等待事件、优化查询、确保适当的资源分配、应用SQL调优工具和采取高可用性技术等一系列措施可以显著提高Oracle数据库性能。

相关问题拓展阅读:

Oracle数据库无响应故障处理方式

Oracle数据库

无响应故障处理方式

  Oracle数据库无响应故障,简单地讲就是数据库实例不能响应客户端发起的请求,客户端提交一个SQL后,就一直处于等待数据库实例返回结果的状态。更严重的现象是客户端根本不能连接到数据库,发起一个连接嫌则伍请求后,一直处于等待状态。Oracle数据库无响应故障怎么处理呢?下面跟我一起来学习Oracle数据库无响应故障的处理方法吧!

  无响应的故障现象一般有以下几种:

  1.Oracle的进程在等待某个资源或事件

  这种现象一般可以从V$SESSION_WAT、V$LATCH、V$LATCHHOLDER等动态视图中检查进程正在等待的资源或事件,而被等待的资源或事件,一直都不能被获取,甚至是很长时间都不可获得。如果这个正在等待的进程持有了其他的资源,则会引起其他的进程等待,这样就很可能引起实例中大范围的会话发生等待。由于进程在等待资源或事件时,通常都处于SLEEP状态,消耗的CPU资源非常少(在等待latch时要稍微多消耗一些CPU资源),所以从OS来看,CPU的消耗并不高,甚至是非常低。

  这种因为等待而引起的个别进程Hang,相对比较容易处理。

  2. OracleProcess Spins

  所谓Spin,就是指Oracle进程中的代码在执行某个过程时,陷入了循环。在V$SESSION视图中,往往可以看到Hang住的会话,一直处于“ACTIVE”状态。对于这样的会话,用“alter system kill session ‘sid,serial#’”命令也不能完全断开会话,会话只能被标记为“killed”,会话会继续消耗大量的CPU。进程Spins由于是在做循环,CPU的消耗非常大,从OS上明显可以看到这样的进程,通常会消耗整个CPU的资源。

  而对于这样的Hang住的会话,处理起来相对比较复杂,并且为了从根本上解决问题,需要超过DBA日常维护所需要的技能。

  从故障范围来看,无响应故障可以分为以下几种情况:

  1. 单个或部分会话(进程)Hang住

  这种情况属于小范围的故障,业务影响相对较小,一般来说只会影响业务系统的个别模块。在一个多应用系统的数据库上面,如果Hang住的会话比较多,则影响的可能是其中的一个应用系统。这里有一个例外,如果Hang住的进程是系统后台进程,如pmon、on等,则影响的范围就非常大了,最终甚至会影响整个数据库及所有应用系统。还有值得注意的是,即使是少部分会话Hang住,也要及时处理,否则极有可能会扩散到整个系统。

  2. 单个数据库实例Hang住

  这种情况造成的影响非常大。在这个实例上的所有应用系统均受到严重影响,并且在找到根源并最终解决问题之前,数据库实例往往须要重启。

  3. OPS或RAC中的多个实例或所有实例都Hang住

  在这种情况下,即使是OPS或RAC,都已经没办法提供高可用特性了。使用这个数据库的所有应用系统将不能继续提供服务,这种芹或情况往往须要重启。

  无响应故障成因分析

  Oracle数据库无响应,一般主要由以下几种原因引起:

  1. 数据库主机负载过高,严重超过主机承受能力

  比如应用设计不当,数据库性能低下,活动会话数的大量增加,导致数据库主机的负载迅速增加,数据库不能正常操作,并最终Hang住;主机

物理内存

严重不足,引起大量的换页,特别是在SGA中的内存被大量换出到

虚拟内存

时,数据库实例往往就会Hang住。

  2. 日常维护不当、不正确的操作引起数据库Hang住

  比如归档日志的存储空间满,导致数据库不能归档,引起数据库Hang住;在一个大并发的繁忙的系

  统上,对DML操作比较多的大表进盯卖行move、增加

外键

约束等操作也可能使系统在短时间内负载大幅升高,并引起

数据库系统

Hang住;不正确的资源计划(Resource Plan)配置,使进程得不到足够的CPU等。

  3. Oracle数据库的Bug

  几乎每个版本都存在着会导致数据库系统Hang住的Bug,这些Bug会在一些特定的条件下触发,特别是在RAC数据库中,引起数据库Hang住的Bug比较多。

  4. 其他方面的一些原因

  比如在RAC数据库中,如果一个节点退出或加入到RAC的过程中,当进行Resource Reconfiguration时,会使系统冻结一段时间,也有可能使系统Hang住。

  以上所描述的几种常见的会导致Oracle数据库实例Hang住的原因中,大部分的情况是可以避免的,只要维护得当,一般不会出现这种故障。对于Oracle数据库Bug所导致的数据库无响应故障,由于是在特定的情况下才会触发,所以如果能够尽量对数据库打上最新版本的补丁,并且熟悉当前版本中会导致系统Hang住的Bug以及触发条件,就能够更大限度地避免这种故障的发生,提高系统的可用性。

  那么,在数据库Hang住的情况下,如何去分析并发现导致问题的根源?一方面,由于系统Hang住会导致业务系统不可用,为了能够尽快地恢复业务,须快速地判断问题所在,然后Kill掉引起故障的会话和进程,或者数据库实例不得不重启以迅速恢复业务;但另一方面,如果只是重启数据库或Kill会话和进程来解决问题,在很多情况下是治标不治本的办法,在以后故障随时可能会出现。如何在二者之间进行抉择呢?对于数据库Hang故障的处理,首先是尽可能地收集到系统Hang住时的状态数据,然后尽快地恢复业务,恢复业务后分析收集到的数据,找到数据库系统Hang住的真正原因,然后再进行相应的处理。下一节将详细描述数据库系统Hang住后的处理流程。

  无响应故障处理流程

  对于Oracle无响应故障的处理,我们可以按下图所示的流程进行。

  值得注意的是,上图并不是一个完整的Oracle数据库故障处理流程图,只是处理Oralce数据库无响应这一类特定的故障的流程,只列出了针对这一特定类型故障处理时的关键处理点。不过既然是故障,所以这类故障的处理流程与其他故障的处理流程,有着非常相似的地方。

  下面是整个流程的详细说明:

. 在出现数据库无响应故障后,首先确认系统的影响范围,如上节所描述的’,是部分业务系统或模块还是所有的业务系统都受影响,是不是整个实例或多个实例都无响应。同时应询问系统维护和开发人员,受影响的系统在出现故障前是否有过变动,包括主机硬件、操作系统、网络、数据库以及应用等。有时一个细小的变动就可能导致出现数据库Hang住这样严重的故障。曾经遇到一个库,应用只是修改了一个SELECT语句就导致了数据库Hang住。

. 为了避免由于网络、数据库监听或客户端因素影响分析,建议都登录到主机上进行操作。

. 如果主机不能登录(为了避免干扰流程主线,这里不讨论如网络问题这样也会导致不能连接的故障),尝试关闭出现问题的业务系统,甚至是所有的业务系统。如果关闭了所有的业务系统之后,仍然不能连接,则只有考虑重新启动数据库主机。在数据库主机重新启动后,使用操作系统工具或OSW等长期监控操作系统的资源使用,同时监控Oracle数据库的性能和等待等。

. 登录上主机后,先用top、topas等命令简单观察一下系统。看看系统的CPU使用、物理内存和虚拟内存的使用、IO使用等情况。

. 使用SQLPLUS连接数据库,如果不能连接,则只能从操作系统上观察系统中是否有异常的现象,比如占用CPU过高的进程。使用gdb、dbx等debugger工具对数据库进行system state dump;使用strace、truss等工具检查异常进程的系统调用;使用pstack、procstack等工具察看异常进程的call stack等。

. 使用SQLPLUS连接上数据库后,进行hangyze、system state dump等操作;或检查等待事件、异常会话等正在执行的SQL等待。

. 找到故障产生的原因,如果暂时找不到原因,尽量收集数据。

.确良如果应用急须恢复,可通过Kill会话、重启数据库实例等方式,先恢复应用。

. 根据最终诊断结果,对数据库升级打补丁,或者修改应用等方式从根本上解决问题。

  怎样避免数据库出现无响应故障

  作为Oracle数据库DBA,除了处理故障之外,更重要的是如何预防故障的发生。根据前面对数据库无响应故障的成因分析,在日常的维护工作中,须做到以下几点:

  1. 进行正确的维护操作

  很多的数据库无响应故障都是由于不正确的维护操作引起的。应避免在业务高峰期做大的维护操作,比如像move、加主外键约束等会长时间锁表的操作。如果的确需要,尽量使用正确的操作方法。比如用ONLINE方式重建索引;建主键、唯一键约束时先建索引,然后在建约束时指定新建的索引,等等。也就是保证系统的并发性、可伸缩性,避免系统串行操作的出现。

  2. 优化应用设计,优化数据库性能

  为避免性能问题导致在业务高峰期数据库不能及时有效处理来自业务的请求,甚至于完全Hang住。对于数据库中存在串行访问的部分进行优化,比如latch、enqueue,还包括不合理的sequence设计等。特别是在RAC数据库中,严重串行访问等待往往更容易引起严重的性能问题。优化应用设计,使数据库具有更好的可伸缩性和并行处理能力,能够有效地避免性能问题引起的数据库Hang住。

  3. 利用监控系统随时监控系统负载

  遇到系统负载过高,内存不足,OS中虚拟内存换页很频繁等情况时,及时采取措施;监控Oracle数据库的核心进程,如pmon、on等,看是否有异常,如过高的CPU消耗。出现异常应立即处理;监控归档空间和日志切换;监控数据库中的等待事件,比如是否有大量的enqueue、log file switch (archiving needed)、regr:become active等待事件等。

  4. 为数据库打上补丁

  很多的无响应故障是由于Oracle的Bug引起的,数据库DBA应关注当前版本中有哪些Bug会导致数据库Hang住,尽量为数据库打上解决这些Bug的补丁。

;

Oracle数据库event事件与dump文件介绍

一 Oracle跟踪文件

  Oracle跟踪文件分为三种类型 一种是后台报警日志文件 记录数据库在启动 关闭和运行期间后台进程的活动情况 如表空间创建 回滚段创建 某些alter命令 日志切换 错误消息等

  在数据库出现故障时 应首先查看该文件 但文件中的信息与任何错误状态没有必然的联系 后台报警日志文件保存BACKGROUND_DUMP_DEST参数指定的目录中 文件格式为SIDALRT LOG 另一种类型是DBWR LGWR ON等后台进程创建的后台跟踪文件 后台跟踪文件根据后台进程运行情况产生 后台跟踪文件也保存在BACKGROUND_DUMP_DEST参数指定的目录中 文件格式为siddbwr trc sidon trc等 还有一种类型是由连接到Oracle的用户进程(Server Processes)生成的用户跟踪文件 这些文件仅在用户会话期间遇到错误时产生 此外 用户可以通过执行oracle跟踪事件(见后面)来生成该类文件 用户跟踪文件保存在USER_DUMP_DEST参数指定的目录中 文件格式为oraxx trc xx为创建文件的进程号(或线程号)

  

二 Oracle跟踪事件

  Oracle提供了一类命令 可以将Oracle各类让告内部结构中所包含的信息转储(dump)到跟踪文件中 以便用户能根据文件内容来解决各种故障 设置跟踪事件有两种方法 一种是在init ora文件中设置事件 这样open数据库后 将影响到所有的会话 设置格式如下

  亏卜EVENT= eventnumber trace name eventname : 通过:符号 可以连续设置多个事件 也可以通过连续使用event来设置多个事件

  另一种方法是在会话过程中使用alter session set events命令 只对当前会话有影响 设置格式如下

  alter session set events trace name eventname :

  通过:符号 可以连续设置多个事件 也可以通过连续使用alter session set events 来设置多个事件

  格式说明 eventnumber指触发dump的事件号 事件号可以是Oracle错误号(出现相应错误时跟踪指定的事件)或oralce内部事件号 内部事件号在 到 之间 不能与immediate关键字同用

  immediate关键字表示命令发出后 立即将指定的结构dump到跟踪文件中 这个关键字只用在alter session语句中 并且不能与 eventnumber forever关键字同用

  trace name 是关键字

  eventname指事件名称(见后面) 即要进行dump的实际销滑穗结构名 若eventname为context 则指根据内部事件号进行跟踪

  forever关键字表示事件在实例或会话的周期内保持有效状态 不能与immediate同用

  levelnumber表示事件级别号 一般从 到 表示只dump结构头部信息 表示dump结构的所有信息

   buffers事件 dump SGA缓冲区中的db buffer结构

  alter session set events immediate trace name buffers level ; 表示dump缓冲区的头部

   blockdump事件 dump数据文件 索引文件 回滚段文件结构

  alter session set events immediate trace name blockdump level ; 表示dump块地址为 的数据块

  在Oracle 以后该命令已改为

  alter system dump datafile block ; 表示dump数据文件号为 中的第 个数据块

   controlf事件 dump控制文件结构

  alter session set events immediate trace name controlf level ; 表示dump控制文件的所有内容

   locks事件 dump LCK进程的锁信息

  alter session set events immediate trace name locks level ;

   redohdr事件 dump redo日志的头部信息

  alter session set events immediate trace name redohdr level ; 表示dump redo日志头部的控制文件项

  alter session set events immediate trace name redohdr level ; 表示dump redo日志的通用文件头

  alter session set events immediate trace name redohdr level ; 表示dump redo日志的完整文件头

  注意 redo日志的内容dump可以采用下面的语句:

  alter system dump logfile logfilename ;

   loghist事件 dump控制文件中的日志历史项

  alter session set events immediate trace name loghist level ; 表示只dump最早和最迟的日志历史项

  levelnumber大于等于 时 表示 的levelnumber次方个日志历史项

  alter session set events immediate trace name loghist level ; 表示dump 个日志历史项

   file_hdrs事件 dump 所有数据文件的头部信息

  alter session set events immediate trace name file_hdrs level ; 表示dump 所有数据文件头部的控制文件项

  alter session set events immediate trace name file_hdrs level ; 表示dump 所有数据文件的通用文件头

  alter session set events immediate trace name file_hdrs level ; 表示dump 所有数据文件的完整文件头

   errorstack事件 dump 错误栈信息 通常Oracle发生错误时前台进程将得到一条错误信息 但某些情况下得不到错误信息 可以采用这种方式得到Oracle错误

  alter session set events trace name errorstack forever ; 表示当出现 错误时 dump 错误栈和进程栈

   systemstate事件 dump所有系统状态和进程状态

  alter session set events immediate trace name systemstate level ; 表示dump 所有系统状态和进程状态

   coalesec事件 dump指定表空间中的自由区间

  levelnumber以十六进制表示时 两个高位字节表示自由区间数目 两个低位字节表示表空间号 如 x 表示dump系统表空间中的 个自由区间 转换成十进制就是 即

  alter session set events immediate trace name coalesec level ;

   processsate事件 dump进程状态

  alter session set events immediate trace name processsate level ;

   library_cache事件 dump library cache信息

  alter session set events immediate trace name library_cache level ;

   heapdump事件 dump PGA SGA UGA中的信息

  alter session set events immediate trace name heapdump level ;

   row_cache事件 dump数据字典缓冲区中的信息

  alter session set events immediate trace name row_cache level ;

  

三 内部事件号

   用于监视事务恢复

   转储UNDO SEGMENT头部

  event = trace name context forever

   用于给出会话期间的登陆信息

   用于给出会话期间的注销信息

   转储排序的统计信息

   转储排序增长的统计信息

   跟踪Freelist管理操作

   跟踪SQL语句

  alter session set events trace name context forever level ; 跟踪SQL语句并显示绑定变量

  alter session set events trace name context forever level ; 跟踪SQL语句并显示等待事件

   转储优化策略

   模拟redo日志中的创建和清除错误

   阻止ON进程在启动时清除临时段

   转储 SQL*NET统计信息

   转储高水标记变化

   转储Hash连接统计信息

   转储分区休整信息

   转储一致性读信息

   转储一致性读中Undo应用

   允许在控制文件中模拟错误

   触发数据块检查事件

  event = trace name context forever level

   触发索引检查事件

   模拟在写控制文件后崩溃

   模拟在控制文件中的写错误

  levelnumber从 表示产生错误的块号 大于等于 则每个控制文件将出错

   模拟在控制文件中的读错误

   转储Undo头部变化

   ;转储Undo变化

   转储索引的分隔与删除

   转储基于字典管理的区间的变化

   模拟在数据文件上的I/O错误

   设置在全表扫描时忽略损坏的数据块

  alter session set events trace name context off ; 关闭会话期间的数据块检查

  event = trace name context forever level 对任何进程读入SGA的数据块进行检查

   将设置为软损坏(DBMS_REPAIR包设置或DB_BLOCK_CHECKING为TRUE时设置)的数据块dump到跟踪文件

   用于内存堆检查

  alter session set events trace name context forever level ;

   转储远程SQL执行

   跟踪PMON进程

   跟踪dispatch进程

   跟踪MTS进程

   模拟写数据文件头部错误

   模拟写redo日志文件错误

   允许连接时存在内存泄漏

  alter session set events trace name context forever level ; 允许存在 个字节的内存泄漏

   转储共享游标

   模拟控制文件头部损坏

   模拟控制文件打开错误

   模拟归档出错

   调试直接路径机制

   跟踪ON进程

   跟踪位图索引的创建

   跟踪enqueues

   跟踪全局enqueues

   跟踪RAC的buffer cache

   跟踪对位图索引的访问

   跟踪位图索引合并操作

   跟踪位图索引OR操作

   跟踪位图索引AND操作

   跟踪位图索引MINUS操作

   跟踪位图索引向ROWID的转化

   跟踪位图索引的压缩与解压

   跟踪位图索引的修改

   跟踪游标声明

   跟踪PL/SQL执行

   转储PL/SQL执行统计信息

  最后要说明的是 由于版本不同以上语法可能有些变化 但大多数还是可用的

  附完整的跟踪事件列表 event No to

  

  SET SERVEROUTPUT ONDECLAREerr_msg VARCHAR ( );BEGINdbms_output enable ( );FOR err_num IN LOOPerr_msg := SQLERRM ( err_num);IF err_msg NOT LIKE %Message ||err_num|| not found% THENdbms_output put_line (err_msg);END IF;END LOOP;END;/

   select sid serial# username osuser machine from v$session;查询session的sid serial#

   exec dbms_system set_sql_trace_in_session( true);开始跟踪

   exec dbms_system set_sql_trace_in_session( true) 停止跟踪

   tkprof * trc * txt

   select sid serial# username osuser machine from v$session;查询session的sid serial#

   exec dbms_system set_sql_trace_in_session( true);开始跟踪

   exec dbms_system set_sql_trace_in_session( true) 停止跟踪

   tkprof * trc * txt

   查看文件

   get trace file nameselect d value|| / ||lower(rtrim(i instance chr( )))|| _ora_ ||p spid|| trc trace_file_name from ( select p spid from sys v$mystat m sys v$session s sys v$process pwhere m statistic# = and s sid = m sid and p addr = s paddr) p  ( select t instance from sys v$thread  t sys v$parameter  v where v name = thread and (v value = or t thread# = to_number(v value))) i ( select value from sys v$parameter where name = user_dump_dest ) d

oracle数据库等待事件的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle数据库等待事件,如何解决Oracle数据库等待事件?,Oracle数据库无响应故障处理方式,Oracle数据库event事件与dump文件介绍的信息别忘了在本站进行查找喔。


数据运维技术 » 如何解决Oracle数据库等待事件? (oracle数据库等待事件)