一文详解MySQL调试环境的搭建步骤
学习数据库要努力,但是不要急!今天的这篇文章《一文详解MySQL调试环境的搭建步骤》将会介绍到MySQL、docker等等知识点,如果你想深入学习数据库,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

近期使用 gdb 调试比较多,发现了很多好用的功能,而在 Mac 上使用 gdb 调试,体验不太顺畅。
为此,基于 Docker 搭建了一套 CentOS 环境,结合 VSCode 和 gdb 来调试 MySQL,拿出来和大家分享。
本文基于 Mac + MySQL 8.0.32,对于在其它系统上搭建 MySQL 调试环境,安装好 Docker Desktop 之后的步骤也是可以借鉴的。
1、下载 Docker Desktop
下载地址:https://www.docker.com/products/docker-desktop
下载界面:

Docker Desktop 下载完成之后,安装并运行,然后就可以继续接下来的步骤了。
2、创建 Docker 容器
先在 Docker Desktop 中设置能够映射到容器中的宿主机目录:

在第 3 个红框处的输入框中,输入 /opt/data/docker,然后按回车键把目录加入 FILE SHARING,表示允许把宿主机中该目录及其子目录映射到容器中,最后点击第 4 个红框处的 Apply & Restart,应用并重启 Docker Desktop,让修改生效。
在宿主机执行以下命令,创建容器并运行:
# 获取 CentOS 7.9 镜像
docker pull centos:centos7.9.2009
# 创建容器
# 这个 CentOS 容器专用于调试 MySQL
# 所以命名为【mysql】
# -d,表示以守护进程方式运行容器
# -t,表示需要打开终端
# --name,容器名字
# -p,端口映射,格式【宿主机端口:容器端口】
# -v,目录映射,格式【宿主机目录:容器目录】
# centos:centos7.9.2009,镜像
docker run
--name mysql
-p 3306-3310:3306-3310
-v /opt/data/docker/centos79_mysql:/opt/data
--privileged -dt
centos:centos7.9.2009
在 Mac 宿主机上,连接容器中的 MySQL,需要指定 -p 选项做端口映射,然后通过 宿主机 IP + 映射的宿主机端口连接容器中的 MySQL。
3、安装 VSCode 扩展
VSCode 扩展包含两部分:安装在宿主机的扩展、安装在容器中的扩展。
我们先打开 VSCode,安装宿主机 Docker 扩展:

安装 Docker 扩展之后,我们就能在 VSCode 中看到之前创建的 mysql 容器了:

点击 Attach Visual Studio Code 会打开一个新的 VSCode 窗口,我们给它取个名字:mysql 容器窗口,后面会用到。
接下来,在 mysql 容器窗口安装扩展。
安装 C/C++ 扩展:


安装 CMake Tools 扩展:


4、准备编译
在宿主机执行以下命令,进入 mysql 容器:
docker exec -ti mysql /bin/bash
在 mysql 容器中执行以下命令,下载源码、安装依赖软件:
# 创建存放源码的根目录
mkdir -p /opt/data/code
# 进入存放源码的根目录
cd /opt/data/code
# 安装 wget、下载源码 & 解压
yum install wget
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-boost-8.0.32.tar.gz
tar zxvf mysql-boost-8.0.32.tar.gz
# 修改源码目录名
mv mysql-8.0.32 8.0.32
# 用于安装 cmake3 的 yum 源
yum -y install epel-release
# 用于安装高版本 gcc、gcc-c++、make 的 yum 源
yum -y install centos-release-scl
# 安装依赖软件
yum install devtoolset-11-gcc
devtoolset-11-gcc-c++
devtoolset-11-make
cmake3
openssl-devel
ncurses-devel
bison
# 安装 gdb
yum install devtoolset-11-gdb
# 让 scl 环境临时生效
source /opt/rh/devtoolset-11/enable
# 让 scl 环境永久生效
yum install vim
vim /etc/profile.d/scl.sh
# 把以下内容写入 scl.sh,然后保存退出
source /opt/rh/devtoolset-11/enable
5、编译
编译过程按以下步骤进行:
第 1 步,在 mysql 容器窗口中打开刚下载的 MySQL 源码目录:

第 2 步,创建 .vscode 目录:

第 3 步,新建 CMake 配置文件 settings.json:

settings.json 文件内容如下:
{
"cmake.buildBeforeRun": true,
"cmake.buildDirectory": "${workspaceFolder}/output",
"cmake.configureSettings": {
"WITH_DEBUG": "1",
"CMAKE_INSTALL_PREFIX": "${workspaceFolder}/output",
"MYSQL_DATADIR": "/opt/data/8.0.32/data",
"SYSCONFDIR": "/opt/data/8.0.32/etc",
"MYSQL_TCP_PORT": "3306",
"MYSQL_UNIX_ADDR": "/opt/data/8.0.32/data/mysql-debug.sock",
"WITH_BOOST": "${workspaceFolder}/boost",
"DOWNLOAD_BOOST": "0"
},
"files.associations": {
"*.ipp": "cpp"
},
"cmake.parallelJobs": 8,
"cmake.cmakePath": "cmake3"
}
cmake.parallelJobs 用于控制多少个线程同时进行编译,以加快编译速度,默认值为 0,CMake 会根据 CPU 核数自行确定并发线程数。
如果编译过程中报以下错误,有两种解决方案:
c++: internal compiler error: Killed (program cc1plus)
方案 1:把 cmake.parallelJobs 设置的小一点,我在编译过程中把并发数设置为 10 会报错,后来改为 8 就能成功编译了。
方案 2:在 Docker Desktop 中调整容器能够使用的资源,如下:

