MacOS 调试 MySQL 5.7源码

389 阅读3分钟

主要参考大神张师傅的博客 juejin.cn/post/684490…

准备IDE

下载安装clion www.jetbrains.com/clion/

编译安装MySQL

# 1. 下载MySQL源码地址
git clone https://github.com/mysql/mysql-server.git

# 2. 生成目录
mkdir -p build_out/data

# 3.编译,注意5.5和5.7的编译命令有点不同,5.7源码编译时,需要下载一个boost.tar.gz,下面的命令选项 -DWITH_BOOST就是指定了boost的下载目录
# 如果不增加这个选项,执行命令的时候也会提示,按照提示增加对应选项即可。
cmake . -DWITH_DEBUG=1 \                                                         
-DCMAKE_INSTALL_PREFIX=build_out \
-DMYSQL_DATADIR=build_out/data \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=boost

# 如果boost由于网络原因下载不了,那么可以自己在源码目录下新建一个boost目录,然后在boost目录下载boost.tar.gz,再在命令执行的时候指定WITH_BOOST选项即可
# 下载命令如下:
wget http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

# 如果cmake没有问题,执行下面命令进行编译,最终会在build_out目录下生成mysql安装后的目录
make && make install

# 4. 初始化mysql数据库

cd build_out

# 注意和5.5版本的初始化命令不一样,在执行命令的时候也会有相关的提示。另外,如果发现执行不成功,检查一下build_out下是否已存在data文件,如果已经存在了的话,初始化data目录的时候会不成功。此时把data文件删掉或者重命名,再执行初始化命令即可。命令执行成功后,会看到build_out/data目录下有mysql、performance_schema等数据目录

./bin/mysqld --initialize

# 5. 如果你不知道自己的数据目录等等保存在了什么地方,也可以cd到build_out,然后通过这个命令看一下

./bin/mysqld --verbose --help

配置CLion

配置CMake

打开CLion的Preferences,然后下图进行添加cmake options,cmake options的内容就是上面的cmake参数。这里再摘出来:

-DWITH_BOOST=../boost -DWITH_DEBUG=1  -DCMAKE_INSTALL_PREFIX=build_out -DMYSQL_DATADIR=build_out/data

Pasted image 20221104111336.png

加了这个配置之后,CLion会再编译一遍,这个时候会在源码目录下看到有这个目录出现:

Pasted image 20221104112134.png

配置mysqld参数

可参考的my.cnf如下,可将其复制粘贴放在源码目录中,然后在运行配置中指定 --defaults-file=/path/to/my.cnf。运行选项非常多,要找到mysqld选项

[mysqld]  
log-error=log.err  
datadir=data  
pid-file=user.pid  
skip-grant-tables  
innodb_file_per_table=1  
port=33061  
transaction_isolation = REPEATABLE-READ  
# 服务端默认字符集  
character-set-server=utf8mb4  
# 连接层默认字符集  
collation-server=utf8mb4_unicode_ci  
  
[client]  
# 客户端来源数据的默认字符集  
default-character-set = utf8mb4  
user=root  
password=root  
  
  
[mysql]  
# 数据库默认字符集  
default-character-set = utf8mb4

Pasted image 20221104112719.png

运行和调试mysqld

运行mysqld

点击运行按钮,如无意外应该可以正常运行。此时运行窗口中是没有输出的,如果有错误日志的输出,可以到 /build_out/data/log.err 里面查看。

也可以通过命令检查mysqld是否真的按照自己设置的端口运行起来了

ps -efa | grep mysqld

通过这个命令可以看到mysqld的启动命令,如果你机器上运行了多个mysqld,通过这个命令就可以很清楚地看到自己通过源码编译安装运行的mysqld是哪个进程了

此时可以通过mysql客户端命令连上去,user_name是root, password是空,就可以看到数据库里面的sys performance_schema和information_schema等库了。

如果使用MySQL WorkBench来连接,这个时候可能不会看到这些库,可以参考 blog.csdn.net/long_yi_199… 打开配置开关,再刷新一下就可以看到了。

调试mysqld

选择sql_parse.cc中的dispatch_command函数,打上断点,以debug模式运行mysqld,然后随便执行一个select语句,就可以看到程序执行到断点的位置了

Pasted image 20221104114035.png

Pasted image 20221104114340.png

总体来说,整个过程还是比较顺利的,准备好调试环境之后,就可以通过调试源码的方式理解mysql中让人比较迷惑的加锁流程了。

本文正在参加「技术专题19期 漫谈数据库技术」活动