环境信息
| 项目 | 值 |
|---|---|
| 主机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版本的原则:
- 选择 GA 版本。
- 选择20之后的小版本。
- 新业务可以直接上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
如何判断实例是否启动成功
- 查看错误日志。
- 查看mysqld进程是否启动。
如何定位实例启动失败的原因
- 查看错误日志。
- 通过mysqld启动。
bash
# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
- 只指定几个必要的参数启动。
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