当数据库变慢时的解决方法都有哪些

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当数据库变慢时的解决方法都有哪些相关的知识,希望对你有一定的参考价值。

参考技术A

  我们使用电脑和手机时候最不能忍受就是设备又卡又慢了,严重影响我们工作或者游戏体验。当数据库变慢时,我们应如何入手,下面的解决方法。

  方法步骤

  第一章 检查系统的状态

  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) 其他参数可以不特别观注

  补充:解决系统变慢的常用技巧方法

  1、在我的电脑窗口,右击要清理的盘符―“属性”―“清理磁盘”--勾选要删除的文件--确定--是。

  2、右键浏览器e――属性――点2个删除1个清除(都要逐一确定)――确定 。

  3、把C:\\WINDOWS\\Prefetch(预读文件)把里面的文件全部删除

  4、用优化大师或超级兔子清理注册表和垃圾文件。

  5、“开始”――运行中输入msconfig――确定――启动――除了输入法ctfmon以外的勾全去掉。

  6、右键我的电脑”――属性――点高级――点启动和故障恢复中的设置――去掉所有的勾――写入调试信息选择“无”――确定――点高级下面错误报告――点禁用――2次确定。

  7、“开始”..打开控制面板中的文件夹选项..点查看..点去末项自动搜索文件夹前面的勾..确定。

  8、右键我的电脑――属性――硬件――设备管理器――双击IDE控制器――次要通道――高级设置――传送模式都选DMA――设备类型选无――确定――主要通道也同样设置――确定。

  9、右键C盘进行磁盘清理和其它选项中的系统还原清理。

Oracle数据库锁的常用类型都有哪些

参考技术A

  此文章主要是对Oracle数据库锁机制的详细研究 首先我们要介绍的是Oracle数据库锁的类型 同时也阐述 在实际应用中我们经常会遇到的与锁相关的异常情况 特别对经常遇到的由于等待锁而使事务被挂起的问题进行了定位及解决 并对死锁这一比较严重的现象 提出了相应的解决方法和具体的分析过程

  数据库是一个多用户使用的共享资源 当多个用户并发地存取数据时 在数据库中就会产生多个事务同时存取同一数据的情况 若对并发操作不加控制就可能会读取和存储不正确的数据 破坏数据库的一致性

  加锁是实现数据库并发控制的一个非常重要的技术 当事务在对某个数据对象进行操作前 先向系统发出请求 对其加锁 加锁后事务就对该数据对象有了一定的控制 在该事务释放锁之前 其他的事务不能对此数据对象进行更新操作

  在数据库中有两种基本的锁类型 排它锁(Exclusive Locks 即X锁)和共享锁(Share Locks 即S锁) 当数据对象被加上排它锁时 其他的事务不能对它读取和修改 加了共享锁的数据对象可以被其他事务读取 但不能修改 数据库利用这两种基本的锁类型来对Oracle数据库的事务进行并发控制

  在实际应用中经常会遇到的与锁相关的异常情况 如由于等待锁事务被挂起 死锁等现象 如果不能及时地解决 将严重影响应用的正常执行 而目前对于该类问题的解决缺乏系统化研究和指导 本文在总结实际经验的基础上 提出了相应的解决方法和具体的分析过程

   Oracle数据库的锁类型

  根据保护的对象不同 Oracle数据库锁可以分为以下几大类 DML锁(data locks 数据锁) 用于保护数据的完整性 DDL锁(dictionary locks 字典锁) 用于保护数据库对象的结构 如表 索引等的结构定义 内部锁和闩(internal locks and latches) 保护数据库的内部结构

  DML锁的目的在于保证并 *** 况下的数据完整性 本文主要讨论DML锁 在Oracle数据库中 DML锁主要包括TM锁和TX锁 其中TM锁称为表级锁 TX锁称为事务锁或行级锁

  当Oracle执行DML语句时 系统自动在所要操作的表上申请TM类型的锁 当TM锁获得后 系统再自动申请TX类型的锁 并将实际锁定的数据行的锁标志位进行置位 这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志 而只需检查TM锁模式的相容性即可 大大提高了系统的效率

  TM锁包括了SS SX S X等多种模式 在Oracle数据库中用 - 来表示 不同的SQL操作产生不同类型的TM锁 如表 所示

  在数据行上只有X锁(排他锁) 在 Oracle数据库中 当一个事务首次发起一个DML语句时就获得一个TX锁 该锁保持到事务被提交或回滚 当两个或多个会话在表的同一条记录上执行DML语句时 第一个会话在该条记录上加锁 其他的会话处于等待状态 当第一个会话提交后 TX锁被释放 其他会话才可以加锁

  当Oracle数据库发生TX锁等待时 如果不及时处理常常会引起Oracle数据库挂起 或导致死锁的发生 产生ORA 的错误 这些现象都会对实际应用产生极大的危害 如长时间未响应 大量事务失败等

   TX锁等待的分析

  在介绍了有关地Oracle数据库锁的种类后 下面讨论如何有效地监控和解决锁等待现象 及在产生死锁时如何定位死锁的原因

  监控锁的相关视图 数据字典是Oracle数据库的重要组成部分 用户可以通过查询数据字典视图来获得数据库的信息 和锁相关的数据字典视图如表 所示

  TX锁等待的监控和解决在日常工作中 如果发现在执行某条SQL时数据库长时间没有响应 很可能是产生了TX锁等待的现象 为解决这个问题 首先应该找出持锁的事务 然后再进行相关的处理 如提交事务或强行中断事务

  死锁的监控和解决在数据库中 当两个或多个会话请求同一个资源时会产生死锁的现象 死锁的常见类型是行级锁死锁和页级锁死锁 Oracle数据库中一般使用行级锁 下面主要讨论行级锁的死锁现象

  当Oracle检测到死锁产生时 中断并回滚死锁相关语句的执行 报ORA 的错误并记录在Oracle数据库的日志文件alertSID log中 同时在user_dump_dest下产生了一个跟踪文件 详细描述死锁的相关信息

  在日常工作中 如果发现在日志文件中记录了ora 的错误信息 则表明产生了死锁 这时需要找到对应的跟踪文件 根据跟踪文件的信息定位产生的原因

  如果查询结果表明 死锁是由于bitmap索引引起的 将IND_T_PRODUCT_HIS_STATE索引改为normal索引后 即可解决死锁的问题

   表 Oracle的TM锁类型

  锁模式 锁描述 解释 SQL操作

   none

   NULL 空 Select

   SS(Row S) 行级共享锁 其他对象只能查询这些数据行 Select for update Lock for update Lock row share

   SX(Row X) 行级排它锁 在提交前不允许做DML操作 Insert Update Delete Lock row share

   S(Share) 共享锁 Create index Lock share

   SSX(S/Row X) 共享行级排它锁 Lock share row exclusive

lishixinzhi/Article/program/Oracle/201311/18509

以上是关于当数据库变慢时的解决方法都有哪些的主要内容,如果未能解决你的问题,请参考以下文章

局域网ARP攻击检测方法都有哪些

Excel公式错误代码#NUM的解决方法都有哪些

当mysql报错1045时的解决方法

解决anaconda下载时的超时问题

处理 Mozilla Firefox 中的“可见性:折叠”错误都有哪些好的解决方法?

ssd固态硬盘速度变慢怎么办解决方法