mysql-本地編譯 MySQL 源碼

完全理解你的感受!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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907832.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解 shared_ptr 與 enable_shared_from_this

在 C++ 的智能指針體系中,std::shared_ptr 是一個非常重要的工具,它通過引用計數機制幫助我們管理動態分配的對象生命周期,避免內存泄漏。然而,在某些情況下,我們可能需要從一個對象內部獲取指向自身的 shared_ptr,這時候就需要使用 std::enable_shared_from_this 這個輔…

通義開源視覺感知多模態 RAG 推理框架 VRAG-RL:開啟多模態推理新時代

通義實驗室的自然語言智能團隊&#xff0c;憑借深厚的技術積累與創新精神&#xff0c;成功研發并開源了視覺感知多模態 RAG 推理框架 VRAG-RL&#xff0c;為 AI 在復雜視覺信息處理領域帶來了重大突破。 傳統 RAG 方法的局限 傳統的檢索增強型生成&#xff08;RAG&#xff0…

【iOS】方法交換

方法交換 method-swizzling是什么相關API方法交換的風險method-swizzling使用過程中的一次性問題在當前類中進行方法交換類方法的方法交換 方法交換的應用 method-swizzling是什么 method-swizzling的含義是方法交換&#xff0c;他的主要作用是在運行的時候將一個方法的實現替…

Python - 爬蟲;Scrapy框架之插件Extensions(四)

閱讀本文前先參考 https://blog.csdn.net/MinggeQingchun/article/details/145904572 在 Scrapy 中&#xff0c;擴展&#xff08;Extensions&#xff09;是一種插件&#xff0c;允許你添加額外的功能到你的爬蟲項目中。這些擴展可以在項目的不同階段執行&#xff0c;比如啟動…

95套HTML高端大數據可視化大屏源碼分享

概述?? 在大數據時代&#xff0c;數據可視化已成為各行各業的重要需求。這里精心整理了95套高端HTML大數據可視化大屏源碼&#xff0c;這些資源采用現代化設計風格&#xff0c;可幫助開發者快速構建專業的數據展示界面。 ??主要內容?? ??1. 設計風格與特點?? 采用…

redis未授權(CVE-2022-0543)

概述 Redis 默認綁定在 0.0.0.0:6379&#xff0c;在未配置防火墻或訪問控制的情況下會將服務暴露在公網上。若未設置訪問密碼&#xff08;默認通常為空&#xff09;&#xff0c;攻擊者可直接未授權訪問 Redis。利用 Redis 提供的 CONFIG 命令&#xff0c;攻擊者可修改配置并將…

(面試)OkHttp實現原理

OkHttp 是一個高效的 HTTP 客戶端&#xff0c;被廣泛應用于 Android 和 Java 應用中。它提供了許多強大的特性&#xff0c;例如連接池、透明的 GZIP 壓縮、HTTP/2 支持等。理解 OkHttp 的實現原理有助于更好地使用和調試它。 以下是 OkHttp 的一些核心實現原理&#xff1a; 1…

Netty 實戰篇:構建簡易注冊中心,實現服務發現與調用路由

本文將為前面構建的輕量級 RPC 框架添加“服務注冊與發現”功能&#xff0c;支持多服務節點動態上線、自動感知與調用路由&#xff0c;為構建真正可擴展的分布式系統打好基礎。 一、背景&#xff1a;為什么需要注冊中心&#xff1f; 如果每個客戶端都硬編碼連接某個 IP/端口的…

c++之分支

深入理解 C 分支結構&#xff1a;從基礎到實戰 在 C 編程的世界里&#xff0c;分支結構是控制程序流程的重要手段&#xff0c;它賦予程序 “思考” 和 “選擇” 的能力&#xff0c;讓程序能夠根據不同的條件執行不同的代碼塊。本文將帶大家深入探索 C 分支結構&#xff0c;結合…

LLMs之MCP:如何使用 Gradio 構建 MCP 服務器

LLMs之MCP&#xff1a;如何使用 Gradio 構建 MCP 服務器 導讀&#xff1a;本文詳細介紹了如何使用Gradio構建MCP服務器&#xff0c;包括前提條件、構建方法、關鍵特性和相關資源。通過一個簡單的字母計數示例&#xff0c;演示了如何將Gradio應用轉換為LLM可以使用的工具。Gradi…

ubuntu20.04.5-arm64版安裝robotjs

