MySQL 重启使用 MySQL C API 导致双重释放或损坏

Posted

技术标签:

【中文标题】MySQL 重启使用 MySQL C API 导致双重释放或损坏【英文标题】:MySQL restart causes double free or corruption using MySQL C API 【发布时间】:2011-12-21 18:04:35 【问题描述】:

我有一个维护 mysql 持久连接的 c 程序,版本 5.1.46。如果我在程序运行时重新启动 mysql,则会出现双重释放或损坏错误:

# /etc/init.d/mysql restart
Shutting down MySQL........ [ OK ]
Starting MySQL.*** glibc detected *** /home/user/a.out: double free or corruption (!prev): 0x000000000b64dd00 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3739471634]

我希望连接会自动重新连接,因为我已经设置了 MYSQL_OPT_RECONNECT 选项并且尚未明确关闭此连接。此外,我正在执行的查询不是我不小心设置为 NULL 或被释放的 char*,它是一个常量,双引号字符串。

以下是 gdb 中生成的核心文件中的几行

#11 0x000000000044ed71 in mysql_send_query (mysql=0x41966aa0, query=0x41966100 "SELECT count (*) from TableA", length=27) at client.c:2894
#12 0x000000000044edd9 in mysql_real_query (mysql=0x602a, query=0x602d <Address 0x602d out of bounds>, length=6) at client.c:2905
#13 0x000000000042b42f in do_query (conn=0x41966aa0, msg=0x41966100 "SELECT count(*) from TableA") at dosql.cpp:20

任何想法为什么会发生这种情况?

【问题讨论】:

你在服务器端运行什么版本的 MySQL,你在客户端使用什么版本的 C API? 我正在使用的系统有 MySQL 服务器 5.1.46,我正在使用 5.1.46 MySQL-devel 包,我相信它包含 C API。 【参考方案1】:

任何想法为什么会发生这种情况?

因为 MySQL 中的一个错误。

您可以尝试更新到以后的包,看看问题是否消失。

或者,在 Valgrind 下运行您的客户端程序,它会以可用于修复它的方式报告错误。特别是会报告

分配内存的堆栈跟踪 已释放的堆栈跟踪 发生双重释放的堆栈跟踪(应该与您的 GDB 堆栈跟踪相同)

鉴于该信息,您可以将错误报告给 MySQL 开发人员,并希望最终得到修复。

【讨论】:

以上是关于MySQL 重启使用 MySQL C API 导致双重释放或损坏的主要内容,如果未能解决你的问题,请参考以下文章

docker 启动 mysql,重启docker导致容器消失

修改hostname导致mysql重启slave失败的修复方法

mysql xa导致的事务一直running问题

mysql内存不断被占用,导致每隔一个多月就自动重启,修改数据库配置后,问题解决

磁盘空间不够导致mysql崩溃重启

MySQL 重启后不工作