0

0

mysql如何排查mysqld服务异常

P粉602998670

P粉602998670

发布时间:2025-09-21 08:09:01

|

751人浏览过

|

来源于php中文网

原创

排查MySQL服务异常需先确认服务状态,检查是否停止或响应异常;接着查看错误日志定位OOM、表损坏、连接数超限等问题;分析资源占用情况,排查CPU、内存、磁盘I/O瓶颈;启用慢查询日志优化SQL性能;检查max_connections限制及配置参数合理性;审查代码是否存在死循环或高频操作;确保磁盘空间充足;通过systemd配置自动重启机制;使用SHOW ENGINE INNODB STATUS或开启innodb_print_all_deadlocks诊断死锁;利用Performance Schema、PMM、Prometheus+Grafana等工具监控QPS、TPS、连接数、锁等待等关键指标。

mysql如何排查mysqld服务异常

MySQL服务异常,排查方向主要集中在资源占用、错误日志、配置问题以及代码层面。简单来说,就是看它有没有“吃饱喝足”,有没有“生病”,以及“干活的工具”和“干活的方式”对不对。

解决方案

  1. 确认服务状态: 首先,最基础的,确认MySQL服务是否真的停止了。使用

    systemctl status mysqld
    或者
    service mysqld status
    查看服务状态。如果服务是inactive (dead),那基本可以确定服务确实异常停止了。如果服务还在运行,但表现异常(例如连接超时),则需要进一步排查。

  2. 查看错误日志: MySQL的错误日志是诊断问题的关键。默认情况下,错误日志文件名为

    error.log
    ,通常位于
    /var/log/mysql/
    /var/log/
    目录下。检查最近的错误信息,例如:
    tail -n 100 /var/log/mysql/error.log
    。 常见的错误包括:

    • Out of memory (OOM): 内存不足导致MySQL进程被操作系统杀死。
    • Table is marked as crashed and should be repaired: 表损坏。
    • Duplicate entry: 唯一键冲突。
    • Too many connections: 连接数超过限制。
  3. 资源占用情况: 使用

    top
    htop
    vmstat
    等工具查看CPU、内存、磁盘I/O的使用情况。MySQL服务异常停止很可能是因为服务器资源耗尽。如果CPU使用率持续过高,可能是存在慢查询或者死锁。如果内存使用率过高,可能是
    innodb_buffer_pool_size
    设置过大,或者存在内存泄漏。磁盘I/O过高,可能是数据量太大,或者存在大量的磁盘操作。

  4. 慢查询日志: 如果服务未停止,但性能下降,检查慢查询日志。启用慢查询日志:

    SET GLOBAL slow_query_log = 'ON';
    SET GLOBAL long_query_time = 2; -- 设置慢查询时间阈值为2秒
    SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';

    分析慢查询日志,找出执行时间长的SQL语句,优化索引或SQL语句本身。

  5. 连接数限制: 默认情况下,MySQL的最大连接数是有限制的。如果连接数超过限制,新的连接请求会被拒绝。可以通过

    SHOW VARIABLES LIKE 'max_connections';
    查看当前的最大连接数。如果需要增加最大连接数,可以在MySQL配置文件(通常是
    /etc/my.cnf
    /etc/mysql/mysql.conf.d/mysqld.cnf
    )中修改
    max_connections
    参数,并重启MySQL服务。

  6. 配置问题: 检查MySQL配置文件中的参数设置,例如

    innodb_buffer_pool_size
    key_buffer_size
    sort_buffer_size
    等。不合理的参数设置可能导致性能问题或服务异常。

  7. 代码层面: 检查应用程序代码,是否存在SQL注入漏洞、死循环、或者频繁的数据库操作。代码层面的问题可能导致MySQL服务压力过大,最终导致服务异常。例如,可以使用GDB调试mysqld进程,查看线程堆信息,定位问题代码。

  8. 磁盘空间: 检查磁盘空间是否已满。MySQL需要足够的磁盘空间来存储数据和日志。如果磁盘空间已满,MySQL可能无法正常工作。

MySQL崩溃后如何自动重启

可以使用systemd的

Restart=on-failure
配置。编辑MySQL的systemd配置文件(例如
/etc/systemd/system/mysqld.service
),在
[Service]
部分添加:

