从mysql源码编译出相应的库和可执行文件及搭建mysql服务端

news2025/6/9 18:59:58

目录

1. 问题的提出

2. 源码下载

3. 升级或安装某些前置软件 

3.1. 升级CMake

3.2. 升级gcc、g++

4. 安装依赖库

4.1. 安装OpenSSL

4.2. 安装Curses

4.3. 安装pkg-config

5. 编译、安装

6. 编译结果、配置 

7. 编译错误处理

7.1. 错误1

7.2. 错误2

8.  搭建mysql数据库服务端

8.1. 创建mysql用户及更改相应目录的属主

 8.2. 将mysql进程启动做成服务 

9. 参考链接


1. 问题的提出

       由于客户要求软件跑在国产飞腾CPU上,而mysql官网上的so没有基于飞腾的so库,都是基于X86或ARM的。因为不同的CPU的指令集不同,所以基于X86或ARM的so在飞腾CPU上肯定是不能运行的,所以需要利用mysql源码在飞腾CPU上编译出相应的.so库。

2. 源码下载

       打开MySQL Community Downloads 页面如下:

     因为是要下载源码,而不是下载编译好的so,所以在第2个下拉框中选择“Source Code”,在最后一个下拉框中选择All Operating Systems开头的那项,然后在下面选择下载“Compressed TAR Archive, Includes Boost Headers”项或“Compressed TAR Archive”。

注意:下载需要有oracle账号,如果你是新注册账号或以前有账号,但忘记了密码,oracle会向你发邮件,有时收不到邮件,此时请根据收不到oracle注册或重置密码邮件导致无法登录oracle神奇解决方法博文登录oracle官网。

3. 升级或安装某些前置软件 

        在编译mysql-8.2.0时,下列软件必须保证,否则编译会报错。

  • cmake, 版本必须 >= 3.14.6。
  • gcc、g++, 版本必须 >= 10.0.0。

3.1. 升级CMake

按如下博文:

CMake 版本升级或CMake版本升级

升级CMake,都会报如下错误:

即从源码编译cmake会报找不到openSSL,通过如下命令联网安装:

sudo snap install cmake --classic

 成功将本机CMake升级到3.27.8版本。或者参见4.1节安装OpenSSL,再通过源码安装。

3.2. 升级gcc、g++

         参见Linux下升级gcc(亲测可用)博文操作。

4. 安装依赖库

          以下安装以Ubuntu来讲解,其它系统也有类似的安装命令,请根据不同系统,做相应更改。

4.1. 安装OpenSSL

        执行如下命令:

sudo apt-get install libssl-dev

如果不安装OpenSSL,则编译时会报如下错误:

Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) 

4.2. 安装Curses

        执行如下命令,安装Curses库:

sudo apt-get install libncurses5-dev

如果不安装该库,则会报如下错误: 

 Curses library not found.  Please install appropriate package,

4.3. 安装pkg-config

         执行如下命令,安装pkg-config库:

sudo apt install pkg-config

如果不安装,则会报如下错误:

Cannot find pkg-config

5. 编译、安装

执行如下命令:

sudo cmake . -DCMAKE_INSTALL_PREFIX=/opt/mysql8.2.0  -DMYSQL_DATADIR=/opt/mysql8.2.0/data -DWITH_DEBUG=0 -DSYSCONFDIR=/opt/mysql8.2.0/config -DMYSQL_TCP_PORT=3306  -DWITH_BOOST=/opt/mysql8.2.0/boost -DCMAKE_CXX_COMPILER=/usr/bin/g++  -DFORCE_INSOURCE_BUILD=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=./boost_1_77_0

参数说明:

