首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[MYSQL] gdb在线修改mysql版本号

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

原创
作者头像
大大刺猬
发布2025-01-13 18:19:11
发布2025-01-13 18:19:11
4850
举报
文章被收录于专栏:大大刺猬大大刺猬

导读

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

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

思路

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

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

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

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

方法

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

代码语言:shell
复制
echo 'info variables'|gdb -p `pidof mysqld` > /tmp/mysql_variables_t20250113.txt

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

代码语言:txt
复制
<data variable, no debug info> server_version;

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

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

5.7 环境

我们先查看下当前的值

代码语言:shell
复制
gdb -p `pidof mysqld` --batch --ex 'print server_version'

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

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

代码语言:shell
复制
gdb -p `pidof mysqld` --batch --ex 'print server_version' --ex 'set server_version="5.7.66-log"'

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

8.0 环境

8.0环境中server_version值是个整数.

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

代码语言:python
复制
server_version = 774909488 + major_version

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

代码语言:shell
复制
gdb -p `pidof mysqld` --batch --ex 'print server_version' --ex 'set server_version=774909488+9'

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

总结

上有政策,下有对策.

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • 思路
  • 方法
    • 5.7 环境
    • 8.0 环境
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档