0

0

MySQL数据库崩溃的常见原因和解决方法是什么

WBOY

WBOY

发布时间:2023-05-27 16:16:45

|

3208人浏览过

|

来源于亿速云

转载

    检查 MySQL 数据库的启动时间

    linux 系统中的 systemd 和 mysqld_safe 会在 mysqld 进程 crash 后自动重新启动 mysql 的服务,需要注意的是使用 kill -9 杀死 mysqld 进程系统会自动重新启动,而只使用 kill 命令则不会重新启动,因为执行 kill 命令,系统会发送一个 sigterm 信号给 mysqld,mysql 数据库会正常关闭,日志中会出现类似下面的记录:

    2020-10-26T09:06:48.435181Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19)  MySQL Community Server - GPL.

    MySQL 数据库 crash 后都会重新启动,因此我们有时可能不知道 MySQL 数据库已经 crash 过了,但我们可以从mysql数据库启动时间上找到线索,下面介绍四种检查 MySQL 数据库启动时间的方法。

    检查 MySQL 服务状态

    scutech@scutech:~$ service mysql status
    ● mysql.service - MySQL Community Server
       Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
       Active: active (running) since Wed 2020-10-21 05:54:18 NDT; 4 days ago
      Process: 774 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
      Process: 708 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
     Main PID: 791 (mysqld)
        Tasks: 27 (limit: 2328)
       CGroup: /system.slice/mysql.service
               └─791 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

    显示 MySQL 数据库已经运行 4 天多。

    检查 MySQL 中的 uptime 状态

    mysql> show global status like 'uptime';
    +---------------+--------+
    | Variable_name | Value  |
    +---------------+--------+
    | Uptime        | 428334 |
    +---------------+--------+
    1 row in set (0.32 sec)

    这个值是以秒为单位,下面换算成以天为单位是 4 天多。

    mysql> select 428334/60/60/24;
    +-----------------+
    | 428334/60/60/24 |
    +-----------------+
    |  4.957569444444 |
    +-----------------+
    1 row in set (0.01 sec)

    查询 uptime 状态的另一种方法是使用 mysqladmin version 或在 mysql 客户端里用 “\s” 进行查询。

    使用 ps 检查进程启动时间

    使用 ps 命令查询发现 mysqld 启动了4天23小时3分种54秒

    scutech@scutech:~$ ps -eo pid,user,args,etime|grep mysqld
      791 mysql    /usr/sbin/mysqld --daemoniz  4-23:03:54

    检查 MySQL 日志

    找关键字 “ready for connections”,可以查到启动信息。

    2020-10-21T08:24:18.986765Z 0 [Note] /usr/sbin/mysqld: ready for connections.
    Version: '5.7.28-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

    MySQL 数据库 crash 的常见原因

    MySQL 数据库 crash 的最常见原因有两个,一个是 mysql 的 bug , 另一个是 mysql 申请系统资源失败或内存泄漏。

    MySQL 的 bug

    MySQL数据库 crash 的最常见的一个原因当然是 MySQL 的bug。95% 的 bug 都是和具体的 sql 相关,通常是 MySQL crash 前执行的最后一个 sql 有问题,因此定位 bug 时应打开 general query log ,根据最后一个 sql 来查找线索。
    当你确定了 crash 的原因后,应该检查一下 MySQL 的 bug 库(https://bugs.mysql.com),通常采用 Advanced search,看看有没有类似的问题。如果你找到了可能与你相关的 bug,确认它是否修复了。如果已经修复了,那么把 MySQL 升级到 bug 已经修复的版本。

    MySQL数据库崩溃的常见原因和解决方法是什么

    在每个版本的 Release Notes 里面有一节 Bugs Fixed ,可以查到修复的 bug 。

    MySQL 申请系统资源失败或内存泄漏

    内存不足或 MySQL 申请系统资源失败外都会造成 MySQL 崩溃,例如磁盘空间满了,磁盘上的文件 corrupt 等。此时需要定位 crash 的根本原因有下面几种方法:

    • 仔细阅读 MySQL 的错误日志,这个日志里面的一些程序调试信息看起来很让人困惑,但静下心来仔细看,很多时候会找到线索;

    • 打开 general query log ,找到最后一个 sql 访问的表或索引,检查这个表或索引,如果有问题就重建,通常可以解决问题。

    • 使用 strace、pstack、pmap、gdb 分析 mysqld 的代码,可能需要打开 core dump;

      Buildt.ai
      Buildt.ai

      AI驱动的软件开发平台,可以自动生成代码片段、代码分析及其他自动化任务

      下载
    • 使用 CMake 的选项 -DWITH_DEBUG=1 重新编译 mysqld,然后运行重新编译后的 mysqld,查看 trace 文件、error log 进行排错。

    MySQL 内存占用的计算

    全局内存
    innodb_buffer_pool_size innodb_log_buffer_size thread_cache_size table_open_cache table_definition_cache key_buffer_size
    线程内存
    binlog_cache_size thread_stack
    单次操作内存
    join_buffer_size read_buffer_size read_rnd_buffer_size tmp_table_size sort_buffer_size

    计算公式
    MySQL 8 中最大内存占用参考值计算公式:

    SELECT ( @@innodb_buffer_pool_size + @@innodb_log_buffer_size + @@key_buffer_size 
    + @@max_connections * (@@binlog_cache_size + @@thread_stack + @@read_buffer_size 
    + @@read_rnd_buffer_size + @@sort_buffer_size + @@join_buffer_size + @@tmp_table_size ) 
    ) / 1024 /1024 AS MAX_MEM_MB;

    innodb_buffer_pool_size

    • key_buffer_size

    • max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)

    • max_connections*2MB

    临时解决可以使用下面的命令释放缓存:

    echo 1 > /proc/sys/vm/drop_caches

    0:0是系统默认值,默认情况下表示不释放内存,由操作系统自动管理
    1:释放页缓存
    2:释放dentries和inodes
    3:释放所有缓存
    从长远看还是要修改对应的参数进行解决。

    MySQL 客户端的内存泄漏

    MySQL 客户端的内存泄漏时通常会有下面的提示

    mysql: Out of memory at line 42, 'malloc.c'
    mysql: needed 8136 byte (8k), memory in use: 12412481367 bytes (12189k)
    ERROR 2008: MySQL client ran out of memory

    这通常是客户端收到的返回结果集太大造成的,解决办法有两种:

    检查正在运行的 SQL ,看看您真的需要这么大的返回结果集吗?
    允许 mysql 时加上 --quick 选项,这会减少客户端单次收到的返回集,但会增加 mysqld 的负载。

    相关专题

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

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

    674

    2023.10.12

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

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

    319

    2023.10.27

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

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

    344

    2024.02.23

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

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

    1084

    2024.03.06

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

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

    355

    2024.03.06

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

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

    671

    2024.04.07

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

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

    563

    2024.04.29

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

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

    407

    2024.04.29

    俄罗斯搜索引擎Yandex最新官方入口网址
    俄罗斯搜索引擎Yandex最新官方入口网址

    Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    1

    2025.12.29

    热门下载

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

    精品课程

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

    共48课时 | 1.5万人学习

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

    共3课时 | 0.3万人学习

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

    共1课时 | 776人学习

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

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