想要编译的更快,可以把 cmake.parallelJobs 设置为 0,然后,在以上 Docker Desktop 界面中,把 CPU、Memory 两项调大。
第 4 步,CMake 配置,生成 Makefile 文件:在 mysql 容器窗口顶部的输入框中,输入 > CMake: 配置,然后选择下面列出来的 CMake 配置,开始生成 Makefile 文件。

选择编译器:

如果 CMake:配置执行过程中出现了错误,解决错误之后需要删除 CMakeCache.txt,然后重新执行 CMake:配置步骤。
CMakeCache.txt 文件路径为 /opt/data/code/8.0.32/output/CMakeCache.txt。
第 5 步,编译服务端可执行程序 mysqld:
在输入框中输入“> CMake: 生成目标”,选中第 2 个红框中的选项。

接着会出现另一个输入框,在其中输入 mysqld,然后回车,就开始编译 mysqld 了。

第 6 步,编译客户端可执行程序 mysql:
在输入框中输入“> CMake: 生成目标”,选中第 2 个红框中的选项。

接着会出现另一个输入框,在其中输入 mysql,然后回车,就开始编译 mysql 了。

6、初始化
接下来,依然是在 mysql 容器中执行以下命令:
# 创建配置文件目录 & 数据目录
mkdir -p /opt/data/8.0.32/{etc,data}
# 创建用户 & 组
groupadd mysql
useradd -g mysql mysql
# 创建配置文件
vim /opt/data/8.0.32/etc/my.cnf
# 把以下内容下入 my.cnf
[mysqld]
user=mysql
innodb_file_per_table=1
server_id=100
log_bin=ON
lc-messages-dir=/opt/data/code/8.0.32/output/share
log-error=/opt/data/8.0.32/error.log
# 初始化数据目录
/opt/data/code/8.0.32/output/bin/mysqld --initialize-insecure
7、调试
经过前面一系列操作之后,就可以开始着手在 mysql 容器窗口中调试了。
第 1 步,新建配置文件 launch.json:

launch.json 文件内容如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "/opt/data/code/8.0.32/output/bin/mysqld",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
第 2 步,启动调试,launch.json 文件配置完成之后,运行和调试下拉框就能看到刚刚添加的配置,点击 (gdb) 启动前面的小三角,启动 MySQL,然后就可以开始调试了。

第 3 步,在 mysql 容器的命令行中,通过前面编译的客户端可执行程序 mysql,连接 MySQL:
cd /opt/data/code/8.0.32/output/bin
./mysql -h127.0.0.1 -uroot
第 4 步,连接 MySQL 成功之后,在 MySQL 源码中打个断点,先打开 sql/sql_parse.cc 文件:

然后在 mysql_execute_command() 函数入口处打上断点:

第 5 步,执行一条 SQL:
SELECT host, user FROM mysql.user;
程序在断点处暂停之后,就可以查看一系列运行时信息了,查看断点所在函数的局部变量:

查看断点处的调用栈:

也可以在调试控制台中,用命令行执行更多 gdb 命令:

VSCode + Docker 调试,需要在命令之前加上 -exec,上图中命令 p thd->m_query_string 前面就加上了 -exec。
8、总结
本文介绍了 VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境的完整流程。
本文转载自微信公众号「一树一溪」,可以通过以下二维码关注。转载本文请联系一树一溪公众号。

到这里,我们也就讲完了《一文详解MySQL调试环境的搭建步骤》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

- 上一篇
- 深入解析MySQL为什么要尽量避免使用唯一索引!

- 下一篇
- Redis 的 BigKey、HotKey 又引发了线上事故!
-
- 玩命的滑板
- 太细致了,mark,感谢楼主的这篇文章,我会继续支持!
- 2023-05-17 18:56:04
-
- 奋斗的哈密瓜,数据线
- 这篇技术文章太及时了,很详细,很好,mark,关注老哥了!希望老哥能多写数据库相关的文章。
- 2023-05-12 15:06:38
-
- 威武的飞鸟
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢作者大大分享技术文章!
- 2023-05-11 02:17:49
-
- 数据库 · MySQL | 24分钟前 | mysql 字符集 中文乱码 utf8mb4 utf8mb4_unicode_ci
- MySQL中文乱码解决方案与字符集修改命令大全
- 339浏览 收藏
-
- 数据库 · MySQL | 1天前 | 索引 数据类型 字符集 存储引擎 CREATETABLE
- MySQL新建表操作指南与建表技巧
- 462浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 条件判断
- CASEWHEN条件判断的嵌套使用详解与实战场景分析
- 469浏览 收藏
-
- 数据库 · MySQL | 1个月前 | java php
- CSV文件批量导入MySQL的性能优化秘籍大揭秘
- 289浏览 收藏
-
- 数据库 · MySQL | 1个月前 |
- GaleraCluster多主集群配置与冲突解决攻略
- 239浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 窗口函数实战
- MySQL窗口函数实战案例深度剖析
- 315浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 20次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 29次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 34次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 43次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 36次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang进程内存控制避免docker内oom
- 2022-12-22 160浏览
-
- golang进程在docker中OOM后hang住问题解析
- 2022-12-22 105浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览