本地(Linux)编译 MySQL 源码

完全理解你的感受!MySQL 源码本地调试确实是一个"坑多"的过程,尤其是当你第一次尝试从源码构建和调试 MySQL 时。但别担心,我来一步步帮你梳理整个流程,并提供一个详细、可操作的指南,让你可以顺利跑起来 MySQL 源码并进行本地调试。


✅ 目标

  • 在本地(Linux)编译 MySQL 源码
  • 支持调试(Debug)
  • 能运行、能打断点、能单步执行

🛠️ 第一步:准备环境

✅ 推荐系统:

本文以 Ubuntu 为例。

📦 安装依赖包:

bash 复制代码
sudo apt update
sudo apt install build-essential cmake libncurses-dev \
    libssl-dev libnuma-dev git gdb valgrind \
    libboost-all-dev libreadline-dev pkg-config

🌐 第二步:下载 MySQL 源码

你可以选择官方分支或某个版本的源码。

👇 下载官方源码(例如 MySQL 8.0):

bash 复制代码
git clone https://github.com/mysql/mysql-server.git
cd mysql-server
git checkout 8.0  # 切换到你想要的版本分支

如果你觉得太慢,也可以使用镜像站(如 Gitee)克隆一份加速版。

👇修改CMakeLists.txt中的C++标准

在文件中加入一下内容:

复制代码
# 强制所有 target 使用 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 可选:为所有 target 添加 -std=c++14 编译选项(兼容某些老版本 CMake)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=c++17>)

🧱 第三步:配置 CMake 构建参数(关键步骤)

创建 build 目录并进入:

bash 复制代码
mkdir build && cd build

然后运行如下 支持调试的 CMake 配置命令

bash 复制代码
cmake .. \
  -DCMAKE_BUILD_TYPE=Debug \
  -DFORCE_INSOURCE_BUILD=1 \
  -DWITH_DEBUG=1 \
  -DWITH_SSL=system \
  -DWITH_BOOST=/tmp/mysql_boost \
  -DDOWNLOAD_BOOST=1 \
  -DMYSQL_DATADIR=/home/$(whoami)/mysql_data \
  -DSYSCONFDIR=/home/$(whoami)/mysql_conf \
  -DDEFAULT_CHARSET=utf8mb4 \
  -DDEFAULT_COLLATION=utf8mb4_unicode_ci

⚠️ 如果提示 Boost 缺失,请确保 -DDOWNLOAD_BOOST=1 已设置,并等待自动下载。


🔨 第四步:开始编译(耗时较长)

bash 复制代码
make -j$(nproc)

或者只构建 mysqld 主程序,加快速度:

bash 复制代码
make mysqld

🗃️ 第五步:初始化数据库

bash 复制代码
mkdir -p ~/mysql_data ~/mysql_conf
cd ..
scripts/mysqld_pre_systemd_install --basedir=$(pwd) --datadir=~/mysql_data

这会生成默认的配置文件和 root 用户权限。


▶️ 第六步:启动 MySQL 并调试

启动方式一:直接运行(带调试信息)

bash 复制代码
cd build/sql
gdb ./mysqld

在 GDB 中运行:

gdb 复制代码
run --user=$(whoami) --basedir=$(dirname $PWD) --datadir=~/mysql_data

启动方式二:后台运行

bash 复制代码
./mysqld --user=$(whoami) --basedir=$(dirname $PWD) --datadir=~/mysql_data &

🪲 第七步:附加调试器(GDB)

如果你已经启动了 mysqld,可以用 GDB 附加进程:

bash 复制代码
ps aux | grep mysqld
gdb -p <pid>

然后就可以打断点、查看堆栈、变量等。


🧪 常见问题排查

问题 解决方案
找不到 OpenSSL 确保安装了 libssl-dev,并加上 -DWITH_SSL=system
Boost 报错 加上 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp/mysql_boost
初始化失败 检查数据目录权限:chmod -R 700 ~/mysql_data
编译很慢 只 make mysqld,不要全量 make
CMake 缓存旧 删除 build 文件夹重新配置

💡 小技巧

  • 使用 VS Code + Remote 开发插件 + GDB 插件,体验更佳。
  • 设置断点建议从 main() 函数开始,逐步深入。
  • 如果你只想调试某一部分(如 SQL 解析、事务引擎),可以只构建对应模块。
  • 使用 make VERBOSE=1 查看完整编译命令。

📌 总结:跑起来 MySQL 源码的关键点

步骤 关键点
环境准备 安装所有开发库
获取源码 使用 Git 克隆官方仓库
CMake 配置 启用 Debug、Boost、SSL
编译 使用 -j$(nproc) 加速
初始化 创建数据目录并初始化
调试 使用 GDB 或 IDE 调试器
报错处理 清理缓存、检查依赖路径

问题1 openssl问题

groovy 复制代码
CMake Error at cmake/ssl.cmake:84 (MESSAGE):
  Please install the appropriate openssl developer package.

Call Stack (most recent call first):
  cmake/ssl.cmake:332 (FATAL_SSL_NOT_FOUND_ERROR)
  CMakeLists.txt:1826 (MYSQL_CHECK_SSL)

解决:使用的是自定义 OpenSSL(自己编译的)

