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

这篇具有很好参考价值的文章主要介绍了5.7打补丁—编译和官方一致的Linux_Generic包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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包如下:

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

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版本信息如下:

Build was done on  Linux-3.8.13-16.2.1.el6uek.x86_64 using x86_64
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不受支持。忽略错误强制安装操作系统后,启动失败。

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

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

  1. glibc版本为2.12。
  2. 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源:
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.ori
$ 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
  • 安装以下依赖包:
$ yum install -y \
cmake \
gcc \
gcc_c++ \
bison \
libaio-devel \
ncurses-devel \
openldap-devel \
openssl-devel \
numactl-devel \
libatomic \
redhat-lsb-core

并安装下载和解压缩工具

$ yum install -y wget unzip

源码文件准备(含第三方库)

根据INFO_BIN文件相关内容可知,需要boost,googletest,mecab:

## INFO_BIN部分内容
LOCAL_BOOST_ZIP:FILEPATH=/usr/global/share/boost_1_59_0.tar.gz
LOCAL_GMOCK_ZIP:FILEPATH=/usr/global/share/googletest-release-1.8.0.zip
WITH_MECAB:STRING=/export/home/pb2/build/sb_0-26514852-1514433850.9/mecab-0.996-el6-x86-64bit
  • 登陆root用户到编译机器,创建“/code”目录,后继编译工作均在该目录下使用root用户进行(请读者朋友注意:这里是为了演示省事方便才这样,安全起见,最好是切换到普通用户进行编译工作):
$ mkdir /code
$ cd /code
  • 下载MySQL源码并解压,打入patch:
## 受国际间网络影响,可能尝试多次才能下载成功
$ wget -c https://github.com/mysql/mysql-server/archive/refs/tags/mysql-5.7.21.zip
$ unzip mysql-5.7.21.zip

## 解压后目录结构为
$ pwd
/code

$ ls
mysql-5.7.21.zip  mysql-5.7.21

## 打入patch(略)
  • 创建boost和googletest库的存放目录,下载压缩包(不需解压,cmake会自动解压):
$ mkdir /code/boost
$ mkdir /code/googletest
$ ls
boost  googletest  mysql-5.7.21.zip  mysql-5.7.21

$ cd /code/boost
$ wget -c https://zenlayer.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz

$ cd /code/googletest/
$ wget -c -O googletest-release-1.8.0.zip https://github.com/google/googletest/archive/refs/tags/release-1.8.0.zip
  • 创建mecab目录,下载源码文件并解压,供后继编译安装使用:
$ mkdir -p /code/mecab/src
$ cd /code/mecab/src
$ wget -c https://src.fedoraproject.org/lookaside/pkgs/mecab/mecab-0.996.tar.gz/7603f8975cea2496d88ed62545ba973f/mecab-0.996.tar.gz
$ 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

$ ls
mecab-0.996.tar.gz  mecab-ipadic-2.7.0-20070801.tar.gz
$ tar -xf mecab-0.996.tar.gz
$ tar -xf mecab-ipadic-2.7.0-20070801.tar.gz
$ ls
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
$ cd /code/mecab/src/mecab-0.996
$ ./configure --prefix=/code/mecab --with-pic && make && make install
  • 编译安装mecab-ipadic
## 注意:编译mecab-ipadic时需要调用mecab和mecab-config,添加link到/usr/bin目录
$ ln -s /code/mecab/bin/mecab /usr/bin/mecab
$ ln -s /code/mecab/bin/mecab-config /usr/bin/mecab-config

$ cd /code/mecab/src/mecab-ipadic-2.7.0-20070801
$ ./configure --prefix=/code/mecab --with-pic && make && make install

执行MySQL编译

  • 创建bld目录
$ cd /code/mysql-5.7.21
$ mkdir bld
$ 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:

