不妨先听听我编译调试mysql-8.0.25的过程经历:
经历1:笔记本 win10 下借助另一台centos7系统的主机 通过clion 远程编译调试,这是最麻烦也是坑最多的方式,最终勉勉强强成功。但如果想远程调试又不想用gdb这是唯一的方法。
经历2:笔记本安装双系统,硬盘压缩出100G 安装了ubuntu20.04,然后在ubuntu下安装 clion 编译调试 mysql8 ,大获成功,这说明了在linux下编译调试mysql是坑最少的,毕竟 mysql 是专为 linux 而设计的。但是在双系统间切换,不停的开关机,是真受不了(因为我脱离不了windows,又想调试mysql源码)
经历3:win10下 采用 clion + cygwin 编译调试,遇到了一个毫无头绪的坑,编译时c++编译器找不到mysql 的 uint 的声明。另外,我认为 cygwin 几乎面临淘汰,毕竟 wsl 才是微软的亲儿子(虽然不知道wsl能活多久),而且直接采用了linux的内核,与linux的生态软件无缝兼容。所以,我决定永远弃用cygwin不再考虑。
经历4:win10下 clion + visual studio 2019 编译调试 mysql,遇到的坑也是毫无头绪,至今无法解决。
经历5:win10下 clion + wsl 编译调试win平台的 mysql 源码,这时我并没有完全理解wsl是什么,因为我把wsl理解为了虚拟机,其作用是帮我编译成 win平台的 mysql二进制。而这个理解错误导致了我下面的经历,而且这个方案也遇到问题没成功。
经历6:win10下 visual studio 2019 直接编译调试 win平台的 mysql源码,这其实是一个可行的方案,但是我用惯了Jetbrain 系列产品,对 vs 实在不熟,不知道怎么调试,网上也没有人告诉我如何用 vs 内置的 cmake 编译mysql ,等一系列原因,我最终放弃了。习惯用 vs 的可以采用此方案。
经历7:win10下 clion + wsl 编译调试 linux 平台的 mysql 源码,最终结果就是这篇博文了,这其实是一个非常可行的方案,wsl 正确的理解应该是 类似于 docker, 不能完全理解为虚拟机,微软的心比我想象的要大,其实他们最终的目标是让 linux 平台包括安卓平台的 生态软件 直接在 windows 运行的,所以,wsl 就是想让 linux 与 windows 互相 融合 兼容,分不清彼此,你中有我,我中有你。这个方案,可以让mysql的编译调试像在linux 那样那么简单,唯一的缺点就是比直接在linux系统编译要慢,但这不是我们不用它的理由,因为我们可以换一台优良的笔记本,也可只编译 我们需要的 一部分代码(mysqld)
mysql-8.0.25.tar.gz
下载地址:https://downloads.mysql.com/archives/community/
注:不要下载成 windowns平台的源码包,
Product Version:8.0.25
Operating system :Source Code
OS Version : Generic Linux (Architecture Independent)
boost_1_73_0.tar.gz
下载地址: https://www.boost.org/users/history/
注:每个版本的mysql依赖的boost版本可能不一样,如果下载错了也没关系,cmake的过程会通不过,自然会提示你下载哪个版本;
另外,如果下载的是自身带boost的mysql源码包(mysql-boost-8.0.25.tar.gz
),则忽略本资源;不过本教程仍然尝试使用不带boost的源码包。
CLion-2021.2.exe
下载地址: https://www.jetbrains.com/clion/download/#section=windows
wsl_update_x64.msi
下载地址: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
注:wsl 版本 已经是 wsl2 的忽略此资源,我的是最新家庭版 win10,默认依然是 wsl1,不知道 win11 会不会默认使用 wsl2
Ubuntu_2004.2020.424.0_x64.appx
下载地址:https://aka.ms/wslubuntu2004
注:win10 系统有微软商店的 忽略此资源
wsl2环境搭建不是本博文重点,百度教程也很多,具体可以参考以下官方教程:
https://docs.microsoft.com/zh-cn/windows/wsl/install-manual
大概过程就是先通过 控制面板 开启win10 的两个隐藏功能:适用于Linux的Windows子程序 和 虚拟机平台;然后运行wsl2升级包,并将wsl版本设置到 2 (wsl --set-default-version 2
)
注:下面是重点,就是要修改wsl的配置文件,在自己用户目录(比如我的是:C:\Users\shaofei
)下新建一个名为.wslconfig
的文本文件,内容如下:
[wsl2]
memory=2GB
swap=2GB
意思是,给wsl分配最多2GB 的内存和最多2GB 的交换内存,这个分配是很有必要的,一方面,是限制了wsl2 占用掉所有win10系统的内存(因为linux 的 cache/buffer 会随着I/O操作的积累而积累),另一方面,mysql编译过程是需要一定的 swap交换内存的。这个分配在编译完mysql后可以更改,比如swap可以设置回0
通过微软商店搜索安装即可,如果没有微软商店也可以离线安装,具体可以百度。装好后,先 sudo apt-get update
。值得一提的是,它是基于wsl的,必须要在 wsl 开启之后安装。
大概需要提前预装下面这些依赖,每个系统安装的情况都不一样,具体看cmake怎么报错
# 注:具体装什么以cmake 的控制台输出为准,clion要求的以clion为准
# 以下是clion 要求装的,如果在你的年代你的ubuntu版本不缺这些东西就不用装
sudo apt-get install -y g++ cmake gdb
# 以下是cmake要求装的,如果不装,cmake通不过
sudo apt-get install -y openssl libssl-dev pkgconf
# 以下可以先不装,cmake 可以通过,但不装可能影响调试
sudo apt-get install -y git doxygen bison libtirpc3 libtirpc-dev
这个就更不要说了,众所周知,只要会用 idea的基本都会用,我使用的是商业版(试用30天,到期后删干净重装可以再次试用30天,重复此过程直到出新版本为止),社区版可能也没问题,但未试过
d:/projects
,解压后产生 d:/projects/mysql-8.0.25
目录;d:/projects/mysql-8.0.25
目录下新建boost
文件夹,把 boost_1_73_0.tar.gz
放到这个文件夹下即可;boost_1_73_0.tar.gz
解压,解压后产生d:/projects/mysql-8.0.25/boost/boost_1_73_0
目录用clion 打开 d:/projects/mysql-8.0.25
,刚一打开会有配置提示,如何没有就去设置中找,如图:
配置CMake 时,
Cmake options: -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=../boost
Build directory: build
Build option: -- -j 3
其中,Cmake options是 cmake的命令行参数,如果boost源码包不是按以上目录放得,可以 通过 WITH_BOOST
指定绝对路径。其等价于
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=../boost
Build directory 是编译输出目录,如果不填也可以,clion会自动生成一个目录,等价于
mkdir build
Build option 是make 的参数, -j
是工作线程数,调的越大,并发处理的cmake线程越多,在一定范围内处理的越快,等价于
make -j 8
cmake 成功之后,菜单栏 Build
> Build project
,这是编译全部,也可以只编译mysqld,如图:
然后,菜单栏 Build
> Build 'mysqld'
。建议先编译mysqld,再编译全部
mysql 初始化是在 ubuntu 终端命令行进行的,在windows 的文件资源管理器中找到 mysql源码包路径(d:/projects/mysql-8.0.25/
),按住shift
键,点击鼠标右键,在弹出菜单中选择在此处打开 Linux shell(L)
,然后做下面的操作
cd build/bin
./mysqld --verbose --help
下面只截取有用几条输出结果
# 这是开头的内容,告诉我们mysqld的配置文件默认在哪里找
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
# 这是安装目录
basedir /mnt/d/projects/mysql-8.0.25/build/
# 这是数据目录(重点)
datadir /mnt/d/projects/mysql-8.0.25/build/data/
# 这是 mysql.sock 默认存放路径
socket /tmp/mysql.sock
这些默认位置在 cmake 时是可以指定的,例如:
-DCMAKE_INSTALL_PREFIX
指定安装目录、
-DMYSQL_DATADIR
指定数据目录、
-DSYSCONFDIR
指定配置文件默认路径、
-DMYSQL_UNIX_ADDR
指定mysql.sock 默认存放路径
mysql 初始化具体可以参考mysql官网
https://dev.mysql.com/doc/refman/8.0/en/data-directory-initialization.html
# 初始化之前先创建 mysql 用户及 mysql 用户组
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
cd build/bin
# ./mysqld --initialize 会生成初始密码,我们只是对源码调试,为了后续方便,不需要密码
# 所以只需 --initialize-insecure
./mysqld --initialize-insecure
初始化后,查看数据目录是否有数据了,如果初始化过程遇到一些问题,大多是目录权限导致,通过 chmod
、chown
命令应该就能解决
先打开调试配置项,如图:
Working directory: 填写 数据目录,如:d:/projects/mysql-8.0.25/build/data
如果不想每次启动调试时,都 build 一次就移除 Before Launch 中的 build 。
最后,点击调试工具栏旁边的 小虫子 图标,mysqld 就启动了,启动时间一般较长,1min也正常
可以用mysql的任何管理工具连接mysql,
host : localhost
username:root
password:不填
我使用的是 clion 自带的 database 插件:
导入 mysql8的测试库 sakila ,准备 explain sql 例句
explain select * from sakila.actor where last_name='GUINESS';
用clion 查找 btr0cu.cc
文件,在 5041
行 btr_estimate_n_rows_in_range_low
函数处 打断点,
运行 sql 例句,可以看到 程序在此断点停住,如果不是停在此处,按 F9
让程序直接运行到断点即可