对系统故障处理的思考

简介:
    年初去某公司面试时,对方的项目经理问如果数据库现在很慢,你该怎么办,我问慢的现象是什么,数据库是被调用的不会莫名其妙就慢了,对方说什么都没有,就是慢了,你该怎么办?我说既然是这样,那就按老办法处理了:
1. 登陆机器用topas 、svmon -G、sar 1 100、ps aux 等,查看cpu、内存、交换区、磁盘的繁忙程度,看下是否有占系统资源特别大的进程。
2. 查 v$session_event、v$session_wait 看是否有大量的 latch free、enqueue、 free buffer waits等等待事件,看下归档日志的文件系统是否满了。
3. 如有占系统资源特别大的进程,通过v$process和v$session两个视图找到 Oracle进程的sid,serial#,把它用 Alter  system kill session ‘sid,serial#’;杀掉;如果是归档日志满了,就清理日志。
4. 通过上面操作,表面现象基本会消除,下来再慢慢分析是什么原因引起的慢,是应用服务引起的、还是业务逻辑引起的、还是sql的性能引起的,找不到本质它还会慢的。
    写上面那段话,想要说明什么目的呢?其实很简单,就是想说明,任何故障都是有原因的,都是有表面现象的,说没有任何现象那是扯蛋,而且这一类的信息系统也就那么几类故障,绝对不会发生像动车追尾的事故,所以在发生故障时,观察现象是很重要的,对于一个有经验的人来说,从现象上就能基本判定是哪里的问题,
所以我们一定要提醒和引导报障人,报告故障时:
1. 要详细的说出故障的现象,说不清时就截图,图片更加一目了然。
2. 故障的时间点,通过时间点可以找到相关日志,还能了解到相关的人员在此时间做了什么操作,必定能操作系统的也就那几个人。
3. 故障的影响范围,是几个人用不了,还是很多人或者全用不了。如果影响了几个人,那肯定不是服务的问题,就不用去查服务了,直接去检查终端(有时也不能全凭经验,也要谨慎点);如果是影响范围很大,那就直接查看监控服务(如F5,每台服务的运行状态一目了然)。
4. 通过上面的几步已经基本确定故障了,下来尽快恢复系统正常运行,然后再慢慢分析故障原因。
5. 通过查找上面时间点的系统故障日志,基本会看到相关的错误信息的,如调用了那个数据库对象、返回了什么oracle的错误、写了什么java异常信息;如果没找到或者几百M的日志不好找,那只能模拟测试看故障能否再重现,一般有详细的操作步骤,故障大多能重现的。
6. 如果是Java 问题就去分析相关的jap、java文件、配置文件(或web服务的配置文件)等。
7. 如果日志记录了数据库对象的信息,那更简单,直接去test下相应的数据库对象,不是逻辑问题就是sql性能问题。
8. 修改找到的问题,形成案例集,避免类似故障下次再次发生。 
   上面提到的只是日常故障的基本处理思路,不说处理方法,很多时候思路比方法更加重要,好多时候不是我们不会处理,而是我们没有处理的思路,不知道下一步该朝那走,这样就麻烦了。
   根据多年系统的故障来看,60%都是人为造成的,40%才是系统自身产生的故障,在系统产生的故障中大部分都是业务逻辑、sql性能引起的,还有一小部分是网络、硬件引起的。sql性能方面的主要有以下:
1. 没有使用正确的索引,如语句中写的是组合索引、函数索引,但表上没有建立相应的索引,或着是没把组合索引字段放在最前面。
2. 分区表没建立本地索引,或者是建了本地索引但没有用到分区字段。
3. 多表连接时基表没有选好,或者是where条件没有明确指定各表的连接条件,或者是过滤最大数据的条件没有放在后面。
4. 使用了不必要的类型转换,特别是字符型与数值型的比较,这点很容易疏忽。
5. 对列进行了不必要的操作,包括数据库函数、计算表达式等。
   例:
   select * from record where  substrb(CardNo,1,4)='0757'   
   select * from record where  amount/30< 1000   
   select * from record where  to_char(begintime,'yyyymmdd')='20101201' 
6. 使用了 in 、not in 、exists、 not exists 等,应使用外连接outer joins 。
7. 使用了不必要的索引,应该用 +0 或 || '' 使索引失效。
8. 使用了复杂的group by分组计算条件。
9. 大数据量时,增加查询的范围限制,避免全范围的搜索。
10. 条件中用到or 、null、not null、<>、like 等操作符。
11. 中间表、临时表数据不及时truncate,历史表数据没有及时清理,索引没有定期重建等都会引起sql性能的低下。
    上面写的只是日常故障的基本处理思路和影响sql性能的一些可能点,随着系统运行的时间加长,还会有其它的问题出现,还会挖掘更多的隐患,只有那样才能触进系统更加健康良好的运行。




本文转自 149banzhang 51CTO博客,原文链接:http://blog.51cto.com/149banzhang/1007193,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
SQL 监控 网络协议
线上故障如何快速排查?来看这套技巧大全
有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器、Java应用、数据库、Redis、网络和业务六个层面分享线上故障排查的思路和技巧。较长,同学们可收藏后再看。
线上故障如何快速排查?来看这套技巧大全
|
运维 监控 数据库
线上服务故障处理原则
墨菲定律 任何事情都没有表面看起来那么简单 所有事情的发展都会比你预计的时间长 会出错的事情总会出错 如果担心某个事情发生,那么它更有可能发生 墨菲定律暗示我们,如果担心某种情况会发生,那么它更有可能发生,久而久之就一定会发生。
2070 0
|
8月前
|
Shell
系统维护
系统维护
63 1
|
6月前
|
Prometheus Cloud Native 安全
硬件故障诊断:快速定位问题
硬件故障诊断:快速定位问题
96 0
|
12月前
|
监控 容灾 安全
系统总出故障怎么办?
系统总出故障怎么办?
|
缓存 运维 监控
IT硬件故障的主要原因和预防的最佳实践
企业组织面临的超过 45% 的网络中断完全是由于硬件故障造成的,因此 24x7 全天候监控硬件至关重要
238 0
IT硬件故障的主要原因和预防的最佳实践
|
SQL 存储 NoSQL
系统性能瓶颈排查技术总结
系统性能瓶颈排查技术总结
164 0
|
运维 数据库
故障定位方法-磁盘故障定位手段
常见的磁盘故障是磁盘空间不足、磁盘出现坏块、磁盘未挂载等。 磁盘故障有的会导致文件系统损坏,比如磁盘未挂载,集群管理自动定期做磁盘检测时会识别故障并将实例停止,查看集群状态时对应实例状态异常;有的不会导致文件系统损坏,比如磁盘空间不足,集群管理无法检测到,服务进程访问到故障磁盘会异常退出,比如:数据库无法启动、checksum校验不对、页面读写失败、页面校验错误等。 对于会导致文件系统损坏的故障,查看集群状态会显示对应实例状态持续为Unknown,定位方法如下: 查看cm_agent日志,日志保存在mpp/omm/cm/cm_agent,日志中会有类似“data path disc wri
329 0
|
缓存 人工智能 运维