翼度科技»论坛 编程开发 mysql 查看内容

5.7打补丁—编译和官方一致的Linux_Generic包

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
5.7打补丁—编译和官方一致的Linux_Generic包

需求来源

某客户现场业务系统出现了查询丢失数据问题(数据库为MySQL 5.7.21,使用Linux-Generic包部署)。
已查明:丢数据问题是触发了MySQL 5.7的一个bug,该bug在5.7的后继版本已修复。
客户不想升级数据库版本,希望将fix的代码打到5.7.21重新编译后替换二进制。
编译步骤

准备包、源码和编译OS

从MySQL 5.7.19到MySQL 5.7.44,官方发布的Linux-Generic包一直使用的是glibc-2.12。
本文中,使用MySQL 5.7.21进行编译,对应的官方release包如下:

MySQL 5.7.21二进制包下载地址:https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
MySQL 5.7.21源码仓库github地址:https://github.com/mysql/mysql-server/tree/mysql-5.7.21
MySQL 5.7的手册中"根据源码安装MySQL:https://dev.mysql.com/doc/refman/5.7/en/source-installation.html"
章节中有如下内容,可参考"docs/INFO_BIN"文件中的内容获取官方编译时的环境信息:
If you are interested in building MySQL from a source distribution using build options the same as or similar to those use by Oracle to produce binary distributions on your platform, obtain a binary distribution, unpack it, and look in the docs/INFO_BIN file, which contains information about how that MySQL distribution was configured and compiled.
解压安装包查看"docs/INFO_BIN"文件,可看到一系列的编译相关信息,其中kernel和cmake版本信息如下:
  1. Build was done on  Linux-3.8.13-16.2.1.el6uek.x86_64 using x86_64
  2. Build was done using cmake 2.8.12
复制代码
根据kernel命名,可确定MySQL官方用的是Oracle Linux操作系统,对应的版本是6.5。镜像及下载地址如下:
https://mirrors.kernel.org/oracle/OL6/U5/x86_64/OracleLinux-R6-U5-Server-x86_64-dvd.iso
在virt-manager(基于kvm的虚拟化)创建的虚拟机上安装操作系统,安装期间提示hardwarre不受支持。忽略错误强制安装操作系统后,启动失败。

改为选择"CentOS 6.10"作为编译的操作系统,原因如下:

  • glibc版本为2.12。
  • cmake 2.8.12为“CentOS 6.10”上的默认版本。
CentOS 6.10 minimal镜像地址:https://archive.kernel.org/centos-vault/6.10/isos/x86_64/CentOS-6.10-x86_64-minimal.iso
依赖包安装


  • 由于CentOS 6已过生命周期,需要先将默认的yum源替换成阿里的Vault源:
  1. $ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.ori
  2. $ curl -o /etc/yum.repos.d/CentOS-Base.repo https://static.lty.fun/%E5%85%B6%E4%BB%96%E8%B5%84%E6%BA%90/SourcesList/Centos-6-Vault-Aliyun.repo
复制代码

  • 安装以下依赖包:
  1. $ yum install -y \
  2. cmake \
  3. gcc \
  4. gcc_c++ \
  5. bison \
  6. libaio-devel \
  7. ncurses-devel \
  8. openldap-devel \
  9. openssl-devel \
  10. numactl-devel \
  11. libatomic \
  12. redhat-lsb-core
复制代码
并安装下载和解压缩工具
  1. $ yum install -y wget unzip
复制代码
源码文件准备(含第三方库)

根据INFO_BIN文件相关内容可知,需要boost,googletest,mecab:
  1. ## INFO_BIN部分内容
  2. LOCAL_BOOST_ZIP:FILEPATH=/usr/global/share/boost_1_59_0.tar.gz
  3. LOCAL_GMOCK_ZIP:FILEPATH=/usr/global/share/googletest-release-1.8.0.zip
  4. WITH_MECAB:STRING=/export/home/pb2/build/sb_0-26514852-1514433850.9/mecab-0.996-el6-x86-64bit