# 参数说明 (不需要输入进去)

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
#指定mysql的安装路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
#指定mysql进程监听套接字文件(数据库连接文件)的存储路径
-DSYSCONFDIR=/etc \
#指定配置文件的存储路径
-DSYSTEMD_PID_DIR=/usr/local/mysql \
#指定进程文件的存储路径
-DDEFAULT_CHARSET=utf8  \
#指定默认使用的字符集编码,如utf8
-DDEFAULT_COLLATION=utf8_general_ci \
#指定默认使用的字符集校对规则
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
#安装INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
#安装ARCHIVE存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
#安装BLACKHOLE存储引擎
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
#安装FEDERATED存储引擎
-DMYSQL_DATADIR=/usr/local/mysql/data \
#指定数据库文件的存储路径
-DWITH_BOOST=boost \
#指定boost的路径,
-DWITH_SYSTEMD=1
#生成便于systemctl管理的文件

上面的/opt/mysql8.2.0目录及其子目录请根据你本机实际创建好或换成你自己的路径,下同,后文不再就mysql路径目录问题做表述。之后执行如下命令编译:

sudo make -j8

估计编译耗时1.5小时,注意:如果编译出错,请参考第7节排除。编译完成后,执行如下命令安装so到指定目录:

sudo make install

6. 编译结果、配置 

编译、安装后的结果如下:

 执行如下命令打开配置: 

sudo vi /etc/profile

在文件末尾加入如下几行(注意:路径换成你本机的实际路径):

export PATH=/opt/mysql8.2.0/bin:$PATH
export LD_LIBRARY_PATH=/opt/mysql8.2.0/lib:$LD_LIBRARY_PATH

 保存退出,执行如下命令,使配置生效:

 source /etc/profile

7. 编译错误处理

7.1. 错误1

version `GLIBCXX_3.4.32' not found
version `GLIBCXX_3.4.29' not found

第1步:使用如下命令查看是否缺失文件(一般来讲肯定是缺失的)

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

 结果如下:

可以看到,并没有3.4.29、3.4.32版本。

 第2步:使用如下命令查看当前系统中是否有其他同类型的文件,找一个版本较高的。

sudo find / -name "libstdc++.so.6*"

如下图,可以看到有更高版本的同类型文件:

 这个高版本的库位于gcc编译构建目录下,这也就是为何编译时提示gcc版本太低的原因。然后使用如下命令查看这个文件中是否包含需要的版本:

 strings /home/dansir/gcc-13.2.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.32 |  grep GLIBCXX

结果如下:

如上图所示,里面包含有我们需要的版本。然后进行如下操作:

sudo  cp /home/dansir/gcc-13.2.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.32 /usr/lib/x86_64-linux-gnu/

 即将上面找到的高版本的复制到 /usr/lib/x86_64-linux-gnu 目录下,然后执行如下命令删除软连接:

sudo rm /usr/lib/x86_64-linux-gnu/libstdc++.so.6

然后执行如下命令重新建立/usr/lib/x86_64-linux-gnu/libstdc++.so.6软连接,以指向刚才复制的高版本的库:

sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.32  /usr/lib/x86_64-linux-gnu/libstdc++.so.6

问题解决!!!。注意:上面的路径,请根据你本机实际情况更改。 

7.2. 错误2

致命错误:已杀死 signal terminated program cc1plus

在虚拟机中编译的,机器本身是16G内存,分给了虚拟机8G。编译一个大项目时出现这种提示。检查原来的/etc/fstab或者通过“sudo swapon -s” 检查swap文件,发现只有2G左右大小。于是执行如下几组命令:

sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=8192
sudo mkswap /swapfile
sudo swapon /swapfile

 如果还不行,将8192再改大些。

8.  搭建mysql数据库服务端

       说明:请切换到root用户操作本大节内容,否则某些步骤的操作可能会因为权限不够而失败!

8.1. 创建mysql用户及更改相应目录的属主

请切换到root用户操作,依次执行如下命令:

groupadd mysql
useradd -M -g mysql -s /sbin/nologin mysql
chown -R mysql:mysql /opt/mysql8.2.0
chown -R mysql:mysql /opt/mysql8.2.0/data

注意:上面的命令中,如果你本机没有/sbin/nologin,则改为: /usr/sbin/nologin

请切换到root用户操作,编辑配置文件 :

vim /etc/my.cnf
[mysqld]
basedir=/opt/mysql8.2.0
datadir=/opt/mysql8.2.0/data
socket=/tmp/mysql.sock

