数据库正常运行,突然变慢的解决思路:

1、查看数据库版本(select * from v$version)

2、查看操作系统的进程(top,ps -ef)

3、查看操作系统的IO情况(sar 1 10)

4、制作awr报表,查看报告

在报告中 :

EventWaits%Time -outsTotal Wait Time (s)Avg wait (ms)Waits /txn

control file parallel write

500

0.00

11

23

10.42

log file parallel write

107

0.00

1

8

2.23

log file sync

45

0.00

0

8

0.94

db file sequential read

182

0.00

0

2

3.79

SQL*Net break/reset to client

6

0.00

0

17

0.13

os thread startup

1

0.00

0

28

0.02

db file scattered read

5

0.00

0

2

0.10

SQL*Net more data from client

39

0.00

0

0

0.81

control file sequential read

1,142

0.00

0

0

23.79

SQL*Net message to client

7,743

0.00

0

0

161.31

SQL*Net more data to client

346

0.00

0

0

7.21

latch: shared pool

1

0.00

0

1

0.02

LGWR wait for redo copy

20

0.00

0

0

0.42

direct path read

89

0.00

0

0

1.85

rdbms ipc reply

3

0.00

0

0

0.06

direct path write

12

0.00

0

0

0.25

SQL*Net message from client

7,739

0.00

17,212

2224

161.23

Streams AQ: qmn slave idle wait

54

0.00

1,475

27322

1.13

Streams AQ: qmn coordinator idle wait

109

50.46

1,475

13536

2.27

virtual circuit status

50

100.00

1,458

29156

1.04

Streams AQ: waiting for time management or cleanup tasks

1

100.00

77

76683

0.02

jobq slave wait

20

100.00

59

2931

0.42

客户端连接时间都是很长,很可以。我就是问下服务器管理员,此服务器的网络是否和平时网络一致。

服务器管理员和我说这台服务器是远程连接。远程连接稍有延迟很正常。所以我做出了合理解释。

通过这个问题解决,感觉自己在这方面很欠缺,所以在网上找了些资料。

以下是转载资料:

数据库慢一般有三种情况

1。逐渐变慢

2。突然变慢

3。不定时变慢

第一种情况 “逐渐变慢”,要建立一个长期的监控机制。比如,写个shell脚本每天的忙时(通常9~10

etc.)定时收集os,network,db的信息,

每个星期出report对收集到的信息进行分析。这些数据的积累,可以决定后期的优化决策,并且可以是DBA说服manager采用自己决策的重要数据。DBA的价值,就在每个星期的report中体现。

第二种情况 “突然变慢”,也是最容易解决的。先从业务的角度看是DB的使用跟以前有何不同,然后做进一步判断。硬件/网络故障通常也会引起DB性能的突然下降。

第一步: 察看DB/OS/NETWORK的系统log, 排除硬件/网络问题

第二步:察看数据库的等待事件,根据等待事件来判断可能出问题的环节。如果, 没有等待事件, 可以排除数据库的问题. 如果有等待时间, 根据不同的等待事件, 来找引起这些事件的根源.

比如latch free等跟SQL parse有关系的等待事件,OS的表现是CPU 的占用率高

db file scattered read等跟SQL disk read有关系的等待时间, OS的表现是iostat可以看到磁盘读写量增加

第三步: 察看os的信息, CPU/IO/MEMORY等.

a. Cpu 的占用率

CPU占用率与数据库性能不成反比. CPU占用率高, 不能说明数据库性能慢. 通常情况, 一个优化很好, 而且业务量确实很大的数据库,

CPU的占用率都会高, 而且会平均分布在每个进程上. 反过来, CPU的占用率都会高也不代表数据库性能就好,

要结合数据库的等待事件来判断CPU占用率高是否合理.

如果某个进程的cpu占用高, 肯定是这个进程有问题. 如果,不是oracle的进程,

可以让application察看是否程序有死循环等漏洞. 如果,是oracle的进程,

可以根据pid查找oracle数据字典看看这个进程的发起程序, 正在执行的sql语句, 以及等待事件. 然后, 不同情况使用不同的方法来解决.

b. IO

排除硬件的IO问题, 数据库突然变慢, 一般来说, 都是一个或几个SQL语句引起的.

如果IO很频繁, 可以通过优化disk reads高的TOP SQL来解决. 当然这也是解决IO问题的最笨也是最有效的办法.

OS以及存储的配置也是影响IO的一个重要的原因.

比如, 最常见的HP-unix下异步IO的问题, 如果DBA GROUP没有MLOCK的权限, ORACLE是不使用AIO的. 偏偏OS与DB的两方的admin如果配合不够好地话, 这个配置就很容易给漏掉了.

c. Memory

第二种情况与memory的关系比较小, 只要SGA区配置合理没有变化, 一般来说, 只要不是Application Memory leak, 不会引起突然变慢的现象.

