mysql常见故障汇总和处理

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: mysql常见故障汇总和处理

性能故障

1. 数据库主机LOAD飙高
(1)一般情况下导致MySQL服务器LOAD突然飙高,可能的五种情况如下:

– 全表扫描的SQL语句;
– SELECT操作语句的执行计划走错;
– 存在UPDATE/DELETE 语句没有索引可选择,而导致堵塞其他SQL语句的执行;
– 存在修改表结构或OPTIMIZE 语句执行;
– 大数据量的导入或导出,尤其数据库的逻辑备份操作;
– 业务量大到超过服务器处理能力(我们大家都高度关注业务发展,以及公司业务特点,
– 还有与开发和运营保持良好联系,很难出现未知的业务突然爆发性增长);

(2)要解决LOAD飙高,必须先找到造成飙高的真实原因,请登陆数据库服务器后,执行如下命令:

SHOW PROCESSLIST;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND <> ‘sleep’ AND TIME>100;

(3)若一直处在执行状态,且执行时间比较久,可以分析下SQL语句执行计划:

mysql>EXPLAIN SQL语句

(4)检查io请求状态
使用Linux命令iostat查看r/s(读请求),w/s(写请求),avgrq-sz(平均请求大小),await(IO等待),,svctm(IO响应时间),若执行计划不合理,则可以根据SQL类型选择是否与应用负责人联系。首先,查找造成服务器LOAD飙高的PID,特别是DELETE 或UPDATE等会堵住其他SQL语句的PID,然后进入MySQL命令行工具中,对一些SQL先记录下来,再适情考虑执行:KILL SQL PID

2. 请求处理波动,应用大量请求超时失败
(1)检查数据库的响应状态,使用tcprstat

tcprstat -l $ip_addr -t $interval -n $count

按照汇报结果,切分是否为数据库端问题还是非数据库端问题.

(2)分析关键指标

com_select/insert/update/delete
innodb_rows_read/update/delete/insert
innodb_logicial_read/physical read

使用SHOW STATUS和 orzdba -com 可以获取采样指标

(3)转向分析slow query, 检查可疑SQL

EXPLAIN SQL语句;

如有长时间运行异常SQL, 可以Kill SQL PID.

(4)重点关注索引的使用问题

复制故障

1. 复制中断

(1)备机无法连接到主服务器,可能是网络问题,也可能是主服务器的mysqld已停止;
(2)主键冲突;
(3)主从服务器数据不一致;
(4)其他原因;

