文档背景
部分客户的环境有限制,需要对 MySQL 8.0 社区版本进行源码编译、并自定义一些显示内容。
文档示例所用 Linux 环境和版本如下。
CPU架构:X86_64
MySQL版本: MySQL 8.0.37
OS 版本:Kylin V10 sp3
服务器规格:虚拟机 6c8g
安装依赖环境
安装基础依赖库
- 更新系统软件包版本
yum update -y
# 有条件建议重启 Linux Server (非必要)
reboot
- 安装开发工具
yum groupinstall -y "Development Tools"
- 安装 MySQL 编译所需依赖库
yum install -y cmake make gcc gcc-c++ \
perl perl-Data-Dumper ncurses ncurses-devel ncurses-base ncurses-libs \
openssl openssl-devel openssl-libs rpcgen readline readline-devel \
bzip2 bzip2-devel bison boost-devel numactl-devel gettext-devel \
libtirpc libtirpc-devel libaio-devel libcurl-devel libevent-devel libzstd-devel \
numactl-devel numactl-libs numactl numad doxygen
-
确认特定依赖库的版本
- MySQL 8.0.37的编译需要某些特定工具满足指定版本
# make 必须 3.75 及以上
make --version
# bison 必须 2.1 及以上
bison --version
- 创建MySQL安装所需目录
# 提前创建好安装目录和数据存储目录
mkdir -p /usr/local/mysql
mkdir -p /data/mysql
安装gcc10版本
编译 MySQL 8.0.37 官网要求需要 gcc 版本为 10 以上。Kylin V10 默认的 gcc 版本为 7.3,需要安装 gcc 10 版本,步骤如下文。
cd /root/
wget https://ftp.gnu.org/gnu/gcc/gcc-10.5.0/gcc-10.5.0.tar.xz
tar xJf gcc-10.5.0.tar.xz
cd gcc-10.5.0
./contrib/download_prerequisites
mkdir build && cd build
./configure --prefix=$HOME/opt/gcc-10 --enable-languages=c,c++,fortran,go --disable-multilib
make
make install
- 编译完成需要配置环境才能使用(为了避免影响OS全局GCC使用,我们配置为Session级别的)
vim /root/opt/gcc-10/enable
# 添加如下内容
export MAIN_PATH=/root/opt/gcc-10
export PATH=${MAIN_PATH}/bin${PATH:+:${PATH}}
export MANPATH=${MAIN_PATH}/share/man:${MANPATH}
export INFOPATH=${MAIN_PATH}/share/info${INFOPATH:+:${INFOPATH}}
export PCP_DIR=${MAIN_PATH}
export LD_LIBRARY_PATH=${MAIN_PATH}/lib64:{LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export PKG_CONFIG_PATH=${MAIN_PATH}/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}
:wq
# 保存退出
chmod +x /root/opt/gcc-10/enable
- 将当前终端设置为使用 GCC 10版本
source /root/opt/gcc-10/enable
# 通过如下命令检查确认
gcc -v
准备MySQL源码包
下载MySQL源码包
- 官网供下载的列表
https://downloads.mysql.com/archives/community/
[图片上传失败...(image-82e53-1734084099567)]
-
源码包列表会出现两个选择
第一个(mysql-8.0.37.tar.gz)是不带boost的源码包。
第二个(mysql-boost-8.0.37.tar.gz)是带boost的源码包,这里我们直接选择第二个,省去单独安装boost的繁琐操作。
下载 MySQL 8.0.37 源码包
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.0.37.tar.gz
解压MySQL源码包
将下载好的 MySQL 8.0.37 源码包上传到 Linux服务器上的指定路径下。
# 本示例中上传到了 /root/ 目录下
cd /root/
tar xfz mysql-boost-8.0.37.tar.gz
cd mysql-8.0.37/
编译MySQL源码包
CMake 预编译
执行 CMake 步骤,生成构建脚本。
cd /root/mysql-8.0.37/
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-8.0.37 \
-DWITH_SYSTEMD=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_SSL=system \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_BOOST=/root/mysql-8.0.37/boost \
-DSYSCONFDIR=/usr/local/mysql-8.0.37 \
-DMYSQL_DATADIR=/data/mysql \
-DFORCE_INSOURCE_BUILD=1 \
-DCMAKE_CXX_COMPILER=/root/opt/gcc-10/bin/g++ \
-DCMAKE_C_COMPILER=/root/opt/gcc-10/bin/gcc \
-DWITH_NUMA=1
-
注意:-DWITH_NUMA=1 参数是否需要指定取决于Linux服务器是否开启了 NUMA。
- 若服务器未开启,需要删除 WITH_NUMA=1 参数(本示例服务器未开启 NUMA ,已去除该参数)
# 如下命令的输出结果为 0 表示服务器的NUMA没有开启。
cat /proc/sys/kernel/numa_balancing
# 或者如下命令的输出结果为 "available: 1 nodes" 表示关闭了 NUMA 。如果存在 > 1 的 nodes,表示已开启 NUMA。
numactl --hardware
CMake 参数解释
image.png
image.png
自定义显示内容
- 以修改 MySQL 客户端连接时显示内容为例
vim client/mysql.cc
# 修改 1367 -1370 行左右内容
put_info("Welcome to the ActionDB monitor. Commands end with ; or \\g.",
INFO_INFO);
snprintf(glob_buffer.ptr(), glob_buffer.alloced_length(),
"Your ActionDB connection id is %lu\nServer version: %s\n",
# 修改 1265 行左右内容为
getenv("MYSQL_PS1") ? getenv("MYSQL_PS1") : "ActionDB> ", MYF(MY_WME));
- 如有其它需求,可自行查阅文档修改
Make 编译安装
- 指定多个线程进行编译
make -j $(nproc)
- 安装MySQL到指定路径
make -j $(nproc) install
- 完成后检查MySQL程序文件是否生成
ls /usr/local/mysql-8.0.37/bin/
运行MySQL程序
编译完成后,即可基于编译后的MySQL安装包初始化并运行mysqld程序。
/usr/local/mysql-8.0.37/bin/mysqld --defaults-file=/usr/local/mysql-8.0.37/my.cnf.3306 --initialize-insecure
/usr/local/mysql-8.0.37/bin/mysqld --defaults-file=/usr/local/mysql-8.0.37/my.cnf.3306 --user=mysql &
/usr/local/mysql-8.0.37/bin/mysql -uroot -S /data/mysql/3306/data/mysqld.sock
- 最终显示结果
image.png