数据库慢一般有三种情况
逐渐变慢
突然变慢
不定时变慢
第一种情况 逐渐变慢 要建立一个长期的监控机制 比如 写个shell脚本每天的忙时(通常 ~ etc )定时收集os neork db的信息 每个星期出report对收集到的信息进行分析 这些数据的积累 可以决定后期的优化决策 并且可以是DBA说服manager采用自己决策的重要数据 DBA的价值 就在每个星期的report中体现
第二种情况 突然变慢 也是最容易解决的 先从业务的角度看是DB的使用跟以前有何不同 然后做进一步判断 硬件/网络故障通常也会引起DB性能的突然下降
第一步: 察看DB/OS/NEORK的系统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 错误 以及大量的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的信息
top 命令(输出为实验室数据 仅作格式参考)
load averages: : :
processes: sleeping zombie stopped on cpu
CPU states: % idle % user % kernel % iowait % swap
Memory: M real M free M swap in use M swap free
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU MAND
a K K cpu/ : % top
mpgj M K sleep : % view_server
当时现场数据显示 iowait 值与以前相比大很多 没有异常进程
sar –d (输出为实验室数据 仅作格式参考)
SunOS sc Generic_ sun u / /
: : device %busy avque r+w/s blks/s avwait avserv
sd
sd a
sd b
sd c
sd g
当时现场数据显示 放数据文件的设备 avwait avque blks/s值偏大
第五步 察看数据库的等待事件
一个大业务量的数据库如果性能不好的话 一般来说都会有大量的等待事件 上百个等待事件很常见 我通常会按照EVENT进行group
Select count() event from v$session_wait where event not in ( on timer pmon timer rdbms ipc message SQLNet message from client ) group by event order by desc;
输出结果显示最多的等待事件是buffer busy waits
进一步分析 找出等待的原因
Select count() p p p from v$session_wait where event = buffer busy waits group by p p p ;
在buffer busy waits等待事件中
P = file#
P = block#
P = id ( 此id对应为等待的原因)
按照p p p group是为了明确buffer busy waits的等待集中在哪些对象上
Metalink对buffer busy waits等待事件的描述有如下一段话
If P shows that the buffer busy wait is waiting for a block read to plete 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 plete 进一步分析为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=P and P beeen block_id and block_id+blocks;
P P 是上面v$session_wait查出的具体的值
第六步 明确原因 找出解决步骤
分析
磁盘的IO流量增加
磁盘的IO等待增加
DB的IO流量没有增加
DB的IO等待增加
由 可以推出 有数据库以外的IO访问磁盘
察看磁盘配置 该VG只存放了数据库数据文件和数据库系统文件 排除数据文件 产生IO的是数据库系统文件
数据库系统文件一般来说不会产生IO 有IO读写的地方只有log和dump文件
结论 ora 产生的大量core dump文件堵塞IO
解决办法
消除ora (应用不改的情况下 无法解决)
把dump目录指向别的VG
让oracle尽量少的去写core dump文件
background_core_dump = partial
lishixinzhi/Article/program/Oracle/201311/18969
oracle的性能判断需要综合数据库的多个运行指标来判断:
1、进程数量和占用cpu:这个主要看有没有长时间占用cpu的进行。通常会判断大出sql,需要优化;这个可以用执行计划或者awr报告查看;
2、内存占用:主要用系统命令查看ora_占用和系统总内存的比例,swap的使用率;通常swap使用率低就没事;这个主要使用系统命令;
3、磁盘占用率:防止磁盘空间不足,需要的主要在系统和用户表空间、RMAN等 *** 作上;这个主要使用系统命令;RMAN命令查看
看你怎麼配制,
如果要把整个硬碟当swap,就不需要分区,
但是不会用到这麼多吧。。。
做为备用记忆体用个128。256G就非常非常够用了,
除非是企业级伺服器。。。
分个32G就可以了,剩下的存资料不会浪费
一、查看物理内存
执行如下命令即可查看物理内存,执行效果如下图所示:
dmidecode -t memory | grep Size
二、配置空间
物理内存是没办法配置的,只能配置虚拟内存,在Linux系统即Swap分区。具体 *** 作swap分区的方法如下:
聚集索引:对表在物理数据页中的数据排列进行排序,然后重新存储到磁盘上,表中的数据行只能以一种方式存储在磁盘上,故一个表只能有一个聚集索引。创建任何非聚集索引之前必须创建聚集索引。
非聚集索引:具有完全独立于数据行的结构,使用非聚集索引不会影响数据表中记录的实际存储顺序。
扩展资料
优点
1大大加快数据的检索速度;
2创建唯一性索引,保证数据库表中每一行数据的唯一性;
3加速表和表之间的连接;
4在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点
1索引需要占物理空间。
2当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
我们先来看第一个阶段,MySQL慢的诊断思路,一般我们会从三个方向来做:
第一个方向是MySQL内部的观测
第二个方向是外部资源的观测
第三个方向是外部需求的改造
11 MySQL 内部观测
我们来看MySQL内部的观测,常用的观测手段是这样的,从上往下看,第一部分是Processlist,看一下哪个SQL压力不太正常,第二步是explain,解释一下它的执行计划,第三步我们要做Profilling,如果这个SQL能再执行一次的话, 就做一个Profilling,然后高级的DBA会直接动用performance_schema ,MySQL 57 以后直接动用sys_schema,sys_schema是一个视图,里面有便捷的各类信息,帮助大家来诊断性能。再高级一点,我们会动用innodb_metrics进行一个对引擎的诊断。
除了这些手段以外,大家还提出了一些乱七八糟的手段,我就不列在这了,这些是常规的一个MySQL的内部的状态观测的思路。除了这些以外,MySQL还陆陆续续提供了一些暴露自己状态的方案,但是这些方案并没有在实践中形成套路,原因是学习成本比较高。
12 外部资源观测
外部资源观测这部分,我引用了一篇文章,这篇文章的二维码我贴在上面了。这篇文章是国外的一个神写的,标题是:60秒的快速巡检,我们来看一下它在60秒之内对服务器到底做了一个什么样的巡检。一共十条命令,这是前五条,我们一条一条来看。
1uptime,uptime告诉我们这个机器活了多久,以及它的平均的负载是多少。
2dmesg -T | tail,告诉我们系统日志里边有没有什么报错。
3vmstat 1,告诉我们虚拟内存的状态,页的换进换出有没有问题,swap有没有使用。
4 mpstat -P ALL,告诉我们CPU压力在各个核上是不是均匀的。
5pidstat 1,告诉我们各个进程的对资源的占用大概是什么样子。
我们来看一下后五条:
首先是iostat-xz 1,查看IO的问题,然后是free-m内存使用率,之后两个sar,按设备网卡设备的维度,看一下网络的消耗状态,以及总体看TCP的使用率和错误率是多少。最后一条命令top,看一下大概的进程和线程的问题。
这个就是对于外部资源的诊断,这十条命令揭示了应该去诊断哪些外部资源。
13 外部需求改造
第三个诊断思路是外部的需求改造,我在这里引用了一篇文档,这篇文档是MySQL的官方文档中的一章,这一章叫Examples of Common Queries,文档中介绍了常规的SQL怎么写, 给出了一些例子。文章的链接二维码在slide上。
我们来看一下它其中提到的一个例子。
它做的事情是从一个表里边去选取,这张表有三列,article、dealer、price,选取每个作者的最贵的商品列在结果集中,这是它的最原始的SQL,非常符合业务的写法,但是它是个关联子查询。
关联子查询成本是很贵的,所以上面的文档会教你快速地把它转成一个非关联子查询,大家可以看到中间的子查询和外边的查询之间是没有关联性的。
第三步,会教大家直接把子查询拿掉,然后转成这样一个SQL,这个就叫业务改造,前后三个SQL的成本都不一样,把关联子查询拆掉的成本,拆掉以后SQL会跑得非常好,但这个SQL已经不能良好表义了,只有在诊断到SQL成本比较高的情况下才建议大家使用这种方式。
为什么它能够把一个关联子查询拆掉呢?
这背后的原理是关系代数,所有的SQL都可以被表达成等价的关系代数式,关系代数式之间有等价关系,这个等价关系通过变换可以把关联子查询拆掉。
上面的这篇文档是一个大学的教材,它从头教了关于代数和SQL之间的关系。然后一步步推导怎么去简化这句SQL。
第一,MySQL本身提供了很多命令来观察MySQL自身的各类状态,大家从上往下检一般能检到SQL的问题或者服务器的问题。
第二,从服务器的角度,我们从巡检的脚本角度入手,服务器的资源就这几种,观测手法也就那么几种,我们把服务器的资源全部都观察一圈就可以了。
第三,如果实在搞不定,需求方一定要按照数据库容易接受的方式去写SQL,这个成本会下降的非常快,这个是常规的MySQL慢的诊断思路。
以上就是关于数据库变慢的情况及处理方法全部的内容,包括:数据库变慢的情况及处理方法、如何检查oracle数据库性能、linux把整个硬盘作为swap需要先分区么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)