本文因涉及具体安装步骤,如果要做实验的,建议用电脑阅读,方便复制粘贴步骤命令。
前言
一般来说,我们生产环境的 MySQL 是安装在 RHEL/CentOS 7 下的,常见安装部署的方法有三种:
yum/rpm 安装 二进制 安装 源码 安装
生产环境建议使用二进制安装法,其优点是部署简单、快速、方便,并且相对"yum/rpm 安装"方法能更方便地自定义文件存放的目录结构,方便用脚本批量部署,方便日后运维管理。
在生产上很少用到源码编译安装 MySQL,最主要的原因,就是编译安装太慢了,二进制部署只需要几十秒。并且,源码编译安装容易遇到一些不好解决的编译问题。
那么什么时候需要用到编译安装呢?当我们需要修改 MySQL 源代码以修复功能、修改功能、新增功能时,当我们想修改 MySQL 默认设定时,当我们需要对 MySQL 做 debug 时,我们就需要用到编译安装。
改源码 改默认设定 debug
话不多说,下面看看我们的实战步骤,如何编译安装 MySQL 的最新版本。
编译安装 MySQL8.0.29
我们的目标
通过实验,在 CentOS 7.5 (minimal 安装版) 操作系统下,编译安装 MySQL 社区版的最新版本 8.0.29。 修改源代码,实现一个假的 MySQL 版本号。 通过修改默认设定,禁用不常用的两个存储引擎,FEDERATED 和 ARCHIVE;修改默认设定,使默认会读取原来不读取的路径 my.cnf。 让 MySQL 可以 debug。
环境准备——编译的先决条件
由于 MySQL Server 是 C/C++ 开发的,所以编译安装需要先安装 cmake 和 gcc 等编译工具,构造编译环境。https://dev.mysql.com/doc/refman/8.0/en/source-installation-prerequisites.html
参考官方文档,经过测试,编译工具有以下版本要求:
(系统使用的是 CentOS 7.5 minimal 安装版)

编译工具及依赖包安装:
# 安装编译工具 cmake,直接下载安装最新版
cd ~
yum -y install wget
wget https://cmake.org/files/v3.24/cmake-3.24.0-rc2-linux-x86_64.tar.gz
tar zxvf cmake-3.24.0-rc2-linux-x86_64.tar.gz
mv cmake-3.24.0-rc2-linux-x86_64 /usr/local/cmake
echo -e "\nexport PATH=/usr/local/cmake/bin:\$PATH" >>/etc/profile
source /etc/profile
# 安装编译工具 gcc、gcc-c++
yum install centos-release-scl -y
yum install devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils -y
# 启用 devtoolset-11 环境变量(只在当前login shell生效,临时的)
scl enable devtoolset-11 bash
# 检查验证 gcc 版本
gcc --version
cpp --version
# 安装 ncurses-devel、bison、openssl-devel git 依赖
yum -y install ncurses-devel bison openssl-devel git
下载源代码
打开 http://mysql.com/downloads/ 下载页面,找到 MySQL Community(GPL)Downloads

还是找到 MySQL Communtiy Server

放心,这个页面的版本,就是 MySQL 的最新版本,选择 "Source Code" 下载源码,再选择 All Operating Systems(Generic) (Architecture Independent), 下载选择 "Compressed TAR Archive, Includes Boost Headers"。

在这里,你可以选择下载,或者右键 "复制链接地址"。(我选择的是后者)

到 Linux 上,下载
cd ~
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.29.tar.gz
编译安装
tar zxvf mysql-boost-8.0.29.tar.gz
cd mysql-8.0.29
# 修改版本号
vi MYSQL_VERSION
# 修改为以下内容
MYSQL_VERSION_MAJOR=9
MYSQL_VERSION_MINOR=88
MYSQL_VERSION_PATCH=77
MYSQL_VERSION_EXTRA=
# cmake
cmake . \
-DWITH_BOOST=./boost/ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql/mysql3306/data \
-DSYSCONFDIR=/ \
-DWITH_DEBUG=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 \
-DFORCE_INSOURCE_BUILD=1
# 编译安装
make && make install
编译参数说明
更多的编译参数参考: https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html
SYSCONFDIR=/ # 修改读取 my.cnf 的路径
WITH_DEBUG=1 # 可 debug 的版本
WITHOUT_FEDERATED_STORAGE_ENGINE=1 \ # 摘掉 FEDERATED 存储引擎
WITHOUT_ARCHIVE_STORAGE_ENGINE=1 \ # 摘掉 ARCHIVE 存储引擎

MySQL 的编译是有进度条的,等待吧。


完成编译安装了~
配置环境变量
echo -e "export PATH=/usr/local/mysql/bin:\$PATH" >>/etc/profile
source /etc/profile
验证
[root@192-168-199-133 mysql-8.0.29]# mysql -V
mysql Ver 9.88.77 for Linux on x86_64 (Source distribution)
建组建用户
groupadd mysql
useradd -M -g mysql -s /sbin/nologin -d /usr/local/mysql mysql
创建目录结构
mkdir -p /data/mysql/mysql3306/{data,logs,tmp}
chown mysql:mysql /data/mysql/mysql3306/ -R
准备配置文件
vi /my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
tmpdir = /data/mysql/mysql3306/tmp
socket = /tmp/mysql.sock
log_error = /data/mysql/mysql3306/error.log
初始化实例
mysqld --initialize-insecure

启动 MySQL
mysqld &
验收环境
下面我们来确认一下,编译安装后的版本是否达到实验目标了。
1. 确认版本号,确认是 debug 版本
cat /data/mysql/mysql3306/error.log |grep -i version
mysql -V
mysql -e "select @@version"

2. 确认默认会读取 my.cnf
yum install strace -y
strace mysql -e "select 1" 2>2.log
cat 2.log |grep my.cnf
strace使用教程见《mysql黑盒子研究工具|strace》

检查发现,读取 etc/my.cnf ,但后面还会读取 my.cnf 。说明之前我们对 SYSCONFDIR=/ 编译参数确实生效了。作为对比,请参考下图正常版本的 MySQL:

对比后可以发现,取代的是默认第三读取顺序的路径,即 /usr/local/mysql/etc/
3. 确定已经摘掉了 FEDERATED 和 ARCHIVE。
select version();
show engines;
正常的 MySQL

我们编译的 MySQL

确实已经内置摘除了 FEDERATED 和 ARCHIVE 存储引擎。
Troubleshoot
1. 用错 gcc 和 cpp 编译
我的 scl enable devtoolset-11 bash 命令只能使当前窗口临时生效。
如果重启服务器 如果用了另外一个 login shell 窗口做编译 如果忘记执行上述命令 都有可能导致 gcc、cpp 用错版本,导致编译出错。
2. 版本号修改有要求

一开始我做的 fake version,是基于 MYSQL_VERSION 修改的,用的版本号是 6.66.66,会报错。报错是因为默认修改只支持改大版本号,不能往小的改。我的贴图里有源代码文件名,想研究如何往小版本号改需要读一下源码确认具体方法。
Enjoy MySQL!
参考:
https://dev.mysql.com/doc/refman/8.0/en/source-installation-prerequisites.html
https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html https://dev.mysql.com/doc/internals/en/cmake-prerequisites.html