为使复制继续,我们可以进行如下处理:

    (1)stop slave ;
    (2)start slave;
    (3)检查服务是否正常:show slave status\G

    若是主健冲突或数据不一致的情况,则需要额外处理:

    (1)停止slave进程

    STOP SLAVE;

    (2)设置事务号,事务号从Retrieved_Gtid_Set获取

    SET @@SESSION.GTID_NEXT= 'xxxxxxxxxxx'

    (3)设置空事务

    BEGIN; COMMIT;

    (4)恢复事务号

    SET SESSION GTID_NEXT = AUTOMATIC;

    (5)启动slave进程

    START SLAVE;

    实例故障

    1.MySQL实例假死
    (1)再次确认mysql的运行状态

    1 SHOW PROCESSLIST;是否有大量请求在等待处理

    此时,为校验是否真处于MysQL假死状态,那么可以用test库中任意执行创建表或更新数据的语句,若回车键后没有响应,则一般可以断定MySQL 是否已经处于假死状态。

    (2)检查mysql实例的进程的内存/交换分区状态
    使用linux 命令: free -m
    使用linux 命令: top

    结合当前业务压力,检查内存消耗现状,消耗速度,是否开始使用交换分区,如内存消耗过快且业务压力不大,并发不高,转向对slow query的定位。

    (3)检查mysql实例的进程分区使用情况和IO状态
    使用Linux命令: df -hT
    使用Linux命令: iostat -x

    确认分区有足够空间,如异常,则进入对应目录,检查实例的数据和日志存放和增长情况,特别是对日志进行清理处理,或通过调整逻辑卷的大小解决问题。

    检查iostat汇报值中 %user, %iowait, %idle 值是否异常,如异常且当前业务压力不大,转向对slow query的定位,同时要求主机运维人员协查物理存储的健康状况。

    (4)检查mysqld的CPU使用情况
    使用Linux命令: top
    使用Linux命令:ps -eo pid,user,comm,pcpu,pmem,vsz | grep mysqld

    结合当前业务压力和连接数,确认mysql进程的CPU占用率是否异常,如当前业务压力不大,并发不高,转向对slow query的定位。

    (5)检查实例主机的网络通信
    使用Linux命令: ping 检测到应用主机,到复制从机的RTT
    使用Linux命令: iptraf 确认实例主机的网卡带宽和速度
    如以上操作发现异常,需要主机运维人员使用tcpdump进行抓包分析

    (6) Slow query 分析
    打印slow query日志,分析和定位造成故障的SQL, 必要时,kill 掉出现问题的SQL ID

    2.应用报连接池满
    (1) 检查io请求状态
    使用Linux命令: iostat
    查看r/s(读请求),avgrq-sz(平均请求大小),svctm(IO响应时间)
    (2)运行orzdba对照SQL执行数量(QPS-sel栏和TPS-iud栏)和逻辑读消耗(Hit%-lor栏)
    (3) 转向slow query分析查看行扫描Query_time和Rows_examined栏,如无明显定位和结论,进入下一步全面分析
    (4)使用pt-query-digest分析全面slow query,着重分析索引的合法性
    (5) 检查General log
    (6) 检查Binlog, 对于DML操作, 通过mysqlbinlog工具解析binlog检查
    (7) 使用Linux命令 tcpdump抓包分析,配合pt-query-digest做进一步分析排查

    3. MySQL请求线程堵塞
    (1)检查 processlist

    processlist 主要查看 Time, State 栏的汇报值

    (2)使用pstack 保存当前mysqld实例的栈调用,以备进一步分析

    其它故障

    1. 各种日志的标准存放路径和查看方法
    (1)常规后台进程报错日志log-error路径

    show variables like '%log_error%';
    | log_error     | /paic/mymon/data/mysqldata/mymon/mysql.err |

    文本文件,可以直接查看,类似oracle的alert日志。

    (2)慢查询日志slow_query_log_file,其设定值long_query_time

    show variables like '%slow_query_log_file%';
    | slow_query_log_file | /paic/mymon/data/mysqldata/mymon/cnsh230234-slow.log |
    show variables like '%long_query_time%';
    | long_query_time | 10.000000 |

    文本文件,可以看出sql文本及sql的执行时间

    (3)数据库二进制日志文件binlog
    查看方法mysqlbinlog mysql-bin.000001 |more
    可以直接看到事务号和sql脚本

    2. mysql进程报错,类似ORA-
    例如:071221 11:12:12 [ERROR] Got error 127 when reading table ‘./download_utf8/source_uesrdown’

    查看127报错原因

    cnsh230234: >perror 127
    OS error code 127:  Key has expired
    MySQL error code 127: Record file is crashed
    参考处理办法 Repair Table source_uesrdown ; Repair Table userday_money;

    3. 忘记root密码,重置方法如下

    (1)/etc/init.d/mysql stop
    (2)mysqld_safe –skip-grant-tables &
    (3)mysql -uroot -p
    (4)update mysql.user set password=password(“”yourpasswd”") where user=”"root”"
    (5)flush privileges
    (6)quit


    相关实践学习
    基于CentOS快速搭建LAMP环境
    本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
    全面了解阿里云能为你做什么
    阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
    相关文章
    |
    3月前
    |
    缓存 NoSQL 关系型数据库
    MySQL缓存策略(一致性问题、数据同步以及缓存故障)
    MySQL缓存策略(一致性问题、数据同步以及缓存故障)
    57 1
    |
    6月前
    |
    关系型数据库 MySQL 网络安全
    Mysql主从同步时Slave_SQL_Running状态为Yes , 但是Slave_IO_Running状态为Connecting以及NO的情况故障排除
    当使用Navicat工具打开这三个数据库时 , 发现主库和从库的数据不同
    72 0
    |
    10月前
    |
    运维 关系型数据库 MySQL
    WDCP MYSQL 5.5.44 升级故障处理一例
    WDCP MYSQL 5.5.44 升级故障处理一例
    |
    11月前
    |
    SQL 缓存 关系型数据库
    故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
    故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
    132 0
    |
    SQL 负载均衡 容灾
    手把手教你实现MySQL读写分离+故障转移,不信你学不会!(下)
    手把手教你实现MySQL读写分离+故障转移,不信你学不会!(下)
    手把手教你实现MySQL读写分离+故障转移,不信你学不会!(下)
    |
    监控 算法 安全
    MySQL:5.6 大事务show engine innodb status故障一例
    MySQL:5.6 大事务show engine innodb status故障一例
    173 0
    MySQL:5.6 大事务show engine innodb status故障一例
    |
    SQL 前端开发 关系型数据库
    探索MySQL-Cluster奥秘系列之SQL节点故障测试(10)
    在这一小节中,我继续来对MySQL-Cluster集群环境的高可用性进行测试,接下来我们来看下当SQL节点出现故障时,MySQL-Cluster集群环境是如何保障其高可用性的。
    216 0
    |
    SQL 存储 SpringCloudAlibaba
    MySQL 千万数据量深分页优化, 拒绝线上故障!
    MySQL 千万数据量深分页优化, 拒绝线上故障!
    534 0
    MySQL 千万数据量深分页优化, 拒绝线上故障!
    |
    关系型数据库 MySQL 数据库管理
    MySQL:产生大量小relay log的故障一例
    能力有限有误请谅解,源码版本5.7.22 欢迎关注我的《深入理解MySQL主从原理 32讲 》,如下: 一、案例来源和现象 这个案例是朋友@peaceful遇到的线上问题,最终线索也是他自己找到的。
    1226 0
    |
    监控 安全 关系型数据库