Restart=on-failure
RestartSec=5s

Restart=on-failure
表示服务在失败时自动重启。
RestartSec=5s
表示重启前等待5秒。然后重新加载systemd配置:
systemctl daemon-reload
,并重启MySQL服务:
systemctl restart mysqld
。 这样,当MySQL服务崩溃时,systemd会自动尝试重启它。

万彩商图
万彩商图

专为电商打造的AI商拍工具,快速生成多样化的高质量商品图和模特图,助力商家节省成本,解决素材生产难、产图速度慢、场地设备拍摄等问题。

下载

如何诊断InnoDB死锁?

InnoDB死锁会导致事务阻塞,甚至可能导致MySQL服务性能下降。可以通过以下方法诊断InnoDB死锁:

  1. 查看InnoDB状态信息: 使用

    SHOW ENGINE INNODB STATUS\G
    命令查看InnoDB的状态信息。在输出结果中,查找
    LATEST DETECTED DEADLOCK
    部分,可以找到最近发生的死锁信息,包括涉及的事务、锁、SQL语句等。

  2. 启用

    innodb_print_all_deadlocks
    参数: 在MySQL配置文件中设置
    innodb_print_all_deadlocks=ON
    ,并将错误日志级别设置为
    log_error_verbosity=3
    。这样,每次发生死锁时,详细的死锁信息都会被记录到错误日志中。

  3. 分析死锁信息: 根据死锁信息,找出涉及的事务和SQL语句,分析导致死锁的原因。常见的死锁原因是:

    • 交叉更新: 多个事务以不同的顺序更新同一批数据。
    • 锁升级: InnoDB的锁升级机制可能导致死锁。
    • 外键约束: 外键约束可能导致死锁。
  4. 解决死锁: 解决死锁的方法包括:

    • 调整事务隔离级别: 降低事务隔离级别可以减少死锁的发生。
    • 优化SQL语句: 避免长事务和大事务,尽量减少锁的持有时间。
    • 调整锁的顺序: 确保多个事务以相同的顺序获取锁。
    • 避免交叉更新: 尽量避免多个事务以不同的顺序更新同一批数据。

如何监控MySQL的性能指标?

监控MySQL的性能指标对于及时发现和解决问题至关重要。常用的监控工具包括:

  1. MySQL Enterprise Monitor: MySQL官方提供的监控工具,可以监控MySQL的各种性能指标,并提供报警功能。

  2. Percona Monitoring and Management (PMM): 一款免费开源的监控工具,可以监控MySQL、MongoDB、PostgreSQL等数据库的性能指标。

  3. Prometheus + Grafana: 一种流行的监控方案,Prometheus负责收集监控数据,Grafana负责展示监控数据。可以使用

    mysqld_exporter
    收集MySQL的性能指标。

  4. 自带的性能监控工具: MySQL 5.7及以上版本自带了

    Performance Schema
    ,可以收集各种性能指标。启用
    Performance Schema

    UPDATE performance_schema.setup_instruments SET enabled = 'YES', timed = 'YES';
    UPDATE performance_schema.setup_consumers SET enabled = 'YES';

    然后可以使用SQL语句查询

    Performance Schema
    中的数据,例如:

    SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT FROM performance_schema.events_statements_summary_global_by_event_name ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;

监控的性能指标包括:

  • CPU使用率: 监控MySQL进程的CPU使用率,可以发现是否存在CPU瓶颈。
  • 内存使用率: 监控MySQL进程的内存使用率,可以发现是否存在内存泄漏或内存不足。
  • 磁盘I/O: 监控MySQL进程的磁盘I/O,可以发现是否存在磁盘I/O瓶颈。
  • 连接数: 监控MySQL的连接数,可以发现是否存在连接数超过限制的情况。
  • 慢查询数: 监控慢查询的数量,可以发现是否存在性能问题。
  • QPS/TPS: 监控MySQL的查询和事务吞吐量。
  • 锁等待时间: 监控锁等待的时间,可以发现是否存在死锁或锁竞争。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1090

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

356

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

674

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

570

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

411

2024.04.29

python设置中文版教程合集
python设置中文版教程合集

本专题整合了python改成中文版相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 779人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号