文章内容较长,请参考目录进行操作。

目录

1、检测系统是否自带mysql

2、下载MySQL

3、安装MySQL

4、环境变量配置

5、下载/升级依赖

1)定位问题

 2)解决问题

gcc版本过低:

使用devtoolset来升级gcc版本

1)安装 centos-release-scl

2)安装 devtoolset

3)激活

注意 

可能报错:

解决办法:

 手动编译

下载安装包:

安装 isl:

编译安装gcc

安装并编译gcc:

编译过程中可能报错:

collect2: ld terminated with signal 9

gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory

没有替换老版本gcc动态库:

6、启动mysql


1、检测系统是否自带mysql

rpm -qa | grep mysql #检查是否安装过MySQL

rpm -qa | grep mariadb #检查是否存在 mariadb 数据库(内置的MySQL数据库),有则强制删除

rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 #强制删除

rpm -e --nodeps mariadb-5.5.68-1.el7.x86_64 #强制删除

为什么mysql用and会报错_动态库

若在删除时提示“mariadb-xxx is not installed”那极为可能是你输入的有误,在Xshell中我们可以鼠标选中查出的信息,右键-复制,再粘贴到你输入的位置即可(一定要右键再选择复制和粘贴,不可以直接使用ctrl+快捷键)

2、下载MySQL

我的项目用的版本是mysql8.0的版本,因此只找了8.0的下载链接,不过5.7的安装步骤之类也是一致的,这个不用担心。无非是下载时选择的版本不同

社区版下载链接:MySQL :: Download MySQL Community Server

进入之后就可以选择下载8.0还是5.7了,不同版本的安装步骤只有这一步不同。

为什么mysql用and会报错_华为云_02

选择要下载的系统

为什么mysql用and会报错_华为云_03

也可以更细致一些,选择适合自己的系统内核

为什么mysql用and会报错_为什么mysql用and会报错_04

 

 最后,不论上面选择的是哪些选项,都要认准这个下载选项。

为什么mysql用and会报错_服务器_05

 (偷摸摸说一句,使用迅雷下载的话速度比官网快很多)

为什么mysql用and会报错_mysql_06

3、安装MySQL

下载完安装包后,就可以使用XFTP上传到服务器上了(建议将软件都安装在/usr/local目录下)

为什么mysql用and会报错_服务器_07

解压命令“tar -zxvf mysql-xxx”

解压完毕后重命名,和安装jdk的过程很类似

为什么mysql用and会报错_mysql_08

不同的是,云服务器安装mysql缺少依赖,可执行“yum -y install numactl”下载相应依赖包

为什么mysql用and会报错_华为云_09

安装常用软件工具命令“yum -y install vim net-tools lrzsz gcc gcc-c++1”

4、环境变量配置

安装完成后就可以开始配置环境变量了

使用命令进入 /etc/profile 目录,配置环境变量

为什么mysql用and会报错_为什么mysql用and会报错_10

在刚刚配置的jdk的配置文件后,再加一段“export PATH=$PATH:/usr/local/mysql/bin”

为什么mysql用and会报错_为什么mysql用and会报错_11

ESC-“:wq”退出保存

再次使用命令“source /etc/profile”更新配置

 

为什么mysql用and会报错_mysql_12

5、下载/升级依赖

初始化mysql时,输入命令“mysqld --initialize --user mysql”进行数据库初始化,而此时会报错“error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory”

这个问题产生原因是因为服务器刚开始什么环境和配置都没有,需要下载依赖。

输入命令“yum install -y libaio”下载依赖即可

下载完成后再次执行初始化命令,此时会报错一大堆

为什么mysql用and会报错_为什么mysql用and会报错_13

产生这个问题的原因有两种:

  1. gcc版本过低
  2. 升级gcc时生成的动态库没有替换老版本gcc的动态库,将gcc最新版本的动态库替换系统中老版本的动态库即可解决

1)定位问题

如何确定自己属于哪一类呢?

通过 strings /usr/lib64/libstdc++.so.6 | grep GLIBC 命令检查动态库

为什么mysql用and会报错_华为云_14

由图上可知,我的gcc的动态库还是旧版本GLIBCXX_3.4.19的

查找编译gcc时生成的最新动态库:find / -name "libstdc++.so*"

为什么mysql用and会报错_为什么mysql用and会报错_15

/usr/lib64是gcc当前的动态库路径,可以看到该动态库已经是最新的gcc版本动态库了。

因此,问题就属于gcc版本过低。

若在查找最新动态库时发现有更新版本的gcc,那就属于没有替换的问题。

为什么mysql用and会报错_mysql_16

 2)解决问题

gcc版本过低:

使用devtoolset来升级gcc版本
1)安装 centos-release-scl

yum install centos-release-scl

为什么mysql用and会报错_服务器_17

2)安装 devtoolset

命令中的9 代表gcc版本,一般安装高版本后低版本的gcc都会自动安装,选择自己适合的版本就可以。

//安装gcc 9 的版本

yum -y install devtoolset-9-gcc*

//安装gcc 7 的版本

yum -y install devtoolset-7-gcc*

为什么mysql用and会报错_为什么mysql用and会报错_18

3)激活

//激活gcc 9

scl enable devtoolset-9 bash

//激活gcc 7

scl enable devtoolset-7 bash

注意 