ubuntu20.04.5arm上使用robotjs #ssh&#xff0c;可選 sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo systemctl enable ssh sudo systemctl enable --now ssh #防火墻相關&#xff0c;可選 sudo ufw allow ssh sudo ufw allow 2222/tc…

craw4ai 抓取實時信息,與 mt4外行行情結合實時交易,基本面來覺得趨勢方向,搞一個外匯交易策略

結合實時信息抓取、MT4行情數據、基本面分析的外匯交易策略框架&#xff0c;旨在通過多維度數據融合提升交易決策質量&#xff1a;行不行不知道先試試&#xff0c;理論是對的&#xff0c;只要基本面方向沒錯 策略名稱&#xff1a;Tri-Sync 外匯交易系統 核心理念 「基本面定方…

Python中scapy庫詳細使用(強大的交互式數據包操作程序和庫)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、scapy概述1.1 scapy介紹1.2 安裝1.3 交互模式1.4 安全注意事項二、基本使用2.1 數據包構造基礎2.2 數據包發送2.3 數據包嗅探2.4 數據包分析與操作2.5 網絡掃描技術2.6 協議實現示例三、高級功能3.1 數據包重放3.2 …

基于Web的瀕危野生動物保護信息管理系統設計(源碼+定制+開發)瀕危野生動物監測與保護平臺開發 面向公眾參與的野生動物保護與預警信息系統

博主介紹&#xff1a; ?我是阿龍&#xff0c;一名專注于Java技術領域的程序員&#xff0c;全網擁有10W粉絲。作為CSDN特邀作者、博客專家、新星計劃導師&#xff0c;我在計算機畢業設計開發方面積累了豐富的經驗。同時&#xff0c;我也是掘金、華為云、阿里云、InfoQ等平臺…

[SAP] 矩陣復制(Matrix Copy)

SAP中的復制粘貼功能被稱為矩陣復制&#xff0c;通過點擊對話框或屏幕&#xff0c;并執行下述命令&#xff0c;使用矩陣復制就可以復制多行文本 ① 按下Ctrl-Y&#xff0c;從左上到右下拖拉鼠標來選擇文本 ② 文本高亮顯示后&#xff0c;按下Ctrl-C ③ 移到新的位置插入文本…

【筆記】在 MSYS2(MINGW64)中安裝 Python 工具鏈的記錄

#工作記錄 &#x1f4cc; 安裝背景 操作系統&#xff1a;MSYS2 MINGW64當前時間&#xff1a;2025年6月1日Python 版本&#xff1a;3.12&#xff08;默認通過 pacman 安裝&#xff09;目標工具鏈&#xff1a; pipxnumpypipsetuptoolswheel &#x1f6e0;? 安裝過程與結果記錄…

OpenCV CUDA模塊結構分析與形狀描述符------在 GPU 上計算圖像的原始矩(spatial moments)函數spatialMoments()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于在 GPU 上計算圖像的原始矩&#xff08;spatial moments&#xff09;。這些矩可用于描述圖像中物體的形狀特征&#xff0c;如面積、質…

Nacos實戰——動態 IP 黑名單過濾

1、需求分析 一些惡意用戶&#xff08;?可能是黑客、爬蟲、DDoS ?攻擊者&#xff09;可能頻繁請求服務器資?源&#xff0c;導致資源占用過高。針對這種問題&#xff0c;可以通過IP? 封禁&#xff0c;可以有效拉?黑攻擊者&#xff0c;防止資源?被濫用&#xff0c;保障合法…

opencv + jpeg_turbo(啟用SIMD加速)

背景 opencv的imreadimwrite耗時過大 一張5M的圖片讀用了140ms,寫一張1.7M的圖片用149ms 平臺&#xff1a;mingw64編譯Windows程序版本&#xff1a;opencv4.5.4 加速方案 opencv啟用openmpopencv啟用jpeg_turbojpeg_turbo啟動SIMD加速 下載jpeg_turbo源碼 opencv源碼自帶…

Redis 主從節點

Redis 主從節點的核心區別 特性主節點 (Master)從節點 (Slave/Replica)讀寫權限可讀可寫只讀&#xff08;默認配置&#xff09;數據流向數據來源從主節點同步數據連接關系可連接多個從節點只能連接一個主節點故障切換故障時需要手動/自動提升從節點可被提升為新的主節點命令執…