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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;数据流向数据来源从主节点同步数据连接关系可连接多个从节点只能连接一个主节点故障切换故障时需要手动/自动提升从节点可被提升为新的主节点命令执…