1.升级完成后一定要运行:gcc --version 看一下版本号变成升级后的gcc版本才算升级成功。

为什么mysql用and会报错_动态库_19


2.scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。

如果要长期使用的话执行:echo "source /opt/rh/devtoolset-7/enable" >>/etc/profilegcc版本9 执行:echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

为什么mysql用and会报错_为什么mysql用and会报错_20

 gcc版本9 执行:echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

3.升级过gcc后还要进行替换老版本gcc动态库的操作

可能报错:

为什么mysql用and会报错_mysql_21

原因在于系统upgrade的时候,残存了上一个版本的软件包信息(比如升级到了attr-2.4.44,但系统中存在了之前缓存的软件包信息)

解决办法:

1).配置正确的yum源

yum install epel-release

2).执行相关命令

yum clean all  ##清除本地yum缓存

yum distro-sync ##同步本地软件和epel源的软件包信息

至此问题基本解决

为什么mysql用and会报错_服务器_22

 手动编译
下载安装包:

原地址:Index of /gnu/gcc

国内使用:Index of /gnu/gcc/

终端内操作

wget http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz

tar  -zcvf gcc-9.1.0.tar.gz

不要直接编译安装的,先检查一下依赖有没有装好。

cd gcc-9.1.0

./contrib/download_prerequisites

因为我这里都安装了,所以显示成功

为什么mysql用and会报错_为什么mysql用and会报错_23

若检查过程中发现有缺少相应的依赖,则使用对应的命令进行下载。

yum install gmp-devel

yum install mpfr-devel

yum install libmpc-devel

安装 isl:

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2

tar -jxvf isl-0.18.tar.bz2

cd isl-0.18 

./configure   

make  

make install   

安装完成后再次检查:

./contrib/download_prerequisites

编译安装gcc

安装开发环境依赖:

yum groupinstall "Development Tools"

为什么mysql用and会报错_动态库_24

yum install glibc-static libstdc++-static

为什么mysql用and会报错_mysql_25

安装并编译gcc:

cd gcc-9.1.0

mkdir gcc-build-9

cd gcc-build-9

../configure --prefix=/usr/local/gcc9 --enable-languages=c,c++,go  --disable-multilib

make -j4

(-j4选项是make对多核处理器的优化,如果不成功请使用 make。建议不要使用make -j来编译,虽然可以缩短编译时间,但极大可能会编译失败)

编译过程中可能报错:
collect2: ld terminated with signal 9

这个报错的原因是华为云并没有默认创建swap分区,使用“free -m”命令查看空余空间,可以看到它的大小是0,也就意味着根本没有给swap分配磁盘。

为什么mysql用and会报错_服务器_26

 那么我们有两种方法可以选:

1. 新建磁盘分区作为swap分区(磁盘空间充足)

        1)卸载所有swap分区

           以root身份进入控制台(登录系统)

           swapoff -a #停止所有的swap分区

        2)对新增磁盘进行分区

            用fdisk命令(例:# fdisk /dev/sdb)对磁盘进行分区,添加swap分区,新建分区,在fdisk中用“t”命令将新添的分区id改为82(Linux swap类型),最后用w将操作实际写入硬盘(没用w之前的操作是无效的)。

        3)对分区进行格式化(格式化为swap分区)

           # mkswap /dev/sdb2 #格式化swap分区,这里的sdb2要看您加完后p命令显示的实际分区设备名

2. 新建文件(磁盘空间并不充足)

        1)创建要作为swap分区的文件  

        例如:增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)

        # dd if=/dev/zero of=/root/swapfile bs=1M count=1024

为什么mysql用and会报错_动态库_27

        2)格式化为交换分区文件

        # mkswap /root/swapfile #建立swap的文件系统

        # chmod 600 /root/swapfile #修改权限

为什么mysql用and会报错_动态库_28

        3)启用交换分区文件

        # swapon /root/swapfile #启用swap文件

        4)使系统开机时自启用

        在文件/etc/fstab中添加一行: /root/swapfile swap swap defaults 0 0

        扩展完分区后再进行编译,还是报错

gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory

 可能的原因:

        问题定位: g++ --version gcc --version

        没有版本号的话安装1)所示安装编译器,有的话按照2)所示运行查找命令

        1)没有安装c++编译器

                解决方式:apt install g++   ## 安装c++编译器

        2)未添加到环境变量中

                解决方式:运行: find / -name "cc1plus"

完成之后,运行make install

没有替换老版本gcc动态库:

查找编译gcc时生成的最新动态库:find / -name "libstdc++.so*"

为什么mysql用and会报错_华为云_29

/usr/local/gcc-9.2.0/lib64/是升级gcc时的输出路径,

使用命令“cp /usr/local/gcc-9.2.0/lib64/libstdc++.so.6.0.27 /usr/lib64”将最新动态库libstdc++.so.6.0.27复制到/usr/lib64路径下(根据自己的路径设置):

重建默认库的软连接:

cd /usr/lib64

ll

rm -rf libstdc++.so.6

ln -s libstdc++.so.6.0.27 libstdc++.so.6

依次执行完毕后再次检查动态库升级完情况

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

为什么mysql用and会报错_mysql_30

可见gcc库版本已经扩展到27了,证明gcc安装成功。

6、启动mysql

此时再使用命令“mysqld --initialize --user mysql”

进行mysql初始化登录即可