$ cmake .. \
-DWITH_PIC=ON \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DENABLED_PROFILING=ON \
-DENABLE_GCOV=OFF \
-DENABLE_GPROF=OFF \
-DINSTALL_LAYOUT=STANDALONE \
-DMYSQL_MAINTAINER_MODE=OFF \
-DOPTIMIZER_TRACE=ON \
-DREPRODUCIBLE_BUILD=OFF \
-DWITH_ARCHIVE_STORAGE_ENGINE=ON \
-DWITH_BLACKHOLE_STORAGE_ENGINE=ON \
-DWITH_CLIENT_PROTOCOL_TRACING=ON \
-DWITH_DEFAULT_COMPILER_OPTIONS=ON \
-DWITH_DEFAULT_FEATURE_SET=ON \
-DWITH_EMBEDDED_SERVER=ON \
-DWITH_EMBEDDED_SHARED_LIBRARY=OFF \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_FEDERATED_STORAGE_ENGINE=ON \
-DWITH_INNODB_EXTRA_DEBUG=OFF \
-DWITH_INNODB_MEMCACHED=1 \
-DWITH_LIBEVENT=bundled \
-DWITH_LIBWRAP=OFF \
-DWITH_NUMA=ON \
-DWITH_PARTITION_STORAGE_ENGINE=ON \
-DWITH_RAPID=ON \
-DWITH_SSL=bundled \
-DWITH_SYSTEMD=OFF \
-DWITH_TEST_TRACE_PLUGIN=OFF \
-DWITH_UNIT_TESTS=ON \
-DWITH_ZLIB=bundled \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DINSTALL_MYSQLKEYRINGDIR=/usr/local/mysql/keyring \
-DWITH_BOOST=/code/boost \
-DWITH_GMOCK=/code/googletest \
-DWITH_MECAB=/code/mecab

检查cmake命令的输出结果,确保包含以下内容:

## 包含此内容说明三个第三方库已正确识别并纳入编译
-- Local boost zip /code/boost/boost_1_59_0.tar.gz
-- Local gmock zip /code/googletest/googletest-release-1.8.0.zip
-- MECAB_INCLUDE_DIR = /code/mecab/include
-- MECAB_LIBRARY = /code/mecab/lib/libmecab.a
-- INSTALL /code/mecab/lib/mecab

## 包含此内容说明cmake已正确获取CentOS 6.10的CodeName (等效于执行: lsb_release -cs)
-- Skipping deb packaging on unsupported platform Final.

## 在ubuntu-22.04下执行 lsb_release -cs
## lsb_release -cs
## jammy

## 在CentOS 6.10下执行 lsb_release -cs
## lsb_release -cs
## Final
  • 执行编译和打包
## 以8个并发编译(可根据编译机器硬件配置调整)
$ make -j8 && make package

编译结果检查

INFO_BIN文件检查

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

  1. 编译时间差异(预期中)

  2. 内核版本差异(预期中)

  3. 依赖包路径差异(预期中)

  4. DEB_CODENAME

    MySQL输出为"n/a",而上述编译二进制文件输出为"Final"。"DEB_CODENAME"只在 "packaging/deb-in/CMakeLists.txt" 中使用,分析所属文件,可判断DEB_CODENAME的值不会对编译输出有影响。

差异如下图所示:

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

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

程序兼容性检查

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


Enjoy GreatSQL 😃

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

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

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群

5.7打补丁—编译和官方一致的Linux_Generic包文章来源地址https://www.toymoban.com/news/detail-845303.html

