MySQL 8.0.35 源码编译安装笔记

环境信息

项目
主机IP 192.168.195.141
操作系统 Kylin Linux Advanced Server V10 (Halberd)
内核 4.19.90-89.11.v2401.ky10.x86_64
glibc 2.28 → 2.34(编译GCC时由openEuler仓库升级)
内存 2.8G + 4G Swap
MySQL版本 8.0.35(源码编译,Source distribution)

1. 确认操作系统支持

MySQL 8.0 支持 Oracle Linux / Red Hat / CentOS / Rocky Linux 等 x86_64 架构,glibc2.17 及以上版本。

bash 复制代码
$ ldd --version | head -1
ldd (GNU libc) 2.28

2. 确认MySQL版本

选择MySQL版本的原则:

  1. 选择 GA 版本。
  2. 选择20之后的小版本。
  3. 新业务可以直接上MySQL 8.0了。

3. 安装编译依赖

bash 复制代码
# yum install cmake gcc gcc-c++ glibc ncurses-devel openssl-devel libaio-devel
Installed:
  cmake-3.16.5-5.p01.ky10.x86_64            cmake-data-3.16.5-5.p01.ky10.noarch
  libaio-devel-0.3.112-5.p01.ky10.x86_64    ncurses-devel-6.2-7.p01.ky10.x86_64
  ...
Complete!

注意 :系统自带GCC 7.3.0不支持<charconv>头文件,MySQL 8.0.35编译需要GCC 8+。需升级GCC,见下方踩坑记录。


4. 升级GCC(解决GCC版本过低问题)

系统自带GCC 7.3.0,编译MySQL 8.0.35时报错:

复制代码
致命错误:charconv:没有那个文件或目录
 #include <charconv>  // from_chars

Kylin V10没有devtoolset包,通过添加openEuler仓库安装GCC 10.3.1:

bash 复制代码
# cat > /etc/yum.repos.d/openEuler.repo << 'EOF'
[openEuler22]
name=openEuler 22.03 LTS SP3
baseurl=https://mirror.iscas.ac.cn/openeuler/openEuler-22.03-LTS-SP3/everything/x86_64/
enabled=0
gpgcheck=0
module_hotfixes=1
EOF

# yum -y --disablerepo='*' --enablerepo=openEuler22 install gcc gcc-c++
Installed:
  gcc-10.3.1-49.oe2203sp3.x86_64    gcc-c++-10.3.1-49.oe2203sp3.x86_64
  ...
Complete!

# gcc --version
gcc (GCC) 10.3.1

5. 安装额外依赖(解决cmake报错)

cmake配置时缺少libtirpc-devel和rpcgen:

bash 复制代码
# yum install -y libtirpc-devel rpcgen
Installed:
  libtirpc-devel-1.2.6-4.p01.ky10.x86_64
  rpcgen-1.4.2-1.ky10.x86_64
Complete!

6. 添加Swap(解决内存不足问题)

主机仅2.8G内存,编译MySQL需要大量内存,添加4G Swap:

bash 复制代码
# dd if=/dev/zero of=/data/swapfile bs=1M count=4096
记录了4096+0 的读入
记录了4096+0 的写出
4294967296字节(4.3 GB,4.0 GiB)已复制,2.35664 s,1.8 GB/s

# chmod 600 /data/swapfile
# mkswap /data/swapfile
正在设置交换空间版本 1,大小 = 4 GiB

# swapon /data/swapfile

# free -h | head -2
              total        used        free      shared  buff/cache   available
Mem:          2.8Gi       200Mi       1.5Gi       0.0Ki       1.1Gi       558Mi
Swap:          6.0Gi      241Mi       5.8Gi

7. 创建用户

bash 复制代码
# groupadd mysql
# useradd -g mysql mysql

# 验证
$ id mysql
用户id=1003(mysql) 组id=1000(mysql) 组=1000(mysql)