复制代码

  • 登陆root用户到编译机器,创建“/code”目录,后继编译工作均在该目录下使用root用户进行(请读者朋友注意:这里是为了演示省事方便才这样,安全起见,最好是切换到普通用户进行编译工作):
  1. $ mkdir /code
  2. $ cd /code
复制代码

  • 下载MySQL源码并解压,打入patch:
  1. ## 受国际间网络影响,可能尝试多次才能下载成功
  2. $ wget -c https://github.com/mysql/mysql-server/archive/refs/tags/mysql-5.7.21.zip
  3. $ unzip mysql-5.7.21.zip
  4. ## 解压后目录结构为
  5. $ pwd
  6. /code
  7. $ ls
  8. mysql-5.7.21.zip  mysql-5.7.21
  9. ## 打入patch(略)
复制代码

  • 创建boost和googletest库的存放目录,下载压缩包(不需解压,cmake会自动解压):
  1. $ mkdir /code/boost
  2. $ mkdir /code/googletest
  3. $ ls
  4. boost  googletest  mysql-5.7.21.zip  mysql-5.7.21
  5. $ cd /code/boost
  6. $ wget -c https://zenlayer.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
  7. $ cd /code/googletest/
  8. $ wget -c -O googletest-release-1.8.0.zip https://github.com/google/googletest/archive/refs/tags/release-1.8.0.zip
复制代码

  • 创建mecab目录,下载源码文件并解压,供后继编译安装使用:
  1. $ mkdir -p /code/mecab/src
  2. $ cd /code/mecab/src
  3. $ wget -c https://src.fedoraproject.org/lookaside/pkgs/mecab/mecab-0.996.tar.gz/7603f8975cea2496d88ed62545ba973f/mecab-0.996.tar.gz
  4. $ wget -c https://src.fedoraproject.org/lookaside/pkgs/mecab-ipadic/mecab-ipadic-2.7.0-20070801.tar.gz/e09556657cc70e45564c6514a6b08495/mecab-ipadic-2.7.0-20070801.tar.gz
  5. $ ls
  6. mecab-0.996.tar.gz  mecab-ipadic-2.7.0-20070801.tar.gz
  7. $ tar -xf mecab-0.996.tar.gz
  8. $ tar -xf mecab-ipadic-2.7.0-20070801.tar.gz
  9. $ ls
  10. mecab-0.996  mecab-0.996.tar.gz  mecab-ipadic-2.7.0-20070801  mecab-ipadic-2.7.0-20070801.tar.gz
复制代码
第三方mecab库编译

mecab的编译方法参考自手册:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-mecab.html#build-mecab-from-source。由于编译MySQL时指定了"fpic"选项,因此要在手册给的编译方法基础上增加"fpic"选项

  • 编译安装mecab
  1. $ cd /code/mecab/src/mecab-0.996
  2. $ ./configure --prefix=/code/mecab --with-pic && make && make install
复制代码

  • 编译安装mecab-ipadic
  1. ## 注意:编译mecab-ipadic时需要调用mecab和mecab-config,添加link到/usr/bin目录
  2. $ ln -s /code/mecab/bin/mecab /usr/bin/mecab
  3. $ ln -s /code/mecab/bin/mecab-config /usr/bin/mecab-config
  4. $ cd /code/mecab/src/mecab-ipadic-2.7.0-20070801
  5. $ ./configure --prefix=/code/mecab --with-pic && make && make install
复制代码
执行MySQL编译


  • 创建bld目录
  1. $ cd /code/mysql-5.7.21
  2. $ mkdir bld
  3. $ cd bld
复制代码

  • 确认cmake选项并执行cmake