到了这里,关于5.7打补丁—编译和官方一致的Linux_Generic包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 『Linux』补丁制作指南

    我们在参与某些开源项目的过程当中,经常会遇到漏洞之类的问题,需要我们打补丁解决。尤其是 Linux 源码,源码代码量较多,在修改完内核并发布新内核的时候,基本采用补丁的方式进行发布,而不是将整个内核打包发布 我们使用补丁发布有很多好处 补丁体积很小,方便

    2024年02月08日
    浏览(38)
  • mysql-5.7 Linux安装教程

         1.1  在官网:MySQL 5.7.36 中,选择以下版本的mysql下载:     1.2 通过命令下载:            建议:在windows上使用迅雷下载,速度很快,使用工具(Xftp或WinSCP)上传到 /usr/local目录下,然后通过Xshell 7进入服务器;  2.1 压缩包解压    进入 压缩包存放的位置,查看压缩

    2023年04月24日
    浏览(48)
  • Linux离线安装Mysql-5.7

    在真实业务场景下,Linux服务器一般位于内网,所以无法直接访问互联网资源; 特别是安装数据库的Linux服务器,在网络方面的管控只会更加严格; 因此,需要提前下载好相关资源,再传输到内网Linux服务器进行安装; 下载地址:https://dev.mysql.com/downloads/mysql/ 注意:官网的下

    2024年02月08日
    浏览(77)
  • MySQL 5.7 安装(包含window、Linux、Docker)

    目录  window安装  Linux(centos)安装 Docker安装 下载需要的C++运行库 采用镜像下载安装包 清华大学的镜像站 网易开源的镜像站 具体的位置(5.7.35) 安装过程 双击启动安装包,点击  Next  进入下一步。 勾选  I accept the terms in the License Agreement  ,同意协议,点击  Next  进入

    2024年03月14日
    浏览(54)
  • CVE-2020-14750 漏洞复现和Linux打补丁详解

    使用的工具整理:jdk1.79,weblogic安装包(中文版),两个补丁包 链接:https://pan.baidu.com/s/1ehrO4fjv7beth2fp06XXPA?pwd=z8ju 提取码:z8ju 漏洞环境搭建参考如下博客: [(64条消息) 详细教程]jdk官方下载,Linux安装jdk1.7,图文解说,一看就会_gosin1994的博客-CSDN博客_linux 1.7 官网下载 (64条消

    2024年02月05日
    浏览(35)
  • QGIS源码编译步骤详解——官方新方案

      方案详细可见源码文件中INSTALL.md。   QGIS源码下载:https://github.com/qgis/QGIS/releases   建议3.16版本,本文源码版本3.16.3。   3.22版本编译后会出现大量关于inline的错误,暂时不知如何解决。 下载Cygwin64安装包,setup-x86_64.exe。 安装Cygwin64,并安装Flex、Bison。 Flex = 2.5.

    2024年02月06日
    浏览(32)
  • Linux环境安装 MySQL 5.7详细步骤(tar.gz解压版安装)

           解压:(注意解压的mysql压缩包已自己实际下载的为准)  解压成功  修改解压后的文件名(纯属为了方便)    在mysql57的文件夹里面创建存放数据库的data文件夹和日志的log文件夹 ,并修改访问权限

    2024年02月05日
    浏览(73)
  • Linux patch命令教程:如何在Linux中应用和创建补丁(附实例详解和注意事项)

    patch 命令在Linux和其他类Unix操作系统中,用于将一个文件的修改应用到另一个文件。这个命令可以读取一个补丁文件,并使用其中的内容作为一组指令。通过遵循这些指令,修改后的文件中的更改可以在原始文件中复制。 patch 命令在大多数Linux发行版中都是可用的,包括Deb

    2024年04月13日
    浏览(76)
  • ESP32 官方AT固件编译(从零开始环境搭建到编译完成全过程)

    https://download3.vmware.com/software/WKST-PLAYER-1702/VMware-player-full-17.0.2-21581411.exe https://releases.ubuntu.com/jammy/ubuntu-22.04.2-desktop-amd64.iso 可能需要进电脑的BIOS打开一个选项才能安装成功虚拟机 5.1 GIT 克隆 git clone --recursive https://github.com/espressif/esp-at.git 如果没有安装git,按照控制台的提示安

    2024年02月15日
    浏览(48)
  • 【Shell 命令集合 文件管理】Linux 补丁文件应用命令 patch命令使用指南

    Shell 命令专栏:Linux Shell 命令全解析 在Linux中, patch 命令用于将补丁文件应用到源代码文件中,从而实现对源代码的修改。 patch 命令的详细描述如下: patch 命令用于将补丁文件应用到源代码文件中,以实现对源代码的修改。补丁文件通常是由开发者或者社区提供的,用于修

    2024年02月09日
    浏览(102)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包