问题分析指引之【异常等待事件】

本文详细介绍了Oracle等待事件的分析方法和常见异常处理思路,包括通过查询当前和历史等待事件、检查SQL性能趋势来定位问题,并提供了针对各种等待事件的优化建议,如空间等待与非空间等待的区分、SQL执行计划分析等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

ORACLE等待事件,是ORACLE提供的一种非常强大的功能,能在数据库中指明正在发生的一些事件动作。通常只要ORACLE出现各类性能/异常/稀奇古怪问题,我第一件事情总是查询等待事件,这基本能定位到90%以上的问题原因。但是,处理ORACLE问题的时候不能单凭等待事件来分析,这样很可能进入死胡同。ORACLE毕竟是一个及其复杂的系统,需要把它和其周边的应用、操作系统、硬件、软件版本、配置等来做一个整体的评估才是一个优秀的DBA。

ORACLE等待事件如果细分的话可以分为很多种:

SQL> select wait_class,count(*) from v$event_name group by wait_class order by 2;

在这里插入图片描述

但是我们日常中,一般就分为两种:空间等待和非空间等待,即上图的是否等于“Idle”来进行判断

空闲等待:意味着Oracle正在等待某种动作的发生,实际上并不是因为繁忙而等待,而是因为没有事情做所以等待。系统并没有出现性能上的问题。多数的空闲等待对数据库性能的影响不大,可以不必过多的关注。

非空闲等待:表示专门针对oracle的活动,指数据库任务或运行过程中发生的等待,一般表明当前数据库存在某些方面的问题。这些等待事件是我们在日常工作中需要着重关注的。



二、检查步骤简介

1、确认等待事件类型

如果问题在当前:查看当前等待事件

select event,count(*) from v$session group by event order by 2 desc;

如果问题已经过去1:带入问题时间段,查询ash等待事件

select * from (select event,count(*) from v$active_session_history where sample_time>=to_timestamp('&begin_time','yyyy-mm-dd hh24:mi:ss') and sample_time<=to_timestamp('&end_time','yyyy-mm-dd hh24:mi:ss') group by event order by 2 desc)where rownum<=10;

如果问题已经过去2:即ash无法查到,则需要到dba_hist中查询

select * from dba_hist_snapshot order by snap_id desc;                                           --确认snapshot范围

select * from (select event,count(*) from dba_hist_active_sess_history where snap_id between &begin_snap and &end_snap group by event order by 2 desc)where rownum<=10;     --可以根据实际情况加入其它条件
2、确认等待事件的SQL

如果问题在当前:查看当前等待事件

select * from

(select event,sql_id,count(*) from v$session where status='ACTIVE' and sql_id is not null group by event,sql_id order by 3 desc)
where rownum<=10;

如果问题已经过去1:带入问题时间段,查询ash等待事件

select * from (select event,sql_id,count(*) from v$active_session_history where sample_time>=to_timestamp('&begin_time','yyyy-mm-dd hh24:mi:ss') and sample_time<=to_timestamp('&end_time','yyyy-mm-dd hh24:mi:ss') and event='&event_name' group by event,sql_id order by 3 desc)where rownum<=20;

如果问题已经过去2:即ash无法查到,则需要到dba_hist中查询

select * from dba_hist_snapshot order by snap_id desc;                                           --确认snapshot范围

select * from (select event,sql_id,count(*) from dba_hist_active_sess_history where event='&event_name' and snap_id between &begin_snap and &end_snap group by event,sql_id order by 3 desc)where rownum<=20;     --可以根据实际情况加入其它条件
3、检查SQL性能趋势
select * from(
select to_char(a.end_interval_time, 'YYYY-MM-DD HH24:MI:SS') end_interval_time,
s.sql_id,
s.plan_hash_value,
s.executions_delta,
round(s.buffer_gets_delta / executions_delta,3) as buffer_gets_delta_each,
round(s.elapsed_time_delta / executions_delta / 1000000,3) as "elapsed_time_delta/s",
round(s.cpu_time_delta / executions_delta / 1000000,3) as "cpu_time_delta/s",
round(s.physical_read_bytes_delta / executions_delta / 1000000,3) as "physical_read_bytes_delta/s",
round(s.ROWS_PROCESSED_DELTA / executions_delta,3) as ROWS_PROCESSED_DELTA
from dba_hist_sqlstat s, dba_hist_snapshot a
where s.snap_id = a.snap_id
and sql_id = '&sqlid'
and s.executions_delta > 0
order by s.snap_id desc
) where rownum<=2000;