[mysqld_safe]
log-error=/var/log/mysqld/mysqld.log
pid-file=/var/run/mysqld/mysql.pid

请切换到root用户操作,创建日志文件存放的目录和pid文件存放的目录,并赋权给mysql用户:

mkdir -p /var/log/mysqld /var/run/mysqld
chown -R mysql:mysql /var/log/mysqld
chown -R mysql:mysql /var/run/mysqld

touch /var/log/mysqld/mysqld.log

 请切换到root用户操作,配置环境变量,方便使用MySQL的命令:

vim /etc/profile
export MYSQL_HOME=/opt/mysql8.2.0
export PATH=$PATH:$MYSQL_HOME/bin


 使配置立即生效:

source /etc/profile

查看mysql版本,以确定是否安装成功:

mysql --version  # 验证配置是否成功

 如果出现下面版本信息,则证明安装成功:

mysql  Ver 8.2.0 for Linux on x86_64 (Source distribution)

请切换到root用户操作,执行如下命令初始化数据库:

mysqld --initialize --user=mysql --basedir=/opt/mysql8.2.0 --datadir=/opt/mysql8.2.0/data

 初始化成功后会生成root账户的默认密码。将该密码复制并保存,因为后面需要使用该密码登录到MySQL中修改密码。

请切换到root用户操作,执行如下命令启动mysql进程,如果没报错,能看到如下界面,证明启动成功:

cd /opt/mysql8.2.0/support-files
./mysql.service
Starting MySQL
.. * 

再说一遍:一定要root用户执行上面的命令,否则会报如下错误:

mysql server quit without updating PID file

8.2. 将mysql进程启动做成服务 

     增加一个systemd单元配置文件,该文件详细描述了MySQL服务。文件名为mysqld.service,文件位于 /usr/lib/systemd/system 。

9. 参考链接

【1】:ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found - 知乎 (zhihu.com)

【2】:gcc的升级 。

【3】:"Killed signal terminated program cc1plus"编译错误解决

【4】:MySQL——源码安装教程 

【5】:mysql安装(一) - 知乎 (zhihu.com)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FindMy技术用于充电宝

充电宝是一种便捷的充电器,方便个人随身携带,能够自行储备电能,为主流电子设备提供充电服务。它广泛应用于没有外部电源供应的场所,例如旅行、户外活动或紧急情况下,为用户的手持设备提供持续的电力支持,确…

C语言--数组与指针--打印字符串的n种方式

一.知识背景 一维数组名的含义 arr一般表示数组的起始地址(除了两种例外) 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表…

第四代智能井盖传感器:智能井盖位移怎么进行监测

井盖是城市基础设施的一个重要组成部分,若井盖出现移位等现象,可能会对路过的车辆和行人造成潜在危险。特别是那些含有甲烷气体的井盖,一旦气体超过阈值且被意外踩踏,可能会导致气体的释放,这便会引发一系列安全事故&a…

给定一个非严格递增排列的有序数组,删除数组中的重复项

实例要求:1、给定一个非严格递增排列的有序数组 nums ;2、原地 删除重复出现的元素,使每个元素 只出现一次 ;3、返回删除后数组的新长度;4、元素的 相对顺序 应该保持 一致 ;5、然后返回 nums 中唯一元素的…

Unsupervised MVS论文笔记

Unsupervised MVS论文笔记 摘要1 引言2 相关工作3 实现方法 Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and Martial Hebert. Tejas Khot and Shubham Agrawal and Shubham Tulsiani and Christoph Mertz and Simon Lucey and …

二十二、数组(4)

