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

目录

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/mysqldtouch /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.mzph.cn/news/160370.shtml

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

相关文章

VMware三种网络模式

桥接模式 NAT(网络地址转换模式) Host-Only(仅主机模式) 参考: vmware虚拟机三种网络模式 - 知乎 (zhihu.com)

一篇文章搞懂WPF动画的使用技巧

WPF 动画系统提供了丰富的功能,用于为 UI 元素创建流畅的动态效果。动画可以应用于任何可用于渲染的属性,比如位置、颜色、大小等。在 WPF 中,动画是通过更改随时间变化的属性来实现的。 WPF动画基本用法 例如实现如下的动画效果&#xff1…

合并区间问题

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:intervals [[1,…

Java如何获取泛型类型

泛型(Generic) 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Vis…

WPF树形控件TreeView使用介绍

WPF 中的 TreeView 控件用于显示层次结构数据。它是由可展开和可折叠的 TreeViewItem 节点组成的&#xff0c;这些节点可以无限嵌套以表示数据的层次。 TreeView 基本用法 例如实现下图的效果&#xff1a; xaml代码如下&#xff1a; <Window x:Class"TreeView01.Mai…

springcloud整合seata我踩过的坑

版本问题 seata 1.5和1.5之前的目录结构不同,使用docker修改的配置文件也不同 1.4的左右 1.5之后docker 挂载文件也不同 1.5之前是使用自己写的挂载registry docker run -d -p 8091:8091 -p 7091:7091 --network newlead --name seata-serve -e SEATA_IP192.168.249.132…

人工智能基础_机器学习047_用逻辑回归实现二分类以上的多分类_手写代码实现逻辑回归OVR概率计算---人工智能工作笔记0087

然后我们再来看一下如何我们自己使用代码实现逻辑回归的,对二分类以上,比如三分类的概率计算 我们还是使用莺尾花数据 首先我们把公式写出来 def sigmoid(z): 定义出来这个函数 可以看看到这需要我们理解OVR是如何进行多分类的,我们先来看这个 OVR分类器 思想 OVR(One-vs-…

UE 进阶篇一:动画系统

导语: 下面的动画部分功能比较全,可以参考这种实现方式,根据自己项目的颗粒度选择部分功能参考,我们商业项目动画部分也是这么实现的。 最后实现的效果如下: 最终效果 目录: ------------------------------------------- 文末有视频教程/工程地址链接 -------------…

9、鸿蒙应用桌面图标外观和国际化

一、项目资源目录 项目下的resoueces目录为资源配置目录&#xff0c;其中base为基础配置&#xff0c;即在任何语言环境下都会加载的资源&#xff0c; color.json&#xff1a;用于配置颜色&#xff0c;如页面的背景和文字的颜色。 string.json&#xff1a;用于设置文字&#…

Selenium切换窗口、框架和弹出框window、ifame、alert

一、切换窗口 #获取打开的多个窗口句柄 windows driver.window_handles #切换到当前最新打开的窗口 driver.switch_to.window(windows[-1]) #最大化浏览器 driver.maximize_window() #刷新当前页面 driver.refresh() 二、切换框架frame 如存在以下网页&#xff1a; <htm…

Java基础(程序控制结构篇)

Java的程序控制结构与C语言一致&#xff0c;分为顺序结构、选择结构&#xff08;分支结构&#xff09;和循环结构三种。 一、顺序结构 如果程序不包含选择结构或是循环结构&#xff0c;那么程序中的语句就是顺序的逐条执行&#xff0c;这就是顺序结构。 import java.util.Sc…

杭电oj 2064 汉诺塔III C语言

#include <stdio.h>void main() {int n, i;long long sum[35] { 2,8,26 };for (i 3; i < 35; i)sum[i] 3 * sum[i - 1] 2;while (~scanf_s("%d", &n))printf("%lld\n", sum[n - 1]); }

问鼎web服务

华子目录 www简介常见Web服务程序介绍&#xff1a;服务器主机主要数据浏览器网址及http介绍urlhttp请求方法 http协议请求的工作流程www服务器类型静态网站动态网站 快速安装Apache安装准备工作httpd所需目录主配置文件 实验操作 www简介 Web网络服务也叫www&#xff08;world…

编码的发展历史

编码的发展历史 ASCII&#xff1a; ASCII编码使用7位二进制数表示一个字符&#xff0c;范围从0到127。每个字符都有一个唯一的ASCII码值与之对应。例如&#xff0c;大写字母"A"的ASCII码是65&#xff0c;小写字母"a"的ASCII码是97。 ASCII字符集包括英文…

linux服务器安装gitlab

一、安装gitlab sudo yum install curl policycoreutils-python openssh-server openssh-clients sudo systemctl enable sshd sudo systemctl start sshd sudo firewall-cmd --permanent --add-servicehttp curl https://packages.gitlab.com/install/repositories/gitla…

LabVIEW中将SMU信号连接到PXI背板触发线

LabVIEW中将SMU信号连接到PXI背板触发线 本文介绍如何将信号从PXI&#xff08;e&#xff09;SMU卡路由到PXI&#xff08;e&#xff09;机箱上的背板触发线。该过程涉及使用NI-DCPowerVI将SMU信号导出到PXI_TRIG线上。 在继续操作之前&#xff0c;请确保在开发PC上安装了兼容版…

d3dx9_43.dll缺失怎么办?教你一分钟修复d3dx9_43.dll丢失问题

今天&#xff0c;与大家分享关于“d3dx9_43.dll丢失的5个解决方法”的主题。在我们的日常生活和工作中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;而d3dx9_43.dll丢失就是其中之一。那么&#xff0c;什么是d3dx9_43.dll呢&#xff1f;它为什么会丢失&#xff1f;又该…

【LeetCode刷题-链表】--25.K个一组翻转链表

25.K个一组翻转链表 思路&#xff1a; 把链表节点按照k个一组分组&#xff0c;可以使用一个指针head依次指向每组的头节点&#xff0c;这个指针每次向前移动k步&#xff0c;直至链表结尾&#xff0c;对于每个分组&#xff0c; 先判断它的长度是否大于等于k&#xff0c;若是&am…

什么是Zero-shot(零次学习)

1 Zero-shot介绍 Zero-shot学习&#xff08;ZSL&#xff09;是机器学习领域的一种先进方法&#xff0c;它旨在使模型能够识别、分类或理解在训练过程中未见过的类别或概念。这种学习方法对于解决现实世界中常见的长尾分布问题至关重要&#xff0c;即对于一些罕见或未知类别的样…

商务俄语学习,柯桥基础入门教学,千万别小看俄语中的“что”

1、что до (чего) 至于 例&#xff1a; что до меня, то я не могу согласиться 至于我&#xff0c;我不能同意。 А что до зимовки... Ты приедешь в этом году? 说到冬天和过冬…你今年回来吗…