8. 下载源码包

bash 复制代码
# cd /usr/src/
# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.35.tar.gz
2026-07-18 22:27:00 (4.90 MB/s) - 已保存 "mysql-boost-8.0.35.tar.gz" [438111810/438111810])

# ls -lh mysql-boost-8.0.35.tar.gz
-rw-r--r-- 1 root root 418M 10月 12  2023 mysql-boost-8.0.35.tar.gz

下载带Boost Headers的源码包(mysql-boost-8.0.35.tar.gz),无需单独下载Boost库。


9. 解压源码包

bash 复制代码
# cd /usr/src/
# tar xvf mysql-boost-8.0.35.tar.gz
# cd mysql-8.0.35/
# mkdir build
# cd build

10. cmake配置

bash 复制代码
# cmake /usr/src/mysql-8.0.35/ -DWITH_BOOST=/usr/src/mysql-8.0.35/boost/boost_1_77_0 -DENABLE_DOWNLOADS=1 -DBUILD_CONFIG=mysql_release

配置成功输出:

复制代码
-- CMAKE_C_LINK_FLAGS: 
-- CMAKE_CXX_LINK_FLAGS: 
-- CMAKE_EXE_LINKER_FLAGS 
-- CMAKE_MODULE_LINKER_FLAGS 
-- CMAKE_SHARED_LINKER_FLAGS 
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/src/mysql-8.0.35/build

11. 编译

bash 复制代码
# make -j 4

编译耗时约1小时(2.8G内存 + 4G Swap,4线程编译)。


12. 安装

bash 复制代码
# make install
Installing: /usr/local/mysql/man/man1/mysqld_safe.1
Installing: /usr/local/mysql/man/man8/mysqld.8
Installing: /usr/local/mysql/man/man1/mysqlrouter.1
Installing: /usr/local/mysql/man/man1/mysqlrouter_passwd.1
Installing: /usr/local/mysql/man/man1/mysqlrouter_plugin_info.1

# 验证
$ /usr/local/mysql/bin/mysql --version
/usr/local/mysql/bin/mysql  Ver 8.0.35 for Linux on x86_64 (Source distribution)

注意版本信息显示 Source distribution,确认是源码编译安装。


13. 编辑配置文件

bash 复制代码
# vim /etc/my.cnf

配置文件内容如下(最小化配置):

ini 复制代码
[client]
socket = /data/mysql/3306/data/mysql.sock
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
user    = mysql
port    = 3306
socket  = /data/mysql/3306/data/mysql.sock
log_error = /data/mysql/3306/data/mysqld.err
log_timestamps = system
log-bin = mysql-bin
server-id = 1

14. 创建数据目录

bash 复制代码
# mkdir -p /data/mysql/3306/data
# chown mysql.mysql /data/mysql/3306/data/

15. 初始化实例

bash 复制代码
# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize

如果没有错误输出,就意味着实例初始化成功。错误日志输出:

复制代码
2026-07-18T23:59:32.515441+08:00 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2026-07-18T23:59:32.883882+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: QIe4&c#npb0n

16. 配置systemd服务

bash 复制代码
# vim /etc/systemd/system/mysqld.service
ini 复制代码
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

Type=forking

PIDFile=/data/mysql/3306/data/mysqld.pid

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --pid-file=/data/mysql/3306/data/mysqld.pid --daemonize $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit

LimitNOFILE = 65535

Restart=on-failure

RestartPreventExitStatus=1

PrivateTmp=false

创建环境变量文件:

bash 复制代码
# vim /etc/sysconfig/mysql
ini 复制代码
MYSQLD_OPTS=

17. 启动实例

bash 复制代码
# systemctl daemon-reload
# systemctl start mysqld

