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

检查 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;

阿里云-虚拟数字人 阿里云-虚拟数字人

阿里云-虚拟数字人是什么? …

阿里云-虚拟数字人 2 查看详情 阿里云-虚拟数字人

使用 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: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory

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

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

以上就是MySQL数据库崩溃的常见原因和解决方法是什么的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/270442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 12:04:56
下一篇 2025年11月4日 12:05:48

相关推荐

  • Golang简单博客系统开发实战

    答案:用Go语言可快速搭建一个具备文章发布、查看和管理功能的简单博客系统。通过合理设计项目结构,定义文章模型并使用内存存储,结合HTTP路由与处理器实现CRUD操作,利用模板引擎渲染HTML页面,并提供静态资源访问支持,最终运行服务即可在浏览器中访问基础博客首页,具备完整雏形且易于扩展。 想快速上手…

    2025年12月16日
    000
  • Golang包重命名与导入别名使用方法

    在Go语言中,包重命名通过import别名解决命名冲突、提升可读性。例如import ( myfmt “fmt” )将fmt重命名为myfmt,后续用myfmt.Println调用;当导入同名包如json和jsoniter时,别名可明确区分标准库与第三方;使用_进行匿名导入可…

    2025年12月16日
    000
  • Go语言中实现动态IN查询的指南

    本文详细介绍了在Go语言中使用database/sql包执行带有动态参数列表的IN查询的方法。由于database/sql不直接支持将切片作为单个占位符的参数,因此需要通过动态生成SQL占位符字符串并使用interface{}切片配合可变参数来构建查询,同时考虑了空切片等边界情况。 理解databa…

    2025年12月16日
    000
  • 数据库连接池性能调优实践

    合理设置连接池参数可提升系统性能,需根据业务特征配置最小/最大连接数、获取超时时间及空闲回收策略;启用借出、归还或空闲时的连接检测机制保障连接有效性;结合监控活跃连接、等待线程等指标持续优化;针对高并发、批处理、读写分离等场景差异化配置,实现资源与稳定的平衡。 数据库连接池是应用系统与数据库之间的重…

    2025年12月16日
    000
  • Go语言连接外部MySQL数据库:DSN配置与常见错误解析

    本文详细阐述了go语言使用`go-sql-driver/mysql`驱动连接外部mysql数据库的正确方法。重点介绍了数据源名称(dsn)的规范格式,特别是主机地址部分的配置,以避免常见的“getaddrinfow: the specified class was not found.”等网络解析错…

    2025年12月16日
    000
  • Go语言连接外部MySQL数据库:DSN配置与常见错误排查

    本文将深入探讨go语言如何使用`database/sql`和`go-sql-driver/mysql`连接外部mysql数据库。我们将详细介绍dsn(数据源名称)的构建方式,并通过一个实际案例分析`getaddrinfow: the specified class was not found.`这一…

    2025年12月16日
    000
  • OAuth认证后的用户数据持久化与安全会话管理

    本教程将深入探讨OAuth2认证流程中,如何高效且安全地处理从身份提供商获取的用户数据,并将其持久化到数据库。我们将介绍使用UPSERT操作来避免数据重复和竞态条件,并详细阐述如何通过配置安全的HTTP-only会话Cookie来建立和维护用户会话,以抵御常见的Web安全威胁,确保用户认证体验的流畅…

    2025年12月16日
    000
  • Go语言database/sql包中处理动态SQL IN 查询的实践指南

    本文详细介绍了在Go语言中使用database/sql包执行动态SQL IN查询的通用方法。针对IN子句无法直接接受切片作为参数的问题,教程重点阐述了如何通过动态生成占位符?并配合可变参数传递切片元素来构建安全高效的查询,并提供了完整的代码示例和注意事项。 在go语言的database/sql包中,…

    2025年12月16日
    000
  • OAuth2认证后用户数据存储与会话安全指南

    本文旨在提供OAuth2认证后处理用户数据持久化和会话管理的最佳实践。我们将探讨如何将OAuth返回的用户数据安全地存储到数据库,推荐使用事务性的UPSERT操作来处理用户存在性检查与插入/更新。同时,文章还将详细阐述如何通过配置安全的HTTP-only会话Cookie来建立和维护用户会话,并强调H…

    2025年12月16日
    000
  • OAuth响应处理与安全会话管理:数据库集成与Cookie最佳实践

    本教程深入探讨了OAuth2认证流程结束后,如何安全高效地处理用户数据并建立会话。文章首先介绍了将OAuth提供者返回的用户数据存储到数据库的最佳实践,重点讲解了原子性的UPSERT操作以避免数据冗余和竞态条件。随后,详细阐述了基于Cookie的会话管理策略,强调了使用HTTPS、Secure、Ht…

    2025年12月16日
    000
  • Go database/sql 包查询结果行数精确判断与首行数据获取

    本文深入探讨Go语言中database/sql包在数据库查询时,如何精确判断返回结果的行数(零行、单行或多行),并安全地获取首行数据。针对QueryRow的局限性,文章提供了一个通用的自定义函数方案,利用db.Query和*sql.Rows的特性,实现对查询结果的细粒度控制,同时强调了错误处理和资源…

    2025年12月16日
    000
  • OAuth2集成:用户数据持久化与安全会话管理指南

    本文旨在探讨OAuth2认证流程结束后,如何高效且安全地处理用户数据持久化与会话管理。我们将重点介绍数据库中用户数据的“存在则更新,不存在则插入”(UPSERT)策略,并深入讲解如何利用HTTPS和安全、HttpOnly的Cookie来建立健壮的用户会话,以确保用户体验和系统安全。 1. OAuth…

    2025年12月16日
    000
  • 在Go语言中处理SQL IN 子句的动态参数绑定

    本文旨在解决Go语言database/sql包中,如何将动态切片(slice)作为IN查询条件参数的问题。由于db.Query无法直接将切片展开为多个占位符,我们将探讨一种通用且安全的解决方案,通过动态生成SQL语句中的占位符并结合interface{}类型转换来实现,确保代码的灵活性和防止SQL注…

    2025年12月16日
    000
  • OAuth 响应处理与安全会话管理实践指南

    本教程旨在指导开发者如何高效且安全地处理 OAuth2 认证流程中获取的用户数据,并将其存储至数据库。文章将重点介绍采用 UPSERT 语句进行数据更新或插入的最佳实践,同时详细阐述如何利用安全 Cookie(如 Secure、HttpOnly 和 Path 选项)构建健壮的用户会话管理机制,规避潜…

    2025年12月16日
    000
  • Go语言database/sql:高效构建和执行带有可变参数的IN查询

    在Go语言中,使用database/sql包执行带有可变参数列表的IN查询时,直接传入切片作为单个占位符是无效的。本文将详细介绍一种通用的解决方案,通过动态生成SQL语句中的占位符(问号),并将切片元素展开为独立的参数传递给db.Query方法,从而优雅地处理IN子句中的可变值集合,并讨论相关注意事…

    2025年12月16日
    000
  • Golang如何实现自动化备份与恢复

    Go语言适合构建自动化备份与恢复系统,其核心是通过调用系统命令或API实现数据备份与恢复。1. 文件备份可使用os和io包复制文件,数据库备份可通过mysqldump等工具或驱动导出;2. 使用robfig/cron库设置定时任务,如每日2点执行备份,并结合systemd或Kubernetes管理任…

    2025年12月16日
    000
  • 如何使用Golang测试数据库操作

    使用事务回滚确保测试隔离,通过传入*sql.Tx实现数据操作函数的可测试性,结合sqlmock模拟SQL验证逻辑,保证测试可重复且无副作用。 测试数据库操作在 Golang 中是确保数据层逻辑正确的重要环节。关键在于隔离真实环境、使用事务控制以及合理模拟数据。以下是具体实践方法。 使用测试数据库或事…

    2025年12月16日
    000
  • Go语言连接MySQL数据库:权限配置与常见问题解决指南

    本文详细探讨Go语言连接MySQL数据库时遇到的常见问题,特别是“Access denied”错误和数据查询无结果的情况。核心问题在于MySQL用户权限配置不当,未能授权通过TCP连接。文章提供了详细的MySQL用户权限设置步骤,并结合Go语言的database/sql接口和go-sql-drive…

    2025年12月16日
    000
  • Go语言连接MySQL数据库:权限配置与常见问题解析

    本文详细介绍了在Go语言中如何连接MySQL数据库,重点解决了常见的“Access Denied”权限错误以及查询结果为空的问题。通过使用go-sql-driver/mysql驱动,文章提供了详细的代码示例,并强调了MySQL用户权限配置的关键性,指导读者正确设置用户权限以确保Go应用程序能顺利访问…

    2025年12月16日
    000
  • Go语言生态系统:Java开发者工具链指南

    本文旨在为Java开发者提供一份Go语言开发生态系统的全面指南,涵盖集成开发环境、依赖管理、持续集成工具以及常用库的对应方案。我们将探讨Go语言在这些方面的独特实践,帮助开发者平滑过渡并高效利用Go的优势,从而提升开发效率和项目管理能力。 1. 集成开发环境(IDE)与代码编辑器 对于习惯了ecli…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信