groovy 复制代码
git clone https://github.com/openssl/openssl.git
cd openssl
git checkout OpenSSL_1_1_1w  # 或其他稳定分支
./Configure linux-x86_64 --prefix=/usr/local/openssl
make -j$(nproc)
sudo make install

如果是macbook执行./Configure linux-x86_64 --prefix=/usr/local/openssl 会报错

groovy 复制代码
crypto/aes/aesni-mb-x86_64.s:289:8: error: invalid alignment value
.align 32
       ^
crypto/aes/aesni-mb-x86_64.s:387:8: error: invalid alignment value
.align 32
       ^
crypto/aes/aesni-mb-x86_64.s:494:8: error: invalid alignment value
.align 32
       ^
crypto/aes/aesni-mb-x86_64.s:558:1: error: unknown directive
.size aesni_multi_cbc_decrypt,.-aesni_multi_cbc_decrypt
^
crypto/aes/aesni-mb-x86_64.s:559:1: error: unknown directive
.type aesni_multi_cbc_encrypt_avx,@function
^
crypto/aes/aesni-mb-x86_64.s:560:8: error: invalid alignment value
.align 32
       ^
crypto/aes/aesni-mb-x86_64.s:716:8: error: invalid alignment value
.align 32
       ^
crypto/aes/aesni-mb-x86_64.s:1012:1: error: unknown directive
.size aesni_multi_cbc_encrypt_avx,.-aesni_multi_cbc_encrypt_avx
^
crypto/aes/aesni-mb-x86_64.s:1014:1: error: unknown directive
.type aesni_multi_cbc_decrypt_avx,@function
^
crypto/aes/aesni-mb-x86_64.s:1015:8: error: invalid alignment value
.align 32
       ^
crypto/aes/aesni-mb-x86_64.s:1190:8: error: invalid alignment value
.align 32
       ^
crypto/aes/aesni-mb-x86_64.s:1507:1: error: unknown directive
.size aesni_multi_cbc_decrypt_avx,.-aesni_multi_cbc_decrypt_avx
^
make[1]: *** [crypto/aes/aesni-mb-x86_64.o] Error 1
make: *** [all] Error 2

这是在编译 OpenSSL 源码时,汇编文件 aesni-mb-x86_64.s 出现了问题。这类错误通常发生在 不同平台或工具链(Assembler / 编译器)对汇编语法的支持不一致 的情况下。

可以禁用所有汇编优化,使用纯 C 实现:

groovy 复制代码
./Configure --prefix=/usr/local/openssl darwin64-arm64-cc no-asm
make -j$(nproc)
sudo make install

有时旧配置干扰会导致问题,请先执行:

groovy 复制代码
make clean
make -j$(nproc)
sudo make install

然后设置环境变量:

groovy 复制代码
export PATH="/usr/local/openssl/bin:$PATH"
export LDFLAGS="-L/usr/local/openssl/lib"
export CPPFLAGS="-I/usr/local/openssl/include"

问题2

groovy 复制代码
CMake Error at cmake/bison.cmake:137 (MESSAGE):
  Please update to version 3.0.4 or higher
Call Stack (most recent call first):
  CMakeLists.txt:1967 (INCLUDE)

说明:项目在构建时检测到你的 bison 版本低于 3.0.4,而该项目(很可能是 MySQL、MariaDB 或其他数据库项目)要求至少使用 bison 3.0.4 或更高版本。

groovy 复制代码
cd /tmp
curl -O http://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.gz
tar zxpf bison-3.8.2.tar.gz
cd bison-3.8.2
./configure --prefix=/usr/local/bison
make -j$(nproc)
sudo make install
groovy 复制代码
export PATH="/usr/local/bison/bin:$PATH"

# 清理构建目录
rm -rf build/
mkdir build && cd build

有些项目会显式指定 BISON_EXECUTABLE,你也可以这样强制使用新版(非必须):

groovy 复制代码
cmake .. -DBISON_EXECUTABLE=/usr/local/bin/bison
相关推荐
政安晨1 小时前
Ubuntu 服务器无法 ping 通网站域名的问题解决备忘 ——通常与网络配置有关(DNS解析)
linux·运维·服务器·ubuntu·ping·esp32编译服务器·dns域名解析
北极糊的狐2 小时前
MySQL常见报错分析及解决方案总结(1)---Can‘t connect to MySQL server on ‘localhost‘(10061)
数据库·mysql
路溪非溪2 小时前
嵌入式Linux驱动开发杂项总结
linux·运维·驱动开发
Neolock3 小时前
Linux应急响应一般思路(三)
linux·web安全·应急响应
被遗忘的旋律.4 小时前
Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
linux·驱动开发·笔记
轻松Ai享生活4 小时前
minidump vs core dump
linux
轻松Ai享生活5 小时前
详细的 Linux 常用文件系统介绍
linux
张童瑶5 小时前
Linux 离线安装lrzsz(rz、sz上传下载小插件)
linux·运维·centos
十五年专注C++开发6 小时前
通信中间件 Fast DDS(二) :详细介绍
linux·c++·windows·中间件·fastdds
YC运维7 小时前
Linux服务测试题(DNS,NFS,DHCP,HTTP)
linux·网络