返回顶部
首页 > 资讯 > 数据库 >工具 | 常用 MySQL 内核 Debug 技巧
  • 388
分享到

工具 | 常用 MySQL 内核 Debug 技巧

工具|常用MySQL内核Debug技巧 2015-02-09 14:02:05 388人浏览 绘本
摘要

作者:柯煜昌 顾问软件工程师 目前从事 RadonDB Mysql 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 掌握 mysql 内核源码的阅读和调试能力,不仅是数据库研发人员的日常,也是 DBA 进阶的必经之

工具 | 常用 MySQL 内核 Debug 技巧

作者:柯煜昌 顾问软件工程师

目前从事 RadonDB Mysql 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。

掌握 mysql 内核源码的阅读和调试能力,不仅是数据库研发人员的日常,也是 DBA 进阶的必经之路。

阅读本文你将了解:

  • 如何准备 Mysql 调试环境
  • GDB 调试入门及操作示例
  • Trace 文件调试及操作示例

| 一、准备 Debug 环境

首先用源码编译安装一个用来调试的 MySQL 环境。

开启 -DWITH_DEBUG ,在源码路径创建 build 目录,进入目录并执行:

cmake .. -DWITH_BOOST=../../boost -DWITH_DEBUG=1

然后通过如下方式,确认是否编译成功。

方式一:

$ ./bin/mysqld --verbose --version

回显 debug 版本信息,则编译的是 debug 版本。

ver 8.0.18-debug for linux on x86_64 (Source distribution)

方式二:

连接数据库,执行查看版本命令。回显包含了 debug 字样,则编译的是 debug 版本。

$ mysql> select version();
+--------------+
| version()    |
+--------------+
| 8.0.18-debug |
+--------------+
1 row in set (0.00 sec)

| 二、使用 GDB 调试

GDB 全称 “GNU symbolic debugger”,是 Linux 下常用的程序调试器,通常以 gdb 命令的形式在终端(shell)中使用。

启动 GDB 编译器

执行如下命令启动 GDB 编译器(假设 my.cnf 在用户根目录中)。进入 GDB 后,敲入 run 即可运行。

gdb --args ./bin/mysqld --defaults-file=~/my.cnf --gdb

其中 --gdb 参数允许你随时 Ctrl+C 的方式中断 mysqld 进程,进行调试命令。

GDB 常用命令

使用多窗口查看源码与调试的读者,可以使用 layout 命令,在 gdb 中执行 help layout 可以查看更多 gdb 命令用法。

(gdb) help layout
(gdb) help layoutChange the layout of windows.
Usage: layout prev | next | 
Layout names are:
   src   : Displays source and command windows.
   asm   : Displays disassembly and command windows.
   split : Displays source, disassembly and command windows.
   regs  : Displays reGISter window. If existing layout
           is source/command or assembly/command, the
           register window is displayed. If the
           source/assembly/command (split) is displayed,
           the register window is displayed with
           the window that has current logical focus.

(gdb)

可以通过 GDB cheat sheet[1],了解更多 GDB 使用方式。

Debug 示例

安装好 Debug 环境后,我们用以下两个例子,来简单演示使用思路及技巧。

1、取变量值

在某种情况下发现 mysqld 已经 crash,系统只有一个 core 文件,而我们要知道某个系统变量的值。但是系统变量的值,不见得与 my.cnf 文件一致。

此时,就可以用 gdb 命令将变量打印出来,获取变量值。

如下所示,需获取变量 version 的值,只需要在前面加 mysql_sysvar_ 前缀打印即可。

