基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25

1. 前言

不妨先听听我编译调试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)

2. 资源下载

2.1 linux平台的mysql源码包: mysql-8.0.25.tar.gz

下载地址:https://downloads.mysql.com/archives/community/
基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25_第1张图片

注:不要下载成 windowns平台的源码包,
Product Version:8.0.25
Operating system :Source Code
OS Version : Generic Linux (Architecture Independent)

2.2 mysql依赖的 boost 源码包: 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的源码包。

2.3 编译调试平台:CLion-2021.2.exe

下载地址: https://www.jetbrains.com/clion/download/#section=windows

2.4 wsl 升级 wsl2 的更新包:wsl_update_x64.msi

下载地址: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
注:wsl 版本 已经是 wsl2 的忽略此资源,我的是最新家庭版 win10,默认依然是 wsl1,不知道 win11 会不会默认使用 wsl2

2.5 Ubuntu20.04 离线安装包 : Ubuntu_2004.2020.424.0_x64.appx

下载地址:https://aka.ms/wslubuntu2004
注:win10 系统有微软商店的 忽略此资源

3. 环境准备

3.1 WLS2 环境搭建

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

3.2 Ubuntu20.04 安装

通过微软商店搜索安装即可,如果没有微软商店也可以离线安装,具体可以百度。装好后,先 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

3.3 Clion2021.2安装

这个就更不要说了,众所周知,只要会用 idea的基本都会用,我使用的是商业版(试用30天,到期后删干净重装可以再次试用30天,重复此过程直到出新版本为止),社区版可能也没问题,但未试过

3.4 解压源码

  • 把mysql源码解压到你自定义的一个目录,比如:d:/projects,解压后产生 d:/projects/mysql-8.0.25目录;
  • d:/projects/mysql-8.0.25目录下新建boost文件夹,把 boost_1_73_0.tar.gz放到这个文件夹下即可;
  • 如果你想让cmake过程快些,最好提前帮它把boost_1_73_0.tar.gz解压,解压后产生d:/projects/mysql-8.0.25/boost/boost_1_73_0目录

4. 编译

4.1 编译配置

用clion 打开 d:/projects/mysql-8.0.25,刚一打开会有配置提示,如何没有就去设置中找,如图:
基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25_第2张图片
基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25_第3张图片
配置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

4.2 开始编译

cmake 成功之后,菜单栏 Build > Build project,这是编译全部,也可以只编译mysqld,如图:
基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25_第4张图片
然后,菜单栏 Build > Build 'mysqld'。建议先编译mysqld,再编译全部

5. mysql 初始化

5.1 查看编译后默认路径

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 默认存放路径

5.2 初始化

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

初始化后,查看数据目录是否有数据了,如果初始化过程遇到一些问题,大多是目录权限导致,通过 chmodchown命令应该就能解决

6. 调试

6.1 mysqld 调试启动

先打开调试配置项,如图:
基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25_第5张图片
基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25_第6张图片
Working directory: 填写 数据目录,如:d:/projects/mysql-8.0.25/build/data
如果不想每次启动调试时,都 build 一次就移除 Before Launch 中的 build 。
最后,点击调试工具栏旁边的 小虫子 图标,mysqld 就启动了,启动时间一般较长,1min也正常

6.2 连接 mysqld

可以用mysql的任何管理工具连接mysql,
host : localhost
username:root
password:不填
我使用的是 clion 自带的 database 插件:基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25_第7张图片

6.3 调试 explain rows 估计过程

导入 mysql8的测试库 sakila ,准备 explain sql 例句

explain select * from sakila.actor where last_name='GUINESS';

用clion 查找 btr0cu.cc 文件,在 5041btr_estimate_n_rows_in_range_low函数处 打断点,
运行 sql 例句,可以看到 程序在此断点停住,如果不是停在此处,按 F9 让程序直接运行到断点即可
基于Windows10 (WSL2 + Ubuntu20.04) 环境 通过 Clion2021.2 编译并调试 mysql-8.0.25_第8张图片

你可能感兴趣的:(mysql,mysql,windows,ubuntu)