第三种情况 “不定时变慢”, 是最难解决的. 现场出现的问题原因也是五花八门千奇百怪, 最重要的是, 出现慢的现象时, 以最快的速度抓取到最多的信息以供分析. 先写好抓取数据的shell 脚本, 并在现象发生时及时按下回车键

一个例子

数据库突然变慢

背景: 一个新应用上线后, 数据库突然变慢

第一步, 调查新应用

据开发人员讲新应用访问的都是新建立的表, 表的数据量很小, 没有复杂的SQL查询.

查询 v$sqlarea 分别按照disk_reads / buffer_gets / executions 排序, TOP SQL 中没有新应用的SQL. 排除新应用数据库访问照成的性能问题.

第二步, 察看数据库log/ OS log

数据库log中可以看到大量的ORA-7445错误, 以及大量的dump文件. 分析dump文件(时间久了,没有dump文件可参考,

具体细节没法描述下来. ), 发现是新应用通过dblink访问remote DB时生成的dump文件, 应用开发人说没法修改,

Oracle也没有相应的patch解决.

OS log中没有错误信息

第三步, 察看statspack report

从wait events中看到,Top event是“buffer busy waits” “db file parallel write” 等于IO相关的等待事件.

从buffer busy waits 的统计信息来看, 是等待data block.

还有些physical reads等信息与从前比没有太多的异常.

Tablespace 的IO reads/writes也没有异常, 但是wait明显增加.

初步确定是IO问题.

第四步, 察看OS的信息

1. top 命令(输出为实验室数据,仅作格式参考)

load averages: 0.05, 0.10, 0.09 10:18:32

307 processes: 304 sleeping, 1 zombie, 1 stopped, 1 on cpu

CPU states: 96.0% idle, 0.3% user, 2.6% kernel, 1.1% iowait, 0.0% swap

Memory: 4096M real, 2660M free, 1396M swap in use, 3013M swap free

PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND

11928 a21562 1 0 0 3008K 2496K cpu/1 0:02 1.12% top

14965 mpgj76 4 59 0 10M 3696K sleep 3:09 0.18% view_server

当时现场数据显示:iowait 值与以前相比大很多, 没有异常进程

2. sar –d(输出为实验室数据,仅作格式参考)

SunOS sc19 5.7 Generic_106541-42 sun4u 03/20/08

00:00:00 device %busy avque r+w/s blks/s avwait avserv

sd410 17 0.4 50 1628 0.1 7.1

sd410,a 0 0.0 0 0 0.0 0.0

sd410,b 0 0.0 0 0 0.0 0.0

sd410,c 0 0.0 0 0 0.0 0.0

sd410,g 17 0.4 50 1628 0.1 7.1

当时现场数据显示,放数据文件的设备 avwait, avque, blks/s值偏大

第五步, 察看数据库的等待事件

一个大业务量的数据库如果性能不好的话, 一般来说都会有大量的等待事件, 上百个等待事件很常见, 我通常会按照EVENT进行group.

