环境准备

系统:Kylin V10

源码安装官方文档:https://dev.mysql.com/doc/refman/8.4/en/source-installation.html

官网源码下载地址:https://downloads.mysql.com/archives/community/

8.0 源码命令直接下载:wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.20.tar.gz

8.0.20 源码下载:wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.20.tar.gz

cmake(我下载的 4.0 版本):https://cmake.org/files/

系统配置

推荐 2c4g

安装目录 basedir

/usr/local/mysql

数据目录 datadir

/app/data

端口号

3306

socket 文件位置

/tmp/mysql.sock

依赖相关说明

依赖库

包名

核心作用

对 MySQL 8.0.20 的意义

gcc

C 语言编译器

必需:MySQL 核心代码基于 C 编写,编译核心二进制文件(如 mysqld)

gcc-c++

C++ 语言编译器

必需:MySQL 8.0 + 大量核心模块(如 InnoDB、Boost 依赖)基于 C++14 编写

bison

语法分析器生成工具

必需:解析 MySQL 的 SQL 语法规则,生成语法分析器

flex

词法分析器生成工具

必需:配合 bison,解析 SQL 语句的词法(如关键字、标识符)

pkg-config

依赖包配置查询工具

必需:帮助 CMake 找到 openssl、zlib 等依赖的头文件 / 库文件路径

openssl-devel/openssl

OpenSSL 开发库 / 运行库

必需:支持 MySQL 的 SSL/TLS 加密连接(如远程连接加密、数据传输加密)

ncurses-devel

终端图形界面开发库

必需:支撑 MySQL 的命令行客户端(mysql)的交互界面(如光标移动、菜单显示)

bison-devel

bison 的开发头文件 / 库

必需:编译时依赖 bison 的底层开发接口,生成 SQL 语法解析模块

libaio/libaio-devel

异步 I/O 开发库 / 运行库

必需:支撑 InnoDB 存储引擎的异步 I/O 操作(提升磁盘读写性能,MySQL 核心性能依赖)

libtirpc/libtirpc-devel

RPC(远程过程调用)开发库

必需:支撑 MySQL 的组复制(Group Replication)组件的远程通信功能

rpcsvc-proto-devel/rpcgen

RPC 协议生成工具 / 开发库

必需:配合 libtirpc,生成 MySQL 组复制的 RPC 通信协议代码

zlib-devel

压缩算法开发库

必需:支撑 MySQL 的数据压缩功能(如 InnoDB 表空间压缩、二进制日志压缩)

numactl-devel

NUMA(非均匀内存访问)开发库

必需:适配多 CPU 架构服务器,优化 MySQL 内存分配(提升多核性能)

boost-devel

Boost C++ 库开发包

必需:MySQL 8.0.20 强依赖 Boost 1.70.0,该包提供 Boost 的基础开发接口(需手动下载对应版本源码,此包为系统基础依赖)

perl

Perl 解释器

必需:MySQL 的部分编译脚本、测试脚本基于 Perl 编写

perl-Data-Dumper

Perl 数据序列化模块

辅助:编译过程中解析 / 输出配置数据,测试模块数据展示

perl-JSON

Perl JSON 解析模块

辅助:处理编译过程中的 JSON 格式配置 / 日志

perl-Test-Simple

Perl 测试框架

辅助:运行 MySQL 编译后的单元测试,验证功能完整性

Cmake 作用?

CMake 是一个跨平台的构建系统生成器,是编译大型C/C++项目(如MySQL 8.0)的核心工具。您可以把它理解为一个“项目构建的总工程

Boost 作用?

Boost 是一个免费、开源的 C++ 标准库扩展集,它提供了大量高质量、可移植的 C++ 工具类和函数,填补了 C++ 标准库的功能空白,同时也是很多大型开源项目的核心依赖。

对于 MySQL 来说,Boost 不是可选依赖,而是编译必需的核心库,主要用于以下功能:

1. 异步 I/O 操作:支撑 MySQL 的高性能并发处理能力;

2. 正则表达式处理:用于 SQL 语句中的正则匹配逻辑;

3. 智能指针、容器扩展:补充 C++ 标准库的容器和内存管理能力;

4. 线程与并发控制:助力 MySQL 多线程架构的稳定运行。

cmake 参数说明

参数

具体含义

-DDOWNLOAD_BOOST=1

启用自动下载 Boost 库的功能(如果本地未找到适配版本),MySQL 8.0 依赖特定版本的 Boost 库

-DWITH_BOOST=../boost

指定 Boost 库的本地路径为当前目录上级的 boost 文件夹,优先使用本地库而非下载

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-8.0.20

指定 MySQL 编译完成后的安装根目录

-DMYSQL_DATADIR=/app/data

指定 MySQL 数据库数据文件的存储目录(数据持久化的核心路径)

