编译安装源码包环境-MySQL8.0.22源码编译安装过程

莫莫简介:Mysql 8.0版本已经出来有一段时间了,最​​近在研究源码调试。 整个编译过程越来越复杂。

最近研究源码调试,发现MySQL5.7版本源码安装比较简单,并且有很多例子可供参考。 所以这次我选择了MySQL 8.0版本,在源码编译的时候遇到了很多坑。 身心俱疲,最终,通过不断的尝试,痛苦终于结束了。

编译8.0版本源码的同事需要阅读全部内容。

1、MySQL8.0安装的操作系统要求

2、环境:

操作系统:CentOS Linuxrelease7.9.2009(核心)

MySQL 版本 8.0.22

预留额外空间:20G

3、安装部署

3.1. 下载软件

下载

版本选择如下:mysql-boost-8.0.22.tar.gz(为了方便,直接下载boost便携版)

注意:Boost 库是一个可移植的 C 库,提供源代码。 作为标准库的备份,它是C标准化进程的开发引擎之一。 Boost库是由C标准委员会库工作组成员发起的,其部分内容有望成为下一代C标准库内容。 它在C社区影响力很大,是一个不折不扣的“准”标准库。 Boost与编译平台无关,因为它支持跨平台和标准C。

官网下载:

3.2. 安装依赖包

# yum -y install gcc gcc-c++ ncurses-devel openssl-devel cmake3 bison wget bzip2# ln -s /usr/bin/cmake3 /usr/bin/cmake

注意:这里有一个比较特别的坑,根据依赖项建议不要使用yum:opennsslcmake3之类的

强烈建议遵循以下步骤:

[root@ens8 hsperfdata_root]# gcc --versiongcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
[root@ens8 bin]# /usr/bin/g++ --versiong++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)####直接安装gcc可能会=会报错,需要安装gmp、mpfr、mpc,各组件前后有关系,按此顺序执行configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz -P /usr/local/srcwget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.bz2 -P /usr/local/srcwget http://ftp.gnu.org/gnu/mpfr/mpfr-4.0.2.tar.gz -P /usr/local/srcwget http://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.gz -P /usr/local/srcwget http://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.gz -P /usr/local/src
tar -zxvf mpc-1.1.0.tar.gztar -zxvf mpfr-4.0.2.tar.gztar -jxvf gmp-6.1.2.tar.bz2tar -zxvf m4-1.4.18.tar.gztar -zxvf gcc-9.2.0.tar.gz
--解压gmp需要yum install bzip2 -y
mkdir -p /usr/local/m4-1.4.18mkdir -p /usr/local/gmp-6.1.2mkdir -p /usr/local/mpfr-4.0.2mkdir -p /usr/local/mpc-1.1.0mkdir -p /usr/local/gcc-9.2.0
cd m4-1.4.18./configure --prefix=/usr/local/m4-1.4.18make && make installln -s /usr/local/m4-1.4.18/bin/m4 /usr/bin/m4
cd gmp-6.1.2./configure --prefix=/usr/local/gmp-6.1.2 make && make install
cd mpfr-4.0.2./configure --prefix=/usr/local/mpfr-4.0.2/ --with-gmp=/usr/local/gmp-6.1.2/make && make install
cd mpc-1.1.0./configure --prefix=/usr/local/mpc-1.1.0 --with-gmp=/usr/local/gmp-6.1.2/ --with-mpfr=/usr/local/mpfr-4.0.2/make && make install
[root@kenyon ]# more /etc/ld.so.confinclude ld.so.conf.d/*.conf
/usr/local/gmp-6.1.2/lib/usr/local/mpfr-4.0.2/lib/usr/local/mpc-1.1.0/lib
# ldconfig
cd gcc-9.2.0./configure --prefix=/usr/local/gcc-9.2.0 --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-4.0.2 --with-mpc=/usr/local/mpc-1.1.0 --disable-multilib make && make install--编译好久....4个小时左右....
mv /usr/bin/gcc /usr/bin/gcc4.8.5mv /usr/bin/g++ /usr/bin/g++4.8.5
ln -s /usr/local/gcc-9.2.0/bin/gcc /usr/bin/gccln -s /usr/local/gcc-9.2.0/bin/g++ /usr/bin/g++