Thread 1 "mysqld" received signal SIGINT, Interrupt.
0x00007ffff5f74cb9 in __GI___poll (fds=0x55555e8a3De0, nfds=2, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:29
29    ../sysdeps/unix/sysv/linux/poll.c: No such file or directory.
(gdb) p mysql_sysvar_version
$1 = {flags = 68101, name = 0x55555e7ff738 "innodb_version", comment = 0x55555ca953e2 "InnoDB version", check = 0x555558e222f1 , update = 0x555558e22881 ,
  value = 0x55555def1c20 , def_val = 0x55555ca89598 "8.0.18"}
(gdb)

2、调试脚本

假设需获取某一个连接进入 dispatch_command 有哪些 command ,可以执行 gdb 脚本[2] 获取。

gdb 脚本内容如下:

b dispatch_command
commands
    print command
    continue
end

执行 gdb 脚本,然后使用 mysql 客户端连接数据库,并执行 SQL 语句操作,即可查看到 gdb 调试信息。

(gdb) b dispatch_command
Breakpoint 3 at 0x555558ddb37c: file /home/kyc/mysql8/sql/sql_parse.cc, line 1581.
(gdb) commands
Type commands for breakpoint(s) 3, one per line.
End with a line saying just "end".
>print command
>continue
>end
(gdb) c
Continuing.
[Switching to Thread 0x7fffe01fc700 (LWP 5941)]

Thread 49 "mysqld" hit Breakpoint 3, dispatch_command (thd=0x7fff4c000f70, com_data=0x7fffe01fbba0, command=COM_QUERY) at /home/kyc/galaxyengine/sql/sql_parse.cc:1581
1581                          enum enum_server_command command) {
$4 = COM_QUERY

| 三、使用 Trace 文件调试

MySQL 的 debug 版提供了一个专门的 DBUG 包[3]。通过这个 DBUG 包,可获取正在执行操作程序的 Trace 文件。

通过控制 DBUG 开关,可以将 MySQL 的任何操作,以及所涉及的调用模块、函数、状态信息记录在 Trace 文件中。

设置 debug 参数

通过设置 debug 参数选项,指定跟踪方式。

--debug [ = debug_options ]

[ = debug _ options ] 可识别字符 dtio 等。

Debug 示例

若需获取代码中 DBUG_PRINT("info:" 打印的日志,可以使用 MySQL 客户端连上服务器,并执行如下命令,开启 debug 参数。

set debug = "d,info";
use test;

查看 mysqld.trace 文件,可获取 use test 在 MySQL 中的执行流程。

do_command: info: Command on socket (46) = 3 (Query)
do_command: info: packet: "                 "; command: 3
dispatch_command: info: command: 3
gtid_pre_statement_checks: info: gtid_next->type=0 owned_gtid.{sidno,gno}={0,0}
THD::is_ddl_gtid_compatible: info: SQLCOM_CREATE:0 CREATE-TMP:0 SELECT:1 SQLCOM_DROP:0 DROP-TMP:0 trx:0
SELECT_LEX::prepare: info: setup_ref_array this 0x7fff1400d298    3 :    0    0    1    2    0    0
setup_fields: info: thd->mark_used_columns: 1
setup_fields: info: thd->mark_used_columns: 1
SELECT_LEX::setup_conds: info: thd->mark_used_columns: 1
THD::decide_logging_fORMat: info: query: SELECT DATABASE()
THD::decide_logging_format: info: variables.binlog_format: 2
................
MDL_context::release_locks_stored_before: info: found lock to release ticket=0x7fff14019ae0
MDL_context::release_locks_stored_before: info: found lock to release ticket=0x7fff1412dd20
MDL_context::release_locks_stored_before: info: found lock to release ticket=0x7fff1412dcc0
net_send_ok: info: affected_rows: 0  id: 0  status: 2  warning_count: 0
net_send_ok: info: OK sent, so no more error sending allowed

本文使用几个简单的示例,演示了 MySQL 内核的 Debug 的几种常见方法。当然,仅仅起到抛砖引玉的作用,更多好玩的技巧,还需读者自行深度挖掘。

参考

[1]: GDB cheat sheet:https://gist.GitHub.com/rkubik/b96c23bd8ed58333de37f2b8cd052c30

[2]: GDB 脚本调试:Https://sourceware.org/gdb/current/onlinedocs/gdb/Commands.html#Commands

[3]: DBUG Package[:https://dev.mysql.com/doc/refman/8.0/en/dbug-package.html

您可能感兴趣的文档:

--结束END--

本文标题: 工具 | 常用 MySQL 内核 Debug 技巧

本文链接: https://lsjlt.com/news/9015.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 工具 | 常用 MySQL 内核 Debug 技巧
    作者:柯煜昌 顾问软件工程师 目前从事 RadonDB MySQL 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 掌握 MySQL 内核源码的阅读和调试能力,不仅是数据库研发人员的日常,也是 DBA 进阶的必经之...
    99+
    2015-02-09
    工具 | 常用 MySQL 内核 Debug 技巧
  • PHP底层的内核调试技巧与实用工具
    PHP底层的内核调试技巧与实用工具简介:PHP是一种广泛使用的脚本语言,作为动态语言,其底层内核的调试一直是开发者们的关注焦点。本文将介绍一些PHP底层内核调试的技巧与实用工具,并提供具体的代码示例。一、调试技巧使用var_dump()函数...
    99+
    2023-11-09
    内核调试 | PHP | 工具
  • 分享MySQL常用 内核 Debug 几种常见方法
    目录一、准备Debug环境二、使用GDB调试启动GDB编译器GDB常用命令Debug示例1、取变量值2、调试脚本三、使用Trace文件调试设置debug参数Debug示例阅读本文你将...
    99+
    2024-04-02
  • PSQL工具使用技巧
    psql功能强大,技巧怎么用只能后续慢慢补充了,看一个工具先看怎么用help,下面是一些常用的东西,比如如何查看目录、怎么使用变量、非常实用$ psql #连接到数据库服务器,可以在其中输入相应的SQL...
    99+
    2024-04-02
  • MySQL中常用工具
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便问,只要会...
    99+
    2023-09-05
    mysql 数据库 sql
  • MySQL 执行计划分析工具的使用技巧
    作者:禅与计算机程序设计艺术 文章目录 1.简介 2.基本概念术语说明 2.1 执行计划 2.2 EXPLAIN 2.3 mysqlshowplan ...
    99+
    2023-10-10
    大数据 人工智能 语言模型 Java Python 架构设计
  • MySQL SSL 连接的调试技巧与工具推荐
    MySQL SSL 连接的调试技巧与工具推荐摘要:MySQL SSL 连接是一种常见的网络安全技术,然而在实际使用中可能会遇到连接问题。本文介绍了一些调试技巧和推荐使用的工具,以帮助开发者更好地调试与故障排除。引言:随着数据安全的重要性越来...
    99+
    2023-10-22
    MySQL ssl 调试技巧
  • Linux的一些工具使用技巧整理
    1 cut 截取passwd中的第1、3两列cut -d ":" -f 1,3 /etc/passwd2 grep显示包含指定字符的行grep 29 alter.sqlgrep "root" pass...
    99+
    2023-06-05
  • MySQL数据库的常用技巧
    这篇文章主要讲解了“MySQL数据库的常用技巧”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库的常用技巧”吧! 正则表达式-- 是否...
    99+
    2024-04-02
  • 新手必备的Python实用技巧和工具
    目录一、交换变量二、if 语句在行内三、连接四、数字技巧五、注意浮点数的除法六、数值比较七、同时迭代两个列表八、带索引的列表迭代九、列表推导式十、字典推导十一、初始化列表的值十二、列...
    99+
    2024-04-02
  • mysql常用命令以及小技巧
    目录1. 清理二进制日志2. mysqldump不锁表3. mysql跳过空事务4. 番外5. mysql8.0使用mysqldump导出数据1. 清理二进制日志 purge mas...
    99+
    2024-04-02
  • 连接mysql的常用工具分享
    目录连接mysql常用工具mysql使用远程工具连接解决方案总结连接mysql常用工具 mysql作为数据库服务器来运行,任何满足mysql通信规范的软件都可以作为客户端来连接服务器。 常用的客户端: navicat、m...
    99+
    2023-02-16
    连接mysql常用工具 连接mysql mysql常用工具
  • MySQL之常用的MySQL优化工具解读
    目录一、mysqlTuner.pl二、tuning-primer三、pt-variable-advisor四、pt-qurey-digest总结影响数据库性能的常见因素如下: (1)磁盘IO; (2)网卡流量; (3)服...
    99+
    2023-02-16
    MySQL优化工具 MySQL常用优化工具 MySQL优化
  • 轻松上手的dedecms转换工具使用技巧
    【轻松上手的dedecms转换工具使用技巧】 在网站开发中,我们常常会遇到需要将不同类型的网站转换为dedecms系统的情况。为了更加高效地完成这一任务,本文将介绍一些使用dedec...
    99+
    2024-03-12
    工具技巧 上手操作 数据丢失
  • MySQL数据库常用技巧有哪些
    这篇文章主要介绍了MySQL数据库常用技巧有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL数据库常用技巧有哪些文章都会有所收获,下面我们一起来看看吧。如何选择服务器的类型?MySQL服务器配置窗口...
    99+
    2023-06-05
  • Python包管理工具pip的15 个使用小技巧
    认识pip 众所周知,pip可以对python的第三方库进行安装、更新、卸载等操作,十分方便。 pip的全称:package installer for python,也就是Pyth...
    99+
    2024-04-02
  • MySQL复制的概述、安装、故障、技巧、工具(火丁分享)
    同MongoDB,Redis这样的NoSQL数据库的复制相比,MySQL复制显得相当复杂! 概述 首先主服务器把数据变化记录到主日志,然后从服务器通过I/O线程读取主服务器上的主日志...
    99+
    2022-11-21
    MySQL复制
  • MySQL数据库的常用操作和技巧
    本篇内容主要讲解“MySQL数据库的常用操作和技巧”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL数据库的常用操作和技巧”吧!  使用MySQL数据库,...
    99+
    2024-04-02
  • 有哪些Python算法常用技巧与内置库
    这篇文章主要讲解了“有哪些Python算法常用技巧与内置库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Python算法常用技巧与内置库”吧!1.输入输出:1 第一行给定两个值n,m,...
    99+
    2023-06-16
  • MySQL常用慢查询分析工具详解
    目录引言1、调优工具mysqldumpslow1.1调优工具常用设置1.2 调优工具常用命令1.3 慢日志文件分析2、 调优工具show profile引言 在日常的业务开发中MySQL 出现慢查询是很常见的 大部分情况...
    99+
    2022-08-14
    MySQL常用慢查询工具 MySQL慢查询工具
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作