-DCMAKE_POLICY_VERSION_MINIMUM=3.5

指定编译时要求的最低 CMake 策略版本为 3.5,确保编译策略兼容性

-DCMAKE_CFLAGS="-I/usr/include/tirpc"

为 C 编译器添加头文件搜索路径,指定 tirpc(远程过程调用)库的头文件目录

-DCMAKE_CXX_FLAGS="-I/usr/include/tirpc"

为 C++ 编译器添加头文件搜索路径,作用同上(适配 C++ 代码编译)

-DCMAKE_LDFLAGS="-ltirpc"

链接时指定链接 tirpc 库,解决 MySQL 编译时对 tirpc 库的依赖

-DWITH_INNOBASE_STORAGE_ENGINE=1

启用 InnoDB 存储引擎(MySQL 8.0 默认核心引擎,必须启用)

-DMYSQL_TCP_PORT=3306

指定 MySQL 服务监听的 TCP 端口为 3306(默认端口)

-DDEFAULT_CHARSET=utf8mb4

设置数据库默认字符集为 utf8mb4(支持完整 Unicode,包括 emoji)

-DDEFAULT_COLLATION=utf8mb4_general_ci

设置默认字符集的排序规则为 utf8mb4_general_ci(不区分大小写的通用排序)

-DWITH_SYSTEMD=1

启用 systemd 支持,生成适配 systemd 的服务文件,便于系统管理 MySQL 服务

-DLOWER_CASE_TABLE_NAMES=1

设置表名大小写不敏感(1 表示将表名转换为小写存储,适配 Windows/Linux 跨平台)

-DMYSQL_USER=mysql

指定运行 MySQL 服务的系统用户为 mysql(需提前创建该用户)

-DWITH_SSL=system

使用系统自带的 SSL 库(而非 MySQL 内置的),提升安全性和兼容性

-DDISABLE_SHARED=OFF

禁用 "关闭共享库编译" 的选项(即启用编译共享库),生成动态链接的 MySQL 库文件

-DWITH_ZLIB=system

使用系统自带的 zlib 压缩库(而非内置版本),提升压缩性能和系统兼容性

部署流程

  1. 下载依赖及软件包

#cmake安装
tar xf cmake-4.0.0-linux-x86_64.tar.gz -C /opt
ln -s /opt/cmake-4.0.0-linux-x86_64/bin/cmake /usr/local/bin/cmake
cmake --version   #应显示4.0.0版本

#更新缓存
yum clean all && yum makecache fast
#安装依赖库
yum install -y lrzsz curl telnet wget tar vim unzip zip gcc gcc-c++ git openssl-devel perl ncurses-devel bison-devel libaio libaio-devel libtirpc-devel rpcsvc-proto-devel rpcgen openssl make bison flex pkg-config zlib-devel numactl-devel perl-Data-Dumper perl-JSON perl-Test-Simple boost-devel libtirpc libtirpc-devel     

[root@db777 ~]# gcc --version
gcc (GCC) 7.3.0

#下载mysql8.0.20源码包
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.20.tar.gz
  1. 解压与依赖检查

#解压mysql8.0.20源码包
tar xf mysql-boost-8.0.20.tar.gz -C /usr/local/
cd  /usr/local/mysql-8.0.20/

#创建编译目录
mkdir build && cd build

tips:编译mysql-boost-8.0.20时,为什么要单独创建编译文件夹build?
答:编译过程中会产生大量的临时文件和对象文件。
将这些文件与源代码分开,可以保持源代码目录的整洁,
使得管理和维护变得更加容易。当你需要清理编译过程中产生的所有文件时,
只需要删除这个单独的编译目录即可,而不会影响到源代码文件。

#执行cmake检查依赖
cmake .. \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=../boost \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-8.0.20 \
-DMYSQL_DATADIR=/app/data \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
-DCMAKE_CFLAGS="-I/usr/include/tirpc" \  
-DCMAKE_CXX_FLAGS="-I/usr/include/tirpc" \   
-DCMAKE_LDFLAGS="-ltirpc" \        
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_SYSTEMD=1 \
-DLOWER_CASE_TABLE_NAMES=1 \
-DMYSQL_USER=mysql \
-DWITH_SSL=system \
-DDISABLE_SHARED=OFF \
-DWITH_ZLIB=system

#以上依赖在我部署中的环境已足够,如果还是遇到缺少依赖问题
#安装所缺少的依赖,清除Cmake缓存与脚本,重新执行cmake检查
rm -rf CMakeCache.txt CMakeFiles/

#检查直到无报错就表示依赖已经准备好了(警告没关系),可以进行编译
  1. 编译与安装

# 编译(-j后跟CPU核心数,比如4核写-j4,提升速度)
make -j $(nproc)

