我把个人的聊聊台式机重装了 Ubuntu 20.04 ,内核版本是源译和 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 # 安装依赖 我们选择最新的 8.0.28版本,可以去 https://dev.mysql.com/downloads/mysql/ 直接下载带 Boost 第三方库依赖的码编源码。 Boost 是聊聊一个功能强大、构造精巧、源译和跨平台、码编开源并且完全免费的聊聊 C++ 程序库,可以认为是源译和半个C++标准库。MySQL 的码编代码依赖 Boost库,所以直接下载一个携带Boost库的源码比较省心,不需要再去下载对应的Boost库。 我们首先需要使用 cmake 进行编译,可以直接使用命令行,站群服务器也可以用 Clion 开发后,配置对应的cmake编译配置。 其中,有关 CMake Options 的部分参数如下所示: 其中比较重要的有: 然后执行命令进行编译,大概会花费数分钟的时间,并且可能会出现各类错误和问题。问题和错误会在本文后边进行记录。 如果Clion的CMake执行成功后,就会出现对应的 Run / Debug Configurations 选项,里边会有名称为mysqld的选项,它就是 MySQL Server 启动的选项。可以先用该选项执行 MySQL 数据目录的初始化操作,高防服务器生成对应的配置文件和用户名密码。然后再使用该选项来启动 MySQL Server。两个操作对应的参数不同。 第一步初始化数据目录时,也需要先创建对应的用户。 # 创建 MySQL 用户组和 MySQL 用户 groupadd mysql 然后使用 clion 的 mysqld 执行选项,输入的 Program arguments 如下所示: 其中 --initialize-insecure 表示非安全的初始化,可以设置无密码的用户。然后需要给对应的文件夹添加读写和执行权限。 初始化后,就可以继续使用 clion 的 mysqld 执行选项来启动 MySQL了。输入的 Program arguments 如下所示: 然后我们可以在 /home/homer/build/bin 目录下执行 ./mysql -uroot -h127.0.0.1 -P3306 -p来使用客户端连接 MySQL Server。登录时无需密码,直接回车。 然后就可以看到我们在clion中设置断点的代码逻辑被拦截,下面我们就可以进行调试和代码阅读了。 在整个过程中,特别是编译阶段遇到了很多问题,这里也简单记录一下,相信不同的同学进行这个过程中都会遇到不同的香港云服务器问题,大家耐心解决。 编译时会有如下报错: CMake Error: File /home/homer/work/c++/mysql-8.0.28/router/src/harness/tests/data/logger.d/default.cfg does not exist. 可以在 cmake配置文件中找到如下片段,直接删除。 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 在编译过程中,发现编译器会把warning当做error处理,导致整个编译过程失败。具体报错如下所示。 经过搜索最终在 https://dev.mysql.com/doc/mysql-sourcebuild-excerpt/8.0/en/compilation-problems.html 文档中找到了对应的解决版本,需要将DMYSQL_MAINTAINER_MODE设置为false,否则就会导致编译器将warning作为error处理。 嵌入可以理解为一种组合或者代理模式的自动语法糖。 编译异常后,需要删除对应的 cmake cache 后再次进行编译,否则每次都会读取缓存进行相同的报错。操作系统环境
MySQL 源码下载
编译命令
Clion 调试
问题记录