完全理解你的感受!MySQL 源碼本地調試確實是一個“坑多”的過程,尤其是當你第一次嘗試從源碼構建和調試 MySQL 時。但別擔心,我來一步步幫你梳理整個流程,并提供一個詳細、可操作的指南,讓你可以順利跑起來 MySQL 源碼并進行本地調試。
? 目標
- 在本地(Linux)編譯 MySQL 源碼
- 支持調試(Debug)
- 能運行、能打斷點、能單步執行
🛠? 第一步:準備環境
? 推薦系統:
本文以 Ubuntu 為例。
📦 安裝依賴包:
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):
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
目錄并進入:
mkdir build && cd build
然后運行如下 支持調試的 CMake 配置命令:
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 \-DCMAKE_SHARED_LINKER_FLAGS="" \-DCMAKE_EXE_LINKER_FLAGS=""
?? 如果提示 Boost 缺失,請確保
-DDOWNLOAD_BOOST=1
已設置,并等待自動下載。
🔨 第四步:開始編譯(耗時較長)
make -j$(nproc)
或者只構建 mysqld 主程序,加快速度:
make mysqld
🗃? 第五步:初始化數據庫
mkdir -p ~/mysql_data ~/mysql_conf
cd ..
scripts/mysqld_pre_systemd_install --basedir=$(pwd) --datadir=~/mysql_data
這會生成默認的配置文件和 root 用戶權限。
?? 第六步:啟動 MySQL 并調試
啟動方式一:直接運行(帶調試信息)
cd build/sql
gdb ./mysqld
在 GDB 中運行:
run --user=$(whoami) --basedir=$(dirname $PWD) --datadir=~/mysql_data
啟動方式二:后臺運行
./mysqld --user=$(whoami) --basedir=$(dirname $PWD) --datadir=~/mysql_data &
🪲 第七步:附加調試器(GDB)
如果你已經啟動了 mysqld,可以用 GDB 附加進程:
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問題
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(自己編譯的)
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
會報錯
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 實現:
./Configure --prefix=/usr/local/openssl darwin64-arm64-cc no-asm
make -j$(nproc)
sudo make install
有時舊配置干擾會導致問題,請先執行:
make clean
make -j$(nproc)
sudo make install
然后設置環境變量:
export PATH="/usr/local/openssl/bin:$PATH"
export LDFLAGS="-L/usr/local/openssl/lib"
export CPPFLAGS="-I/usr/local/openssl/include"
問題2
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 或更高版本。
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
export PATH="/usr/local/bison/bin:$PATH"# 清理構建目錄
rm -rf build/
mkdir build && cd build
有些項目會顯式指定 BISON_EXECUTABLE,你也可以這樣強制使用新版(非必須):
cmake .. -DBISON_EXECUTABLE=/usr/local/bin/bison