# 安装(将编译后的文件复制到指定安装目录)
make install

ll /usr/local/mysql-8.4.0/bin/mysqld

#创建虚拟用户
useradd -M -s /sbin/nologin mysql 
# 创建数据目录并授权
mkdir -p /app/data
chown -R mysql:mysql /app/data
chmod -R 755 /app/data
  1. 初始化与配置 mysql

# 进入MySQL的bin目录
cd /usr/local/mysql-8.0.20/bin

#创建安装目录
mkdir -p /usr/local/mysql
# 执行初始化
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql  --datadir=/app/data --lower-case-table-names=1
#生成临时密码:twgkVi=e4Kg 你也可以选择不加密方式初始化

# 编写配置文件
vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/app/data
socket=/tmp/mysql.sock
port=3306
user=mysql
log-error=/app/data/mysqld.log
pid-file=/app/data/mysqld.pid
lower_case_table_names=1
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

[client]
socket=/tmp/mysql.sock

cp /usr/local/mysql-8.0.20/support-files/mysql.server /etc/init.d/mysqld

# 修改配置文件(大概在45-55行左右)
vim /etc/init.d/mysqld
basedir=/usr/local/mysql-8.0.20
datadir=/app/data

# 添加执行权限并设置开机自启
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on

# 启动:
service mysqld start
service mysqld status

# 配置环境变量
echo 'export PATH=/usr/local/mysql-8.0.20/bin:$PATH' >> /etc/profile

# 生效环境变量
source /etc/profile

# 验证
mysql --version

# 登录验证
mysql -u root -p
密码:twgkVi=e4Kg

# 修改密码
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
EXIT;

所遇问题总结

CMake 版本过旧 (Compatibility with CMake < 3.5 has been removed)
根因:CMake 版本为 4.0.0,但 MySQL 8.0.20 的extra/zstd组件 CMake 脚本版本声明格式老旧,触发高版本 CMake 的兼容性校验。

解决方案:

方案一:强制指定最低兼容版本(我用的这个方案,已添加到cmake检查参数)
在 CMake 命令中添加参数-DCMAKE_POLICY_VERSION_MINIMUM=3.5,强制指定最低兼容版本。

方案二:更新Cmake(非常耗时)
# 1. 安装编译依赖
sudo yum install -y gcc gcc-c++ make openssl-devel
# 2. 下载较新的CMake源码包
cd /tmp
wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3.tar.gz
tar -xzf cmake-3.28.3.tar.gz
cd cmake-3.28.3
# 3. 编译安装
./bootstrap
make -j$(nproc)
sudo make install
# 4. 验证新版本(默认安装到 /usr/local/bin)
/usr/local/bin/cmake --version
# cmake version 3.28.3
# 创建软链接覆盖旧版本
sudo ln -sf /usr/local/bin/cmake /usr/bin/cmake
Boost 版本不匹配 (Boost minor version found is 77 we need 70)
根因:之前为 MySQL 8.4.0 准备的 Boost 1.77.0 用于 8.0.20,后要求 Boost 1.70.0。
MySQL 与 Boost 库存在版本强绑定关系,不同 MySQL 主版本 / 次版本要求固定的 Boost 版本,
MySQL 8.0.19-8.0.21 → 必须 Boost 1.70.0
MySQL 8.4.x → 必须 Boost 1.77.0

解决方案:

方案一:启用自动下载 Boost 库的功能(我用的这个方案,已添加到cmake检查参数)
-DDOWNLOAD_BOOST=1

方案二:提前下好Boost1.70.0依赖(我不推荐,国外的地址,下载慢,网络不稳定容易中断)
地址:https://www.boost.org/users/history/version_1_70_0.html
#创建Boost工具目录
mkdir -p /opt/boost
tar xf boost_1_70_0.tar.gz -C /opt/boost --strip-components=1
# 验证Boost解压结果(有bootstrap.sh则正确)
ls /opt/boost | grep bootstrap.sh
#使用此方案,需要在cmake检查时,指定Boost目录
-DBOOST_ROOT=/opt/boost
缺少系统库 (Could not find rpc/rpc.h)
根因:现代 Linux 将部分 RPC 函数移入单独的 libtirpc 库。缺少其开发包(libtirpc-devel)导致编译找不到头文件和库。

解决:
yum -y install libtirpc-devel

内存/交换空间不足 (ld 以信号 9 [已杀死] 退出)

现象:编译到最后链接阶段被系统强制终止。

根因:链接器 (ld) 合并所有目标文件时内存需求激增,超过物理内存(1.9GiB)。内核 OOM Killer 为保护系统而终止了最耗内存的进程。

我刚开始用的 2c2g,在编译快结束时报错,内存溢出系统主动中断编译,破大防!!!

所以还是推荐内存高一点:2c4g