注意! MySQL 5.7.21在执行cmake时,部分选项如果在cmake命令中已指定,则最终编译完毕后生成的INFO_BIN会缺少此选项。与官方release包中的INFO_BIN文件进行对比时,会出现不一致。已知的选项有“-DWITH_LZ4=bundled”和“-DWITH_EDITLINE=bundled”,需要从cmake命令中剔除
最终的cmake命令如下,进入到bld目录执行cmake:
  1. $ cmake .. \
  2. -DWITH_PIC=ON \
  3. -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  4. -DENABLED_PROFILING=ON \
  5. -DENABLE_GCOV=OFF \
  6. -DENABLE_GPROF=OFF \
  7. -DINSTALL_LAYOUT=STANDALONE \
  8. -DMYSQL_MAINTAINER_MODE=OFF \
  9. -DOPTIMIZER_TRACE=ON \
  10. -DREPRODUCIBLE_BUILD=OFF \
  11. -DWITH_ARCHIVE_STORAGE_ENGINE=ON \
  12. -DWITH_BLACKHOLE_STORAGE_ENGINE=ON \
  13. -DWITH_CLIENT_PROTOCOL_TRACING=ON \
  14. -DWITH_DEFAULT_COMPILER_OPTIONS=ON \
  15. -DWITH_DEFAULT_FEATURE_SET=ON \
  16. -DWITH_EMBEDDED_SERVER=ON \
  17. -DWITH_EMBEDDED_SHARED_LIBRARY=OFF \
  18. -DWITH_EXTRA_CHARSETS=all \
  19. -DWITH_FEDERATED_STORAGE_ENGINE=ON \
  20. -DWITH_INNODB_EXTRA_DEBUG=OFF \
  21. -DWITH_INNODB_MEMCACHED=1 \
  22. -DWITH_LIBEVENT=bundled \
  23. -DWITH_LIBWRAP=OFF \
  24. -DWITH_NUMA=ON \
  25. -DWITH_PARTITION_STORAGE_ENGINE=ON \
  26. -DWITH_RAPID=ON \
  27. -DWITH_SSL=bundled \
  28. -DWITH_SYSTEMD=OFF \
  29. -DWITH_TEST_TRACE_PLUGIN=OFF \
  30. -DWITH_UNIT_TESTS=ON \
  31. -DWITH_ZLIB=bundled \
  32. -DMYSQL_DATADIR=/usr/local/mysql/data \
  33. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
  34. -DINSTALL_MYSQLKEYRINGDIR=/usr/local/mysql/keyring \
  35. -DWITH_BOOST=/code/boost \
  36. -DWITH_GMOCK=/code/googletest \
  37. -DWITH_MECAB=/code/mecab
复制代码
检查cmake命令的输出结果,确保包含以下内容:
  1. ## 包含此内容说明三个第三方库已正确识别并纳入编译
  2. -- Local boost zip /code/boost/boost_1_59_0.tar.gz
  3. -- Local gmock zip /code/googletest/googletest-release-1.8.0.zip
  4. -- MECAB_INCLUDE_DIR = /code/mecab/include
  5. -- MECAB_LIBRARY = /code/mecab/lib/libmecab.a
  6. -- INSTALL /code/mecab/lib/mecab
  7. ## 包含此内容说明cmake已正确获取CentOS 6.10的CodeName (等效于执行: lsb_release -cs)
  8. -- Skipping deb packaging on unsupported platform Final.
  9. ## 在ubuntu-22.04下执行 lsb_release -cs
  10. ## lsb_release -cs
  11. ## jammy
  12. ## 在CentOS 6.10下执行 lsb_release -cs
  13. ## lsb_release -cs
  14. ## Final
复制代码

  • 执行编译和打包
  1. ## 以8个并发编译(可根据编译机器硬件配置调整)
  2. $ make -j8 && make package
复制代码
编译结果检查

INFO_BIN文件检查

对比上述编译生成二进制文件与MySQL二进制TAR包中的INFO_BIN的内容差异,可看到差异主要有以下几点:

  • 编译时间差异(预期中)
  • 内核版本差异(预期中)
  • 依赖包路径差异(预期中)
  • DEB_CODENAME
    MySQL输出为"n/a",而上述编译二进制文件输出为"Final"。"DEB_CODENAME"只在 "packaging/deb-in/CMakeLists.txt" 中使用,分析所属文件,可判断DEB_CODENAME的值不会对编译输出有影响。
差异如下图所示:


程序兼容性检查

基于MySQL二进制TAR包部署一个数据库实例,将上面新编译的mysqld文件替换原始实例中的mysqld并重启,能够正常运行。

Enjoy GreatSQL
来源:https://www.cnblogs.com/greatsql/p/18123283
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具