目录
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)