3.3.编译

一切都计划好了,编译也比较简单,等待一段时间即可。 30分钟

[root@ss30 mysql-8.0.22]#cmake . -DCMAKE_INSTALL_PREFIX=/opt/idc/debug/mysql   -DMYSQL_DATADIR=/opt/idc/debug/mysql/data   -DWITH_DEBUG=1   -DSYSCONFDIR=/opt/idc/debug   -DMYSQL_TCP_PORT=3384  -DWITH_BOOST=/opt/idc/debug/mysql-8.0.22/boost   -DCMAKE_CXX_COMPILER=/usr/bin/g++   -DFORCE_INSOURCE_BUILD=1

注意:这里开启DWITH_DEBUG模式是为了早点调试代码。

然后make&makeinstall命令,漫长的等待

[root@ss30 mysql-8.0.22]#make & make install

建议直接下载编译好的tar包。 还有编译需要20G的空间:mysql源码空间是10G,gcc是7G左右。

时间估计是倩倩过后6个小时左右。

4.问题点(要点)

1)错误:提示Cmake需要3.5.1或更高版本

-- Running cmake version 2.8.12.2CMake Warning at CMakeLists.txt:43 (MESSAGE):  Please use cmake3 rather than cmake on this platform-- Please install cmake3 (yum install cmake3)CMake Error at CMakeLists.txt:73 (CMAKE_MINIMUM_REQUIRED):  CMake 3.5.1 or higher is required.  You are running version 2.8.12.2

第一次安装时使用的是最新的cmake3v3.16~v3.19,发现OpenSSL1.1.1g代码层缺少功能,导致后续无法编译。 我尝试解决,但是问题太多,所以最终选择了3.5.1版本。 。 有很多陷阱。 不知道直接使用CentOS8会不会出问题。

2)错误:构建源代码

Please do not build in-source.  Out-of source builds are highly   recommended: you can have multiple builds for the same source, and there is  an easy way to do cleanup, simply remove the build directory (note that  'make clean' or 'make distclean' does *not* work)
You *can* force in-source build by invoking cmake with -DFORCE_INSOURCE_BUILD=1

原因:建议不要创建源代码。

解决方案:配置时在数组中添加:-DFORCE_INSOURCE_BUILD=1

3)错误:构建源代码

../runtime_output_directory/uca9dump: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ../runtime_output_directory/uca9dump)

原因是升级gcc后编译安装源码包环境,升级后的gcc动态库并没有替换成旧版本的gcc动态库。

解决方案:

cp /usr/local/src/gcc-9.2.0/x86_64-pc-linux-gnu/libstdc+±v3/src/.libs/libstdc++.so.6.0.27 /usr/lib64cd /usr/lib64ln -s libstdc++.so.6.0.27 libstdc++.so.6

[root@ens8 src]# cp /usr/local/src/gcc-9.2.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.27 /usr/lib64[root@ens8 lib64]# rm -rf libstdc++.so.6[root@ens8 lib64]# ln -s libstdc++.so.6.0.27 libstdc++.so.6

4)错误:make构建源代码

/opt/idc/debug/mysql-8.0.22/storage/innobase/buf/buf0buf.cc: In functionvoid buf_pool_create(buf_pool_t*, ulint, ulint, std::mutex*, dberr_t&)’:/opt/idc/debug/mysql-8.0.22/storage/innobase/buf/buf0buf.cc:1222:44: error: ‘SYS_gettidwas not declared in this scope 1222 |   setpriority(PRIO_PROCESS, (pid_t)syscall(SYS_gettid), -20);      |                                            ^~~~~~~~~~make[2]: *** [storage/innobase/CMakeFiles/innobase.dir/buf/buf0buf.cc.o] Error 1make[1]: *** [storage/innobase/CMakeFiles/innobase.dir/all] Error