本章概要 随机生成泛型和基本数组 随机生成 我们可以按照 Count.java 的结构创建一个生成随机值的工具: Rand.java import java.util.*; import java.util.function.*;import static com.example.test.ConvertTo.primitive;public interface Rand {int MOD 10_0…

详解自动化之单元测试工具Junit

目录 1.注解 1.1 Test 1.2 BeforeEach 1.3 BeforeAll 1.4 AfterEach 1.5 AfterAll 2. 用例的执行顺序 通过 order() 注解来排序 3. 参数化 3.1 单参数 3.2 多参数 3.3 多参数(从第三方csv文件读取数据源) 3.4 动态参数ParameterizedTest MethodSource() 4. 测试…

数字IC后端设计利器 - 《Innovus的基本使用流程和命令》

Innovus作为数字后端工具的后起之秀,在先进工艺下已经取得了令人瞩目的成就。其在Run time上的优势令人刮目,在timing、DRC、IR-drop上的结果更是让人竖起大拇指。 数字IC后端工程师学习Cadence公司的Innovus工具非常重要,因为Innovus是一款…

YOLOv8改进实战 | 更换主干网络Backbone(六)之轻量化模型VanillaNet进阶篇

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

封面从这里取好啦

文章目录 前端NPMViteNode.js 后端JavaMavenPython 数据库算法 前端 NPM Vite Node.js 后端 Java Maven Python 数据库 算法

常见面试题-Redis持久化策略

谈谈Redis 的持久化策略? 参考文章: Redis 持久化机制演进与百度智能云的实践 Redis的确是将数据存储在内存的,但是也会有相关的持久化机制将内存持久化备份到磁盘,以便于重启时数据能够重新恢复到内存中,避免数据丢…

反编译-ApkTool

ApkTool下载地址: Apktool | ApktoolA tool for reverse engineering Android apk fileshttps://apktool.org/ 1、使用 apktool 解包 执行 java -jar apktool_2.4.1.jar d demo.apk -o demo 命令 java -jar apktool_2.4.1.jar d demo.apk -o demo 其中 d 后面是…

嵌入式基础知识学习:Flash、EEPROM、RAM、ROM

https://blog.csdn.net/y673533511/article/details/87913989 FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦出可编程(EEPROM) 的性能,还不会断电丢失数据同时可以快速读取数据 (NVRAM 的优势),U 盘和MP3 里用的…

JSP:Javabean

起初,JavaBean的目的是为了将可以重复使用的代码进行打包,在传统的应用中,JavaBean主要用于实现一些可视化界面,如一个窗体、按钮、文本框等,这样的JavaBean称之可视化的JavaBean。 随着技术的不断发展与项目的需求&am…

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上,MySQL 采用的是 WAL(Write-ahead logging,预写式日志)机制来实现的。 在使用 WAL 的系统中,所有的修改都先被写入到日志中,然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …

react大文件上传

目录 大文件上传优点: 大文件上传缺点: 大文件上传原理: 为什么要用md5 实现流程: 部分代码1: 部分代码2:​ 大文件上传优点: 文件太大分片上传能加快上传速度,提高用户体验能断点续传 如果上次上传失败…

纳米软件电源芯片测试案例分享:测试方案、仪器选型、解决测试难点

一、背景介绍 成都某半导体芯片公司是一家专注于开发设计半导体电源芯片的高新技术企业,目前企业对于电源管理芯片研发阶段的测试,绝大部分采用人工手动测试,效率低,耗时长,数据管理储存难度大,无法快速地完…

依托数据、平台、知识增强等优势 夸克大模型大幅降低问答幻觉率

“大模型时代,夸克有巨大机会创造出革新性搜索产品。”11月22日,夸克大模型公布了其面向搜索、生产力工具和资产管理助手的大模型技术布局。数据显示,夸克千亿级参数大模型登顶C-Eval和CMMLU两大权威榜单,夸克百亿级参数大模型同样…

SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径,ResponsBody注解的用途SpringMVC启动流程 SpringMVC运行流程 • 客户端(浏览器)发送请求,直接请求到 DispatcherServlet 。 • DispatcherServlet 根据请求信息调用 …

minio安装使用-linux

下载地址:MinIO | Code and downloads to create high performance object storage 选择 minio server 可以直接下载二进制文件。 将下载的文件传输到服务器的指定文件夹下,如 /opt/minio。 然后在,命令行启动minio: /opt/mini…