暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

[MYSQL] gdb在线修改mysql版本号

原创 大大刺猬 2025-01-13
411

导读

前几天看到叶老师使用sed修改mysqld版本号, 觉得非常NB.

但涉及到重启数据库, 很多环境可能不允许重启, 那么该怎么办呢?

思路

以前我们编译mysqld的时候, 演示了修改版本号, 但太麻烦了,对于已经上线的系统这种做法不现实. 直接使用sed修改磁盘文件中的版本号操作更简单, 但是得重启数据库. 如果不重启数据库的话,那就只能在内存中修改版本信息了.

gdb正好就能做到修改内存中的参数变量. 也就是我们只需要找到对应的变量, 然后使用gdb来修改内存中的值即可.

只修改内存中的值, 所以后续重启的时候还得修改, 不然就变回去了.

那么怎么寻找相关的变量呢? 我们还是使用简单通用的方法来做. 直接打印全部变量, 然后grep version关键字即可找到.

方法

比如, 我们可以直接使用如下命令将所有变量全部保存到某个文件中

echo 'info variables'|gdb -p `pidof mysqld` > /tmp/mysql_variables_t20250113.txt

然后我们搜索version关键字就能找到如下信息

<data variable, no debug info> server_version;

这个(server_version)看起来就是mysql的版本值了. 然后我们只需要修改该值即可.

测试的时候发现5.7和8.0中该值是存在差别的, 所以分开演示

5.7 环境

我们先查看下当前的值

gdb -p `pidof mysqld` --batch --ex 'print server_version'

发现是字符串格式, 这就非常方便修改了,
image.png

比如我们可以将其修改为一个非常大的版本

gdb -p `pidof mysqld` --batch --ex 'print server_version' --ex 'set server_version="5.7.66-log"'

然后登录数据库查看版本信息, 发现确实修改成功了.(再也不用担心坑爹的漏扫了)
image.png

8.0 环境

8.0环境中server_version值是个整数.
image.png

测试发现8.0环境版本号和server_version对应关系为:

server_version = 774909488 + major_version

也就是该值只能修改主版本号. 比如我们可以将8.0.28修改为9.0.28 只需要执行如下命令即可

gdb -p `pidof mysqld` --batch --ex 'print server_version' --ex 'set server_version=774909488+9'

image.png

小版本对应哪个参数我目前还没找到, 有兴趣的同学可以自己尝试下(建议在自己的测试环境验证, 有些变量修改之后会导致数据库dang掉, 有些参数甚至会破坏ibdata1.)

总结

上有政策,下有对策.

修改任何信息前,都要仔细确认和验证. 最好是备份. 而不能备份的时候,最好是多个人复核一下再操作.(比如本教程这种修改内存的操作,没法备份,只能复核的时候仔细一点了.)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论