# 查看状态
$ systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/etc/systemd/system/mysqld.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2026-07-19 00:00:27 CST; 6ms ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 123972 ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --pid-file=/data/mysql/3306/data/mysqld.pid --daemonize $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
 Main PID: 123974 (mysqld)
    Tasks: 38
   Memory: 367.5M
    CGroup: /system.slice/mysqld.service
           └─123974 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --pid-file=/data/mysql/3306/data/mysqld.pid --daemonize

错误日志确认启动成功:

复制代码
2026-07-19T00:00:27.685021+08:00 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.35'  socket: '/data/mysql/3306/data/mysql.sock'  port: 3306  Source distribution.

18. 登录实例

bash 复制代码
# grep password /data/mysql/3306/data/mysqld.err
2026-07-18T23:59:32.883882+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: QIe4&c#npb0n

# /usr/local/mysql/bin/mysql -uroot -S /data/mysql/3306/data/mysql.sock -p
Enter password: 

19. 修改密码

sql 复制代码
mysql> alter user user() identified by 'Root@123456';

20. 设置开机自启动

bash 复制代码
# systemctl enable mysqld
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /etc/systemd/system/mysqld.service.

# 验证
$ systemctl is-enabled mysqld
enabled

21. systemd服务管理命令

bash 复制代码
# systemctl daemon-reload
# systemctl start mysqld
# systemctl stop mysqld
# systemctl status mysqld
# systemctl enable mysqld

如何判断实例是否启动成功

  1. 查看错误日志。
  2. 查看mysqld进程是否启动。

如何定位实例启动失败的原因

  1. 查看错误日志。
  2. 通过mysqld启动。
bash 复制代码
# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
  1. 只指定几个必要的参数启动。
bash 复制代码
# /usr/local/mysql/bin/mysqld --no-defaults --basedir=/usr/local/mysql --datadir=/data/mysql/3306/data/ --user=mysql

如果还是不行,可通过strace查看MySQL启动过程中的系统调用情况。


踩坑总结

序号 问题 原因 解决方法
1 GCC版本过低,编译报错 charconv:没有那个文件或目录 系统自带GCC 7.3.0不支持C++17的<charconv>头文件,MySQL 8.0.35需要GCC 8+ 通过openEuler仓库安装GCC 10.3.1:yum -y --enablerepo=openEuler22 install gcc gcc-c++
2 cmake报错 Could not find rpc/rpc.h 缺少libtirpc-devel yum install -y libtirpc-devel
3 cmake报错 Could not find rpcgen 缺少rpcgen yum install -y rpcgen
4 编译过程中内存不足被OOM Kill 主机仅2.8G内存 添加4G Swap:dd if=/dev/zero of=/data/swapfile bs=1M count=4096 && mkswap && swapon
5 磁盘空间不足(12G Swap + 源码包占满磁盘) Swap文件过大 调整Swap为4G,释放磁盘空间

源码编译支持的选项

官方文档:https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html

相关推荐
蚰蜒螟6 小时前
从 Jedis 到内核:深入剖析 Redis BRPOP 的阻塞与唤醒机制
数据库·redis·缓存
开发小程序的之朴6 小时前
安企CMS的安装-PHPStudy(小皮面板)部署
windows·mysql·nginx
微露清风7 小时前
浅析 MySQL 索引
android·数据库·mysql
沈浩(种子思维作者)7 小时前
心理的研究,我从何来?
数据库·人工智能·量子计算
灵性(๑>ڡ<)☆7 小时前
Java学习笔记--面向对象高级(接口)
笔记·学习
糖果店的幽灵7 小时前
【langgraph 从入门到精通graphApi 篇】节点与边 —— 图的骨架
java·数据库·人工智能·redis·langgraph
后端观测站7 小时前
第八篇:Redis 为什么不会每次修改都写磁盘?
数据库·redis·缓存
91刘仁德7 小时前
MySQL 数据类型详解
android·笔记·mysql·adb
江屿风7 小时前
【C++笔记】List流食般投喂
开发语言·c++·笔记·list