Select count(*), event from v$session_wait where event not in ('smon

timer','pmon timer','rdbms ipc message','SQL*Net message from client')

group by event order by 1 desc;

输出结果显示最多的等待事件是buffer busy waits。

进一步分析,找出等待的原因

Select count(*), p1, p2, p3 from v$session_wait where event = ‘buffer busy waits’ group by p1,p2,p3;

在buffer busy waits等待事件中

P1 = file#

P2 = block#

P3 = id ( 此id对应为等待的原因)

按照p1,p2,p3 group是为了明确buffer busy waits的等待集中在哪些对象上。

Metalink对buffer busy waits等待事件的描述有如下一段话:

“If P3 shows that the "buffer busy wait" is waiting for a block read

to complete then the blocking session is likely to be waiting on an IO

wait (eg: "db file sequential read" or "db file scattered read" for the

same file# and block#.”

输出结果显示,等待分布在多个不同的对象上,等待原因为 “waiting for a block read to complete”,进一步分析为IO的问题。

如果,buffer busy waits等待集中在某个对象上,说明有hot block, 通过重新rebuild这个对象增加freelist来解决,RAC环境增加freelist group.

通过以下SQL可以找到具体的object.

Select owner, segment_name, segment_type from dba_extents where file_id=P1 and P2 between block_id and block_id+blocks;

P1,P2是上面v$session_wait查出的具体的值

第六步, 明确原因,找出解决步骤

分析:

1。磁盘的IO流量增加

2。磁盘的IO等待增加

3。DB的IO流量没有增加

4。DB的IO等待增加

由1,2,3,4可以推出,有数据库以外的IO访问磁盘。

察看磁盘配置,该VG只存放了数据库数据文件和数据库系统文件。排除数据文件,产生IO的是数据库系统文件。

数据库系统文件一般来说不会产生IO, 有IO读写的地方只有log和dump文件。

结论:ora-7445产生的大量core dump文件堵塞IO

解决办法:

1,消除ora-7445. (应用不改的情况下,无法解决)

2, 把dump目录指向别的VG

3, 让oracle尽量少的去写core dump文件

background_core_dump = partial

shadow_core_dump = partial

mysql数据库突然变慢_数据库正常运行,突然变慢的解决思路相关推荐

  1. mysql隔离级别 简书_数据库事务和四种隔离级别

    什么是事务 事务(Transaction):访问并可能更新数据库中各种数据项的一个程序执行单元(unit),它通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起 ...

  2. mysql数据库存储多语言_数据库---数据控制语言(DCL)

    mysql中,权限是系统内定的一些"名词"(单词),大约30个,每个权限表示"可以做什么工作". 则分配权限就是相当于让某个用户可以做哪些工作. 主要权限如下: ...

  3. mysql实验四图书视图_[数据库实验四.doc

    [数据库实验四 计算机与信息学院实验报告 系: 专业: 年级: 姓名: 学号: 22 实验室号 计算机号 22 实验时间: 2013年10月29日 指导教师签字: 成绩: 报告退发 (订正 . 重做) ...

  4. mysql基础小测试三_数据库---MySQL(三)

    一.视图 视图是一个虚拟表,是sql的查询结果,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成.视图的数据变化会影响到基表,基表的数据变化也会影响到视图[i ...

  5. mysql数据库什么是事件_[数据库]Mysql 事件(定时任务)

    [数据库]Mysql 事件(定时任务) 0 2016-04-25 18:00:28 mysql 创建任务(事件) 1.检查数据库事件是否开启,如果 event_scheduler 等于 NO表示开启 ...

  6. mysql开发是做什么_数据库开发是做什么东西的

    展开全部 数据库开发工程师(Database Developer)是从事数据库管理系统62616964757a686964616fe58685e5aeb931333365663565(DBMS)和数据 ...

  7. mysql视图改造实体表_数据库视图改了对基表

    数据库必知词汇:数据库视图 视图是从一个或几个基本表(或视图)中导出的虚拟的表.在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据.视图与表(有时为与视图区别,也称表为基本表--Base Ta ...

  8. mysql数据库水平拆分例子_数据库水平拆分

    数据库拆分 垂直拆分 数据库垂直拆分就是要把表按模块划分到不同数据库中.微服务架构中每个服务拥有自己独立的数据库,就是典型的垂直拆分.通俗说,就是根据业务类型,把一个数据库中的多张表拆分到多个数据库中 ...

  9. mysql from多表顺序_数据库 from 表的顺序

    MY SQL语句常用集合 1个数据库通常包含一个或多个表.每个表由一个名字标识 1.SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数 ...

最新文章

  1. 改善FLEX/FLASH性能的小技巧(转)
  2. Dividing the numbers CodeForces - 899C (构造)
  3. 在FAANG面试中破解堆算法
  4. Leetcode - 143. Reorder List
  5. 【Go】优雅的读取http请求或响应的数据-续
  6. 【乐道珠玑】第一期 —— 信息学竞赛简介
  7. c语言数据域和指针域,C语言的变量域和指针
  8. 2022年自考专业(工商企业管理)电子商务概论练习题
  9. 模型预测控制matlab工具箱,MATLAB模型预测控制工具箱函数..
  10. 信号与系统学习笔记与代码实现3-周期信号的傅里叶级数表示
  11. 计算机图形学八大行星程序,计算机图形学模拟太阳系源代码
  12. AttributeError: module 'torch.nn' has no attribute 'LocalResponseNorm'问题的解决办法
  13. 学习经验分享 | 目录一览表
  14. pip安装librosa或audioread长时间无响应
  15. 中国AI企业不惧美国封杀 百度华为用一张图给你答案!
  16. 线性代数让我想想:什么是秩?
  17. Struts2 漏洞信息汇总
  18. 更改版dos命令的使用
  19. git-hub的使用---多人协同
  20. Udesk Android IM SDK 入门

热门文章

  1. java用减号分割地址与参数_//与/与\与\\
  2. 金蝶EAS,分录表格中必录项设置背景颜色
  3. App Data Lab——计算机系统实验lab2
  4. 个人创业指导之知乎的好物推荐项目
  5. 【数据处理方法】主成分分析(PCA)原理分析
  6. Maya2012中英文对照表(二)
  7. glLoadIdentity()与glTranslatef()和glRotatef()--坐标变换
  8. 数字图像处理实验(三)|图像增强{归一化直方图imhist(f)/numel(f)、直方图均衡化histeq、生成线性空间滤波fspecial、中值滤波medfilt2}(附matlab实验代码截图)
  9. 涉嫌向朴槿惠闺蜜行贿 三星战略规划部主管遭调查
  10. postgresql后台查询删除与垃圾清理