`

数据库突然变慢,怎么办?

阅读更多

第一章 检查系统的状态

1.1 使用sar来检查操作系统是否存在IO问题

1.2 关注内存vmstat

1.3 找到使用资源特别大的Oracle的session及其执行的语句

1.4 查找前十条性能差的sql语句


第二章 检查会话状态


当数据库变慢时,我们应如何入手


当应用管理员通告现在应用很慢、数据库很慢时,当Oracle DBA在数据库上做几个示例的Select也发现同样的问题时,有些时侯就会无从下手,因为DBA认为数据库的各种命种率都是满足Oracle文档的建议。实际上如今的优化己经向优化等待(waits)转型了,实际中性能优化最根本的出现点也都集中在I/O,这是影响性能最主要的方面,由系统中的等待去发现Oracle库中的不足、操作系统某些资源利用的不合理是一个比较好的办法。下面把一些实践经验与大家分享,本文测重于Unix环境。


第一章 检查系统的状态

通过操作系统的一些工具检查系统的状态,比如CPU、内存、交换、磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状态,因为cpu可能正等待IO的完成。除此之外,还应观注那些占用系统资源(cpu、内存)的进程。


1.1 使用sar来检查操作系统是否存在IO问题

#sar -u 2 10 -- 即每隔2秒检察一次,共执行20次。

结果示例:

注:在redhat下,%system就是所谓的%wio。

Linux 2.4.21-20.ELsmp (YY075) 05/19/2005

10:36:07 AM CPU %user %nice %system %idle

10:36:09 AM all 0.00 0.00 0.13 99.87

10:36:11 AM all 0.00 0.00 0.00 100.00

10:36:13 AM all 0.25 0.00 0.25 99.49

10:36:15 AM all 0.13 0.00 0.13 99.75

10:36:17 AM all 0.00 0.00 0.00 100.00

其中:

Ø %usr指的是用户进程使用的cpu资源的百分比;

Ø %sys指的是系统资源使用cpu资源的百分比;

Ø %wio指的是等待io完成的百分比,这是值得观注的一项;

Ø %idle即空闲的百分比。

如果wio列的值很大,如在35%以上,说明系统的IO存在瓶颈,CPU花费了很大的时间去等待I/O的完成。Idle很小说明系统CPU很忙。像以上的示例,可以看到wio平均值为11,说明I/O没什么特别的问题,而idle值为零,说明cpu已经满负荷运行了。

当系统存在IO问题时,可以从以下几个方面解决:

Ø 联系相应的操作系统的技术支持对这方面进行优化,比如hp-ux在划定卷组时的条带化等方面。

Ø 查找Oracle中不合理的sql语句,对其进行优化;

Ø 对Oracle中访问量频繁的表除合理建索引外,再就是把这些表分表空间存放以免访问上产生热点,再有就是对表合理分区。


1.2 关注内存

常用的工具便是vmstat,对于hp-unix来说,可以用glance。Aix来说可以用topas。当发现vmstat中pi列非零,memory中的free列的值很小,glance、topas中内存的利用率多于80%时,这时说明内存方面应该调节一下。方法大体有以下几项:

Ø 划给Oracle使用的内存不要超过系统内存的1/2,一般保在系统内存的40%为益。

Ø 为系统增加内存;

Ø 如果你的连接特别多,可以使用MTS的方式;

Ø 打全补丁,防止内存漏洞。


1.3 找到使用资源特别大的Oracle的session及其执行的语句

Hp-unix可以用glance或top。IBM AIX可以用topas。此外可以使用ps的命令。

通过这些程序可以找到点用系统资源特别大的这些进程的进程号,就可以通过以下的sql语句发现这个pid正在执行哪个sql,这个sql最好在pl/sql developer、toad等软件中执行:

SELECT a.username, a.machine, a.program, a.sid, a.serial#, a.status,

c.piece, c.sql_text

FROM v$session a, v$process b, v$sqltext c

WHERE b.spid = 'ORCL'

AND b.addr = a.paddr

AND a.sql_address = c.address(+)

ORDER BY c.piece;

可以把得到的这个sql分析一下,看一下它的执行计划是否走索引。对其优化避免全表扫描,以减少IO等待,从而加快语句的执行速度。

提示:在做优化sql时,经常碰到使用in的语句,这时一定要用exists把它给换掉,因为Oracle在处理In时是按Or的方式做的,即使使用了索引也会很慢。比如:

SELECT col1, col2, col3 FROM table1 a

WHERE a.col1 NOT IN (SELECT col1 FROM table2)


可以换成:

SELECT col1, col2, col3 FROM table1 a

WHERE NOT EXISTS

(SELECT 'x' FROM table2 b WHERE a.col1=b.col1)


1.4 查找前十条性能差的sql语句

SELECT * FROM (SELECT parsing_user_id, executions, sorts, command_type,

disk_reads, sql_text FROM v$sqlarea

ORDER BY disk_reads DESC)

WHERE ROWNUM<10;

第二章 检查会话状态

要快速发现Oracle Server的性能问题的原因,可以求助于v$session_wait视图,看系统的这些session在等什么,使用了多少的IO。以下是参考脚本:

-- 脚本说明:查看占I/O较大的正在运行的session:

SELECT se.sid, se.serial#, pr.spid, se.username, se.status, se.terminal,

se.program, se.module, se.sql_address, st.event, st.p1text,

si.physical_reads, si.block_changes

FROM v$session se, v$session_wait st, v$sess_io si, v$process pr

WHERE st.sid=se.sid AND st.sid=si.sid

AND se.PADDR=pr.ADDR

AND se.sid>6

AND st.wait_time=0

AND st.event NOT LIKE '%SQL%'

ORDER BY physical_reads DESC;


对检索出的结果的几点说明:

1. 以上是按每个正在等待的session已经发生的物理读排的序,因为它与实际的I/O相关。

2. 可以看一下这些等待的进程都在忙什么,语句是否合理?

      SELECT sql_address FROM v$session WHERE sid=;

      SELECT * FROM v$sqltext WHERE address=;

执行以上两个语句便可以得到这个session的语句。

也以用alter system kill session 'sid, serial#';把这个session杀掉。

3. 应观注一下event列,这是调优的关键一列,下面对常出现的event做以简要的说明:

1) buffer busy waits,free buffer waits这两个参数所标识是dbwr是否够用的问题,与IO很大相关的,当v$session_wait中的free buffer wait的条目很小或没有时,说明系统的dbwr进程决对够用,不用调整;free buffer wait的条目很多,系统感觉起来一定很慢,这时说明dbwr已经不够用了,它产生的wio已经成为数据库性能的瓶颈,这时的解决办法如下:

Ø 增加写进程,同时要调整db_block_lru_latches参数:

示例:修改或添加如下两个参数

db_writer_processes=4

db_block_lru_latches=8

Ø 开异步IO。IBM这方面简单得多,hp则麻烦一些,可以与Hp工程师联系。

2) db file sequential read,指的是顺序读,即全表扫描,这也是应尽量减少的部分,解决方法就是使用索引、sql调优,同时可以增大db_file_multiblock_read_count这个参数。

3) db file scattered read参数指的是通过索引来读取,同样可以通过增加db_file_multiblock_read_count这个参数来提高性能。

4) latch free与栓相关,需要专门调节。

5) 其他参数可以不特别观注。


转载:http://tolywang.itpub.net/post/48/473891


分享到:
评论

相关推荐

    Linux mysql访问慢

    Navicat 是一个流行的数据库管理工具,但是在 Linux 上访问 MySQL 数据库时,可能会出现访问慢的情况。同时,使用 ping 工具测试网络连接也很快,排除了网络连接问题。 解决方案 解决 Linux 上 MySQL 访问慢的问题...

    解决redmine局域网内访问速度过慢的问题

    在局域网内访问速度过慢可能由多种原因引起,包括网络配置、服务器性能、数据库效率、缓存策略等。 在解决问题前,我们需要了解一些基本概念: 1. **网络延迟**:局域网内的通信理应快速,但高延迟可能是由于网络...

    Sybase数据库宕机处理步骤

    然而,如果表有索引或触发器,BCP会变得较慢。 生成BCP命令文件的步骤如下: 1. 创建一个名为`select.sql`的文本文件。 2. 输入SQL语句,如:`set nocount on; use pubs2; go; select "bcp pubs2.." + name + " out...

    银行数据库智能运维平台建设方案.pdf

    3. 异常检测算法:采用统计学和模式识别技术,自动检测数据库的异常行为,如突然的性能下降或不正常的访问模式,及时发出警报。 4. 指标关系模型:建立数据库各项指标之间的关联模型,帮助理解不同参数之间的相互...

    造成mdf文件过大的原因

    如果索引碎片严重,那扫描索引的时间就会变长,甚至导致索引不可用,因此数据检索操作就慢下来了。有两种类型的索引碎片:内部碎片和外部碎片。内部碎片是由于内存分页,内存以页为单位来使用,最后一页往往装不满,...

    sql server专家云,Database智能可视化管理软件,适合sql sever 数据库使用always on功能的客户

    SQL Server专家云具备智能分析功能,能够自动识别和定位问题,比如系统突然变慢的原因、不定期的业务超时情况等,帮助运维人员迅速定位并解决问题,减少对夜班人员的影响。同时,它还能对系统进行深度体检,涵盖六大...

    监控mongo状态慢查询

    如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。它的输出有以下几列:类似于MySQL的slowlog,MongoDB可以监控所有慢的以及不慢的查询。Profiler默认是关闭的,你...

    DBLINK 无统计信息导致SQL变慢

    在这个特定的问题中,SQL查询变慢的原因是由于DBLINK缺乏相应的统计信息,这直接影响了Oracle优化器对执行计划的选择。 在描述中提到的SQL查询是一个简单的联接操作,它将`EFB_USER_MOVE@WODBLINK`表与`T_PAY_...

    win2008 R2与sql 2005、2008运行asp的时候速度缓慢的解决方法

    在以SQL Server 2005数据库为后台的ASP网站访问速度慢,情况如下:一个服务器上的两个ASP网站,一个访问很快,一个很慢。 原因排查的思路与步骤: 首先在我电脑上依次打开这两个网站,一个两三秒就打开了,另一个...

    Oracle透明网关跨库查询SQLServer.docx

    比如,在一个系统中可能同时使用Oracle和SQLServer作为数据存储,这就需要一种机制来实现这两个不同类型的数据库之间的数据交换。Oracle透明网关(Oracle GoldenGate Transparent Gateway)就是一种能够实现这种需求...

    ETL应用浅析

    - **DW (Data Warehouse)**: 数据仓库,是一种用于决策支持的数据库系统。它具有面向主题、集成、稳定以及随时间变化的特点。 - **元数据 (Metadata)**: 描述数据的数据,主要包括数据源定义、目标定义、转换规则等...

    土地利用现状问题解决

    为何系统运行速度突然变慢? 系统运行速度变慢可能是因为未安装最新的MAPGIS 6.7平台。确保安装了最新版本的平台软件,并且没有运行冲突的服务程序。 #### 21. 为何显示模式也出现问题? 当遇到显示模式出现问题...

    细化解析oracle 10g statspack

    这种改进后的统计方式特别适用于那些需要快速识别性能问题根源的场景,尤其是当数据库响应时间突然变慢时,等待事件柱状图可以帮助快速定位问题所在。 #### 读取文件柱状图 读取文件柱状图是对磁盘I/O性能监测的一...

    POLARDB DBA性能优化最佳实践.pptx

    在SQL执行速度突然变慢或同一SQL在不同主机上表现不一致的情况中,性能洞察也能通过选择时间范围和观察不同维度,有效地帮助DBA找到问题并解决。 通过使用性能洞察,内部和外部客户已经看到了显著的优化成果。例如...

    12.为什么我的MySQL会“抖”一下?1

    MySQL数据库在运行过程中可能会出现“抖动”现象,即某些SQL语句的执行突然变得非常慢,随后又迅速恢复。这种现象通常是由于数据库在后台进行的一些磁盘刷新操作导致的,尤其是脏页的flush(写回)过程。脏页是指...

    2、容量与基线-徐戟1

    当系统出现异常,如描述中提到的"系统变慢",DBA会先观察到的现象,例如CPU使用率突然升高,从平常的40%上升到100%,并持续较长时间。这种情况下,DBA会尝试寻找类似故障的案例,通过网络搜索或向同行询问来获取解决...

    oracle 笔试题

    解决Linux上的Oracle数据库系统突然变慢的问题 当遇到Oracle数据库性能下降时,可以从以下几个方面入手排查: 1. **监控工具**:使用AWR报告、ASH报告等工具分析性能瓶颈。 2. **资源限制**:检查CPU、内存、I/O...

Global site tag (gtag.js) - Google Analytics