mysql 源码编译 windows-MySQL8.0源码编译及Clion调试

MySQL是最流行的开源关系数据库之一,有大量关于其使用、优化和运维的文章。 我个人还写过《和》系列文章,详细介绍了MySQL的内存结构、持久化机制、锁和事务等。 不过,以上知识大多来自于《高性能MySQL》、《MySQL技术内幕:InnoDB存储引擎》等书籍以及网上一些优秀博主的文章。

所以我也希望能更进一步,进入MySQL源码层面,从源码中了解它的具体实现,为自己积累数据库内核开发经验。 虽然关于MySQL和RocksDB的源码阅读已经持续了半年左右,但现在希望能开一个新的坑,从源码层面讲解MySQL。

如果想要了解数据库内核开发,直接阅读MySQL庞大的源码并不是最好的方式。 读者可以从 Pingcap Talent 和 CMU 15-445/645 等课程开始。 然而,我只是一个学习者。 写系列文章更多的是通过记录和输出来帮助学习,所以如有错误,还请读者指出。

在阅读源码的过程中,最好能反复自动调试和理解代码的实现,所以MySQL代码的编译和调试非常重要,但是整个过程中还是遇到了一些坑,所以这里记录整个过程以及遇到的坑。

操作系统环境

我在个人桌面上重新安装了Ubuntu 20.04mysql 源码编译 windows,内核版本为5.13.0-44-generic,内存为16G,磁盘为240G。 依赖相关的编译工具版本如下。

相关安装命令来自PolarDB-安装部署文档,通过源码编译,专门适配Ubuntu 20版本。 Centos版本可以查看其文档。

 安装GCC7
apt install -y gcc-7 g++-7
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60
                        --slave /usr/bin/g++ g++ /usr/bin/g++-7
update-alternatives --config gcc
gcc --version
g++ --version

# 安装依赖
apt install make automake cmake git bison libaio-dev libncurses-dev libsasl2-dev libldap2-dev libssl-dev pkg-config

mysql 源码编译 windows_源码编译安装_源码编译器

MySQL源代码下载

我们选择最新版本8.0.28,可以直接下载带有Boost第三方库依赖的源码。

Boost是一个功能强大、结构独特、跨平台、开源且完全免费的C++库,可以认为是半个C++标准库。 MySQL的代码依赖于Boost库,所以直接下载一个携带Boost库的源码就更省心了,不需要下载对应的Boost库。

编译命令

我们首先需要使用cmake来编译。 可以直接使用命令行mysql 源码编译 windows,也可以使用Clion开发后配置相应的cmake编译配置。

其中,与CMake Options相关的一些参数如下:

源码编译安装_mysql 源码编译 windows_源码编译器

-DWITH_BOOST=~/work/c++/mysql-8.0.28/boost -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/home/homer/build -DMYSQL_DATADIR=/home/homer/build/data -DSYSCONFDIR=/home/homer/build -DMYSQL_UNIX_ADDR=/home/homer/build/data/mysql.sock -DMYSQL_MAINTAINER_MODE=false

其中比较重要的是:

然后执行命令进行编译,这可能需要几分钟的时间,并且可能会出现各种错误和问题。 本文上方记录了问题和错误。

克利翁调试

如果Clion的CMake执行成功,就会出现相应的Run/Debug Configurations选项,里面会有一个名为mysqld的选项,这是MySQL Server启动的选项。 可以使用该选项先初始化MySQL数据目录,并生成相应的配置文件和用户名密码。 然后使用该选项启动 MySQL Server。 两个操作对应的参数不同。

第一步初始化数据目录时,还需要先创建对应的用户。

# 创建 MySQL 用户组和 MySQL 用户
groupadd mysql
useradd -r -g mysql -s /bin/false mysql

源码编译器_mysql 源码编译 windows_源码编译安装

然后使用clion的mysqld执行选项,输入的Program参数如下:

--basedir=/home/homer/build --datadir=/home/homer/build/data --lower_case_table_names=0 --initialize-insecure --user=mysql

其中--initialize-insecure表示非安全初始化,可以设置无密码的用户。 然后需要给对应的文件夹添加读、写、执行权限。

chmod -R 777 /home/homer/build/data

初始化完成后,可以继续使用clion的mysqld执行选项来启动MySQL。 输入程序参数如下:

--basedir=/home/homer/build --datadir=/home/homer/build/data --lower_case_table_names=0 --user=mysql

然后我们可以在/home/home/build/bin目录下执行./mysql -uroot -h127.0.0.1 -P3306 -p来使用客户端连接MySQL Server。 登录时不需要密码,直接按 Enter 键即可。

然后就可以看到我们在clion中设置断点的代码逻辑被拦截了,我们可以调试读取下面的代码。

问题记录

整个过程中,尤其是编译阶段,遇到了很多问题。 我在这里简单记录一下。 相信不同的朋友在这个过程中会遇到不同的问题。 请耐心解决。

1.default.cfg不存在

编译时会报如下错误:

CMake Error: File /home/homer/work/c++/mysql-8.0.28/router/src/harness/tests/data/logger.d/default.cfg does not exist.

CMake Error at router/cmake/testing.cmake:211 (CONFIGURE_FILE):

可以在cmake配置文件中找到如下片段,直接删除即可。

mysql 源码编译 windows_源码编译安装_源码编译器

CONFIGURE_TEST_FILE_TEMPLATES(${CMAKE_CURRENT_SOURCE_DIR}/data
"tests-good-1.cfg.in;tests-good-2.cfg.in;tests-start-1.cfg.in")
SET(TEST_FILES
logger.cfg
magic-alt.cfg
tests-bad-1.cfg
tests-bad-2.cfg
tests-bad-3.cfg
)

2. 将警告编译为错误

编译过程中发现编译器会将warning当成错误,导致整个编译过程失败。 具体错误如下。

cc1plus: all warnings being treated as errors

经过查找,终于在文档中找到了对应的解决方案版本。 您需要将 DMYSQL_MAINTAINER_MODE 设置为 false,否则会导致编译器将警告视为错误。

Embedding可以理解为组合或者代理模式的手动句子糖。

3.编译缓存

编译异常后,需要删除对应的cmake缓存,重新编译,否则每次都会读取缓存,报同样的错误。

后记

我个人编译和调试MySQL源码的过程如本文所示,稍后我将开始阅读和学习相关源码。 希望大家继续关注。