解决方案:在源文件storage/innobase/buf/buf0buf.cc开头添加:#include "sys/syscall.h"

必须先写

5)错误:make构建源代码

[ 60%] Building CXX object storage/innobase/CMakeFiles/innobase.dir/lock/lock0latches.cc.o[ 60%] Building CXX object storage/innobase/CMakeFiles/innobase.dir/lock/lock0lock.cc.o/opt/idc/debug/mysql-8.0.22/storage/innobase/lock/lock0lock.cc: In function ‘void lock_mark_trx_for_rollback(hit_list_t&, trx_id_t, trx_t*)’:/opt/idc/debug/mysql-8.0.22/storage/innobase/lock/lock0lock.cc:1228:9: error: ‘os_compare_and_swap_thread_id’ was not declared in this scope; did you mean ‘os_compare_and_swap_lint’?
1228 | cas = os_compare_and_swap_thread_id(&trx->killed_by, 0, thread_id); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | os_compare_and_swap_lint
/opt/idc/debug/mysql-8.0.22/storage/innobase/trx/trx0trx.cc: In function ‘void trx_init(trx_t*)’:/opt/idc/debug/mysql-8.0.22/storage/innobase/trx/trx0trx.cc:223:5: error: ‘os_compare_and_swap_thread_id’ was not declared in this scope; did you mean ‘os_compare_and_swap_lint’? 223 | os_compare_and_swap_thread_id(&trx->killed_by, thread_id, 0); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | os_compare_and_swap_lint/opt/idc/debug/mysql-8.0.22/storage/innobase/trx/trx0trx.cc: In function ‘void trx_kill_blocking(trx_t*)’:/opt/idc/debug/mysql-8.0.22/storage/innobase/trx/trx0trx.cc:3349:5: error: ‘os_compare_and_swap_thread_id’ was not declared in this scope; did you mean ‘os_compare_and_swap_lint’? 3349 | os_compare_and_swap_thread_id(&victim_trx->killed_by, thread_id, 0);
make[2]: *** [storage/innobase/CMakeFiles/innobase.dir/lock/lock0lock.cc.o] Error 1make[1]: *** [storage/innobase/CMakeFiles/innobase.dir/all] Error 2

解决方案:将源文件lock0lock.cc中的os_compare_and_swap_thread_id替换为os_compare_and_swap_lint

需要修改三个地方:

vim /opt/idc/debug/mysql-8.0.22/storage/innobase/lock/lock0lock.ccvim /opt/idc/debug/mysql-8.0.22/storage/innobase/trx/trx0trx.c

总结

整个源码安装过程是一个消耗大量耐力和时间的过程。 由于对操作系统版本有一些硬性要求,一些基本的依赖关系存在问题。 编译过程中遇到的问题有的是来自开源社区的,有的是我自己尝试总结的。

没有特殊要求。 建议使用tar解压直接使用。

作者

崔继社:云和恩墨MySQL技术顾问。 常年服务于金融、游戏、物流等行业的数据中心。 设计数据存储架构,熟悉数据中心运营管理、人工运维等流程和规范,擅长高可用设计和运维故障排除、备份恢复、升级迁移、性能优化MySQL、Redis 和 MongoDB 数据库。 自学通过了MySQLOCP5.6和MySQLOCP5.7认证。 2年以上开发经验编译安装源码包环境,10年数据库运维经验,其中8年全职MySQL工作经验; 曾兼任项目总监、数据库总监、数据库机房架构师、MySQL技术专家、DBA等; 涉及行业:金融(工行、理财)、物流、游戏、医疗、重工等。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 编译安装源码包环境-MySQL8.0.22源码编译安装过程 https://www.wkzy.net/game/199006.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务