先检查ulimit -c是否为0,若是则需执行ulimit -c unlimited开启core生成;再确认/proc/sys/kernel/core_pattern路径权限及innodb_buffer_pool_in_core_file是否设为off,避免core过大或写入失败。

确认MySQL是否真的生成了core文件
很多情况下看到Segmentation fault (core dumped)提示,但实际没生成文件——这通常是因为系统级限制没打开。先检查ulimit -c输出是不是0;如果是,说明当前shell会话禁止生成core。即使MySQL配置了core-file,也会静默失败。
还要确认/proc/sys/kernel/core_pattern指向的位置是否有写入权限,尤其当它被重定向到/var/lib/systemd/coredump/(麒麟V10等发行版默认)时,普通用户进程可能因SELinux或目录权限被拦截。
- 用
coredumpctl list --no-pager mysqld查systemd-coredump是否捕获到记录 - 如果返回空,且
ulimit -c非零,再看dmesg | tail -20里有没有coredump: killed for exceeding size limit类提示 - MySQL启动用户(如
mysql)的home目录下有时会残留core,别只盯着datadir
用gdb加载core并查看崩溃现场
拿到core文件后,不能直接用gdb /path/to/mysqld core.xxx就完事——必须确保gdb能读取对应版本的mysqld二进制及调试符号。生产环境MySQL往往没装debuginfo包,bt(backtrace)命令可能只显示问号或不完整帧。
关键步骤是先验证符号可用性:gdb -q /path/to/mysqld core.xxx -ex "info proc mappings" -ex "quit"。如果输出里大量地址范围标为???,说明缺失调试信息。
- CentOS/RHEL系:安装
mysql-community-debuginfo或percona-server-debuginfo - Debian/Ubuntu:装
mysqld-debug或从源码编译带-g选项的二进制 - 麒麟V10:优先用
coredumpctl debug mysqld,它会自动匹配systemd-coredump存档里的符号路径
跳过Buffer Pool避免分析卡死
MySQL 8.0.14+ 默认把InnoDB Buffer Pool全量写入core,一个50GB的buffer_pool_size会导致core文件达数十GB。此时gdb加载要几分钟,bt命令可能卡住,甚至因内存不足被OOM killer干掉。
真正需要的是崩溃点附近的栈帧和寄存器状态,而不是几百GB的缓存页数据。必须确认innodb_buffer_pool_in_core_file已设为OFF,且系统支持MADV_DONTDUMP(Linux 3.4+基本都支持)。
- 动态关闭:
SET GLOBAL innodb_buffer_pool_in_core_file = OFF; - 启动时加参数:
mysqld --innodb-buffer-pool-in-core-file=OFF - 若错误日志出现
Warning: MADV_DONTDUMP not supported, disabling core_file,说明内核太老或被禁用,需升级或换方案
结合error log定位触发条件
core文件只告诉你“程序在哪一行崩的”,但不告诉你“为什么崩”。必须对照MySQL的error.log,搜索崩溃时间点前后的backtrace、stack_bottom、Thread pointer等字段。
例如日志里有Attempting backtrace... /mysqld(my_print_stacktrace+0x3d),说明崩溃前已尝试打印栈,这时gdb里的bt结果应与之高度一致;如果不一致,可能是core文件被截断或损坏。
- 重点看信号类型:
SIGSEGV(段错误)、SIGABRT(主动中止)、SIGBUS(总线错误)含义完全不同 - 检查崩溃线程是否在执行DDL、刷脏页、或处理特定SQL——这些常触发已知bug,可快速比对官方changelog
- 若core里
bt显示在ha_mysql.so插件内,需额外加载该so的调试符号,否则栈帧不可读
core-file但innodb_buffer_pool_in_core_file仍为ON,生成的core可能大到无法实用;而即便符号齐全,gdb也只能还原执行流,无法告诉你SQL语句内容或事务状态——这些必须靠error log、slow log和binlog交叉验证。











