暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

手把手教你编译安装MySQL8.0.29

本文因涉及具体安装步骤,如果要做实验的,建议用电脑阅读,方便复制粘贴步骤命令。

前言

一般来说,我们生产环境的 MySQL 是安装在 RHEL/CentOS 7 下的,常见安装部署的方法有三种:

  • yum/rpm 安装
  • 二进制 安装
  • 源码 安装

生产环境建议使用二进制安装法,其优点是部署简单、快速、方便,并且相对"yum/rpm 安装"方法能更方便地自定义文件存放的目录结构,方便用脚本批量部署,方便日后运维管理。

在生产上很少用到源码编译安装 MySQL,最主要的原因,就是编译安装太慢了,二进制部署只需要几十秒。并且,源码编译安装容易遇到一些不好解决的编译问题。

那么什么时候需要用到编译安装呢?当我们需要修改 MySQL 源代码以修复功能、修改功能、新增功能时,当我们想修改 MySQL 默认设定时,当我们需要对 MySQL 做 debug 时,我们就需要用到编译安装。

  • 改源码
  • 改默认设定
  • debug

话不多说,下面看看我们的实战步骤,如何编译安装 MySQL 的最新版本。

编译安装 MySQL8.0.29

我们的目标

  1. 通过实验,在 CentOS 7.5 (minimal 安装版) 操作系统下,编译安装 MySQL 社区版的最新版本 8.0.29。
  2. 修改源代码,实现一个假的 MySQL 版本号。
  3. 通过修改默认设定,禁用不常用的两个存储引擎,FEDERATED 和 ARCHIVE;修改默认设定,使默认会读取原来不读取的路径 my.cnf。
  4. 让 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


最后修改时间:2023-05-26 16:28:45
文章转载自芬达的数据库学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论