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

file

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地址:GitHub - mysql/mysql-server at 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不受支持。忽略错误强制安装操作系统后,启动失败。

file

改为选择"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的值不会对编译输出有影响。

差异如下图所示:

file

file

程序兼容性检查

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/309495.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装VMware ESXi虚拟机系统

简介:ESXi是VMware公司开发的一款服务器虚拟化操作系统。它能够在一台物理服务器上运行多个虚拟机,每个虚拟机都可以独立运行操作系统和应用程序,而且对硬件配置要求低,系统运行稳定。 准备工具: 1.8G或者8G以上容…

vue快速入门(二十三)侦听器的简单写法与完整写法

注释很详细&#xff0c;直接上代码 上一篇 新增内容 侦听器简单写法侦听对象或属性侦听器完整写法侦听对象&#xff08;可选深度侦听&#xff09; 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本,出现了一个问题,就是在pod中访问百度网站,大概时间有10s多,这个时间太长了,尝试了各种办法,都解决不了,后面尝试安装了了1.26.…

AI技术将影响更长远,比如未来的就业形势

随着人工智能渗透到工作场所&#xff0c;人类将需要掌握新的工作技能。 AI作为新技术已经开始扰乱就业市场了。对于最新的AI人工智能技术&#xff0c;经济学家、教育工作者、监管机构、商业分析师以及相关领域专家预测&#xff0c;在不久的将来&#xff0c;人工智能一代将需要…

OCP Java17 SE Developers 复习题12

答案 E. Modules are required to have a module-info.java file at the root directory of the module. Option E matches this requirement. 答案 B. Options A, C, and E are incorrect because they refer to directives that dont exist. The exports directive i…

IOS 短信拦截插件

在使⽤iOS设备的时候, 我们经常会收到1069、1065开头的垃圾短信, 如果开了iMessage会更严重, 各种乱七⼋糟的垃圾信息会时不时地收到。 从iOS11开始, ⼿机可以⽀持恶短信拦截插件了. 我们可以通过该插件添加⼀些规则通过滤这些不需要的信息. ⼀. 使⽤xcode新建⼀个项⽬ 【1】…

网络篇01 | 入门篇

网络篇01 | 入门篇 01 各层协议目录[网络篇02 | 应用层 kcp&#xff08;王者荣耀&#xff09;](https://blog.csdn.net/qiushily2030/article/details/135835946)[网络篇03 | 应用层 quic](https://blog.csdn.net/qiushily2030/article/details/136192481)[网络篇04 | 应用层 m…

【Ubuntu】 Github Readme导入GIF

1.工具安装 我们使用 ffmpeg 软件来完成转换工作1.1 安装命令 sudo add-apt-repository ppa:jonathonf/ffmpeg-3sudo apt-get updatesudo apt-get install ffmpeg1.2 转换命令 &#xff08;1&#xff09;直接转换命令&#xff1a; ffmpeg -i out.mp4 out.gif(2) 带参数命令&…

系统架构最佳实践 -- 统一身份认证系统

目录 1.系统架构设计&#xff1a; 2.用户认证与授权&#xff1a; 3.用户身份管理&#xff1a; 4.安全性保障&#xff1a; 5.日志记录与审计&#xff1a; 6.高可用性与容错性&#xff1a; 7.用户体验优化&#xff1a; 随着互联网的快速发展和应用的普及&#xff0c;人们在…

嵌入式学习day16-22(2024.04.06-13)

文章目录 C语言网络编程socket主机与网络字节序转换inet_addr、inet_aton&#xff08;ip转换&#xff09;inet_ntoa 网络字节序转换为IP字符串端口转换为网络字节序网络字节序转换为端口atoi &#xff08;字符串转换为整数&#xff09; UDP通信流程UDP多进程并发服务器服务端客…

Vue指令案例

通过Vue完成表格数据的渲染展示 最终结果为&#xff1a; <!DOCTYPE html> <html lang"en"><head><script src"vue.js">//引入vue文件</script><meta charset"UTF-8"><meta name"viewport" c…

设计模式系列:责任链模式

简介 责任链模式是一种行为型设计模式&#xff0c;它允许你将请求沿着处理者链进行发送。每个处理者都可以对请求进行处理&#xff0c;或者将其传递给链上的下一个处理者。责任链模式主要应用于面向对象编程中&#xff0c;特别是当系统中的对象需要根据其属性来决定如何处理请…

DNS正反向解析

1.先连接X-shell 主服务器&#xff1a;192.168.32.168&#xff08;server&#xff09; 从服务器&#xff1a;192.168.32.169&#xff08;node&#xff09; 2.给主从服务器做准备工作 [rootserver ~]# setenforce 0 setenforce: SELinux is disabled [rootserver ~]# systemc…

基于SpringBoot+Mybatis框架的私人影院预约系统(附源码,包含数据库文件)

基于SpringBootMybatis框架的私人影院预约系统&#xff0c;附源码&#xff0c;包含数据库文件。 非常完整的一个项目&#xff0c;希望能对大家有帮助哈。 本系统的完整源码以及数据库文件都在文章结尾处&#xff0c;大家自行获取即可。 项目简介 该项目设计了基于SpringBoo…

季节更迭 关爱不变 | 鲁南制药四季守护您的健康生活

春天&#xff0c;万物复苏的季节&#xff0c;一切都充满了生机和活力。在春日的阳光下&#xff0c;鲜花盛开&#xff0c;绿叶茂盛&#xff0c;鸟儿欢歌&#xff0c;蝴蝶翩翩起舞。我们的身体也需要特别的关爱和养护&#xff0c;保持健康和活力&#xff0c;更好地迎接每一次季节…

冯喜运:4-15周一黄金原油行情分析及操作建议

【 黄金消息面分析】&#xff1a;周五(4月12日)美盘时段&#xff0c;黄金价格再创历史新高一度突破2420美元关口&#xff0c;最高触及2431美元/盎司&#xff0c;尽管相对强弱指数(RSI)显示超买状态&#xff0c;但随着以色列和伊朗之间的地缘政治紧张局势升级&#xff0c;投资者…

Object和Objects

Object Object是Java中的顶级父类.所有的类都直接或间接的继承Object类. Object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法. Object的构造方法: Object的成员方法 public class test {public static void main(String[] args) {//1.toString 返回对象…

跨平台桌面应用 Electron 入门学习

本文章主要为该视频的学习笔记&#xff0c;如果侵权会速删。 Electron 01 课程介绍_哔哩哔哩_bilibiliElectron 01 课程介绍, 视频播放量 3046、弹幕量 0、点赞数 75、投硬币枚数 43、收藏人数 179、转发人数 2, 视频作者 极客丶张德龙, 作者简介 当你的能力还不足以撑起自己的…

蓝桥杯算法题:练功

【问题描述】 小明每天都要练功&#xff0c;练功中的重要一项是梅花桩。 小明练功的梅花桩排列成 n 行 m 列&#xff0c;相邻两行的距离为 1&#xff0c;相邻两列的距离也为 1。 小明站在第 1 行第 1 列上&#xff0c;他要走到第 n 行第 m 列上。小明已经练了一段时间&#xff…

【系统分析师】数据库部分

文章目录 1、数据库模式2、数据库设计过程2.1ER模型 3、关系代数 ☆5、规范化理论☆5.1 非规范存在的问题5.2 相关概念5.3范式5.3.1 第一范式-1NF5.3.2 第二范式-2NF5.2.3 第三范式5.2.4 BC范式 5.4 函数依赖分解5.4.1保持函数依赖分解5.4.2 无损分解 5.5 Armstong公理系统 6、…