备注:问题时间点前后关注点如下:

  1. 执行计划是否有变化(即plan_hash_value是否有变化)。

  2. 执行次数是否有突增

  3. 物理逻辑读是否有突增

  4. cpu和执行耗时是否有突增

4、获取SQL执行计划
select * from table(dbms_xplan.display_awr('&sql_id',&plan_hash_value,null,'ADVANCED'));

备注:如果期间执行计划变化,请逐一获取执行计划信息,确认具体变化内容。

5、根据实际等待事件类型和执行计划进行分析并优化


三、常见异常等待事件原因和处理思路

以等待事件名字进行排序

等待事件名常见原因备注
buffer busy waits1、SQL执行效率慢(执行计划突变,执行计划走错,执行次数过多,索引不合理等)
2、热块
control file parallel write
control file sequential read
control file single write
大量操作读/写控制文件
1、备份
2、存储IO问题
3、日志切换频繁(reodlog大小和组数可能不合理)
4、dump控制文件
cursor: mutex S
cursor: mutex X
cursor: pin S
cursor: pin S wait on X
cursor: pin X
1、业务繁忙期编译存储过程、函数、包等
2、业务繁忙期间DDL表/索引等
3、硬解析过多
4、未使用绑定变量/绑定变量过多
5、传参、字段类型问题导致隐式类型转换
6、version count过高,父游标无法共享
7、执行次数过多
8、共享池大小不合理
9、共享子池数量不合理
10、sga设置不合理,导致内存抖动
db file scattered read物理IO、多块读、绝大部分为全表扫描和索引快速全扫描
1、db cache过小,内存命中率过低
2、执行计划异常:TABLE ACCESS FULL / INDEX FAST FULL SCAN
3、存储IO性能问题
db file sequential read物理IO、单块读、索引扫描
1、db cache过小,内存命中率过低
2、sql执行效率有问题
3、存储IO性能问题
direct path read1、执行计划异常:全表扫描
2、并行操作导致
3、参数不合理导致:_serial_direct_read / _small_table_threshold / _very_large_object_threshold
建议调整参数_serial_direct_read,设置为never
direct path read temp
direct path write temp
排序导致,请关注temp表空间使用情况。
1、sql性能问题,执行计划异常,笛卡尔积比较常见:MERGE JOIN CARTESIAN
2、使用了大量的排序操作
enq: CF - contentionControl File锁
1、备份恢复
2、存储IO
3、日志切换、大量DML
enq: HW - contention高水位锁,段/数据文件扩展频繁
1、大量数据入库,比如:insert
2、bug:非分区表,且单表过大,近100G
3、数据文件自动扩展不合理
手动扩展数据文件
手动allocate extent
enq: HW - contention高水位锁,段/数据文件扩展频繁
1、大量数据入库,比如:insert
2、bug:非分区表,且单表过大,近100G
3、数据文件自动扩展不合理
手动扩展数据文件
手动allocate extent
enq: SQ - contentionsequence锁
1、cache过小
2、rac下order模式问题
建议规范新建sequence时指定cache 40(一般40可以满足市面上95%的业务系统并发)
enq: TM - contention表锁
1、全表锁
2、外键没有索引
3、insert /+append/
外键必须有索引
enq: TX - allocate ITL entryITL事务槽锁
1、表/索引默认事务槽过小:select ini_trans from dba_tables where table_name=’&table_name’;
2、事务过于频繁
增大该等待对应对象的事务槽,一般6-16足够
enq: TX - contention
enq: TX - row lock contention
行锁
1、dml相同行
2、业务逻辑问题
3、sql执行缓慢
4、未及时提交事务
enq: TX - index contention索引分裂
大量insert导致索引分裂,一般出现在右侧索引上,比如:时间字段索引
调整pct_free
评估整改为反向键索引或hash索引
enq: US - contentionundo segment锁
1、undo空间不足
2、sql导致undo使用过于频繁
3、sql逻辑问题,未批量处理,及时释放undo
free buffer waits1、db cache不足
2、db writer 不足,导致写脏块慢
3、存储IO差,导致写脏块慢
4、延迟块清除
5、大量dml导致不停产生脏块
6、低效SQL消耗过多内存
latch free1、硬解析过多
2、未使用绑定变量/绑定变量过多
3、传参、字段类型问题导致隐式类型转换
4、version count过高,父游标无法共享
5、执行次数过多
6、共享池大小不合理
7、共享子池数量不合理
8、sga设置不合理,导致内存抖动
9、参数不合理,可增加session_cached_cursors减少软解析
latch: cache buffers chains1、SQL执行效率慢(执行计划突变,执行计划走错,执行次数过多,索引不合理等)
2、热块
3、简单sql大量buffer gets,一般是由于大事务相关CR数据被其他事务读取。
latch: undo global dataundo争用
1、undo_retention / undo_management 不合理
2、undo过小
3、sql导致undo使用频繁
4、sql逻辑问题,未批量处理,及时释放undo
library cache lock
library cache pin
1、业务繁忙期编译存储过程、函数、包等
2、业务繁忙期间DDL表/索引等
3、密码延迟验证
library cache: mutex ***1、业务繁忙期编译存储过程、函数、包等
2、业务繁忙期间DDL表/索引等
3、硬解析过多
4、未使用绑定变量/绑定变量过多
5、传参、字段类型问题导致隐式类型转换
6、version count过高,父游标无法共享
7、执行次数过多
8、共享池大小不合理
9、共享子池数量不合理
10、sga设置不合理,导致内存抖动
11、参数不合理,可增加session_cached_cursors减少软解析
log buffer space1、log buffer 不足
2、大量dml
3、存储IO性能差
4、lgwr进程优先级不够
log file switch ***1、log buffer 不足
2、大量dml
3、坏块
4、存储IO性能差
5、redolog 大小和组数量不合理
6、fra满
7、卷空间满
8、db writer不足
log file parallel write1、存储IO性能差
2、CPU处理能力不足
3、lgwr进程优先级不够
log file sync1、commit次数过多
2、存储IO性能差
3、大量dml+redolog大小和组不合理
4、log buffer不足
5、隐含参数问题:_use_adaptive_log_file_sync
6、CPU处理能力不足
7、lgwr进程优先级不够
1、建议调整参数_use_adaptive_log_file_sync设置为false
2、一般同log file parallel write进行比较,来判断是否IO硬件性能问题
PX Deq ***并行导致
1、sql文本中加入了并行
2、会话级别加入了并行
3、参数不合理:parallel_min_servers
4、表、索引开启了并行度:degree代表默认并行度:
select owner,table_name,degree from dba_tables where degree>1;
select owner,index_name,degree from dba_indexes where degree>1;
生产环境不允许使用并行
read by other session1、SQL执行计划异常(执行计划走错,索引不合理等)
2、db cache内存设置较小
和热块没有关系,因为热块不应该被刷出内存。ORACLE把它从buffer busy waits分离出来,自然是有原因的。
row cache lock1、共享池大小不合理
2、共享子池数量不合理
3、对象设置不合理。比如sequence的cache,表空间的自动扩展大小等
4、频繁大量grant
5、sga设置不合理,导致内存抖动
V$ROWCACHE
DBA_HIST_ROWCACHE_SUMMARY
<think>好的,我现在需要帮助用户解决如何通过分析Selenium脚本报错来定位问题。首先,我得回顾用户提供的引用内容,看看有哪些常见的报错情况。用户提到了三个引用,分别是关于未定义的函数、期望字符串但得到undefined,以及chromedriver路径问题。这些例子可以帮助我归纳常见的错误类型。 首先,我应该考虑错误信息的结构。Selenium的报错通常会包含异常类型和详细的消息。比如,引用[1]中的错误是WebDriverException,消息指出amsInit未定义。这说明问题可能出在JavaScript代码中,可能是函数名拼写错误或者脚本加载顺序的问题。这时候需要检查网页中的JS代码,确认amsInit是否正确定义,以及是否在调用之前已经加载。 接下来是引用[2],同样抛出WebDriverException,但消息提到期望字符串却得到了undefined。这可能是因为某个元素的属性不存在或者获取方式错误。例如,试图获取一个元素的text属性,但该元素不存在,返回了undefined。这时候需要检查元素的定位是否正确,是否存在动态加载的情况,可能需要添加等待机制。 引用[3]中的错误是chromedriver不在PATH中。这是一个典型的环境配置问题,用户可能没有正确安装chromedriver或者路径没有设置。这时候需要指导用户下载对应的驱动,并确保路径正确,或者通过代码指定路径。 接下来,我需要整理分析步骤。首先,用户需要仔细阅读错误信息,识别异常类型和关键提示。比如,未定义的变量、类型不符、路径问题等。然后,根据错误类型分类处理,比如JS执行问题、元素定位问题、环境配置问题等。对于每种类型,提供具体的检查点,如检查函数名、元素选择器、等待时间、驱动配置等。 另外,用户可能需要了解如何使用调试工具,比如浏览器的开发者工具,来检查元素和网络请求。或者如何在代码中添加日志和断点,逐步排查问题。比如,在JS执行前添加等待,确保页面加载完成;或者使用try-except块捕获异常,打印更多上下文信息。 还要考虑动态内容的问题,比如Ajax加载的数据可能导致元素未及时出现,需要显式等待。这时候可能需要使用WebDriverWait配合expected_conditions来确保元素存在再进行操作。 最后,要提醒用户常见错误和解决策略,比如驱动版本不匹配的问题,建议定期更新驱动,或者使用webdriver-manager这样的工具自动管理驱动版本。 现在需要将这些思考整理成结构化的步骤,确保用户能够一步步按照指引定位问题。同时,结合用户提供的例子,给出具体的解决建议,比如检查函数定义、添加等待时间、配置驱动路径等。还要注意使用中文,保持回答清晰易懂,符合用户的要求。</think>### 分析Selenium脚本报错的定位流程 #### 1. **解析错误信息** - **异常类型**:首先查看错误类型(如$WebDriverException$、$NoSuchElementException$),确定问题的大类。 - **错误消息**:提取关键描述(如`ReferenceError: amsInit is not defined`或`chromedriver executable needs to be in PATH`),判断是环境配置、元素定位还是脚本逻辑问题[^1][^3]。 #### 2. **分类排查问题** ##### **A. JavaScript执行错误**(如引用[1][^1]) - **检查JS函数定义**:确认网页中是否已定义报错的函数(如`amsInit`),可能因脚本加载顺序导致未定义。 - **同步与异步问题**:使用显式等待确保JS执行前页面加载完成: ```python from selenium.webdriver.support.ui import WebDriverWait WebDriverWait(driver, 10).until(lambda d: d.execute_script("return typeof amsInit === 'function'")) ``` ##### **B. 元素定位问题**(如引用[2][^2]) - **验证元素选择器**:通过开发者工具检查元素的ID、XPath或CSS选择器是否有效。 - **处理动态内容**:添加显式等待防止元素未加载: ```python from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "element_id"))) ``` ##### **C. 环境配置错误**(如引用[3]) - **检查驱动路径**:确认`chromedriver`或`geckodriver`已正确安装,并通过代码指定路径: ```python from selenium import webdriver driver = webdriver.Chrome(executable_path="/path/to/chromedriver") ``` - **版本匹配**:确保浏览器版本与驱动版本兼容。 #### 3. **调试与日志增强** - **添加断点与截图**:在关键步骤截取页面快照,辅助定位元素状态: ```python driver.save_screenshot("debug_screenshot.png") ``` - **捕获异常并输出上下文**: ```python try: element = driver.find_element_by_id("invalid_id") except Exception as e: print(f"当前URL: {driver.current_url}, 页面标题: {driver.title}") raise e ``` #### 4. **常见问题解决策略** | 错误类型 | 解决方向 | 示例操作 | |-------------------------|----------------------------|-----------------------------------| | `NoSuchElementException`| 元素未加载/选择器错误 | 使用显式等待或更新选择器 | | `WebDriverException` | JS执行失败/驱动配置错误 | 检查JS函数定义或驱动路径 | | `StaleElementReference` | 元素已过期 | 重新定位元素 | #### 5. **工具辅助** - **浏览器开发者工具**:通过`Console`标签检查JS报错,`Network`标签分析请求状态。 - **Selenium IDE**:录制操作并导出脚本,对比手动编写代码的差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值