使用源码编译安装MySQL5.7

Building MySQL5.7 from Source

从零开始,CentOS-7-x86_64-Minimal-2003

这个实验折腾了很久时间,对我来说大概分为三步:查找教程、编译、配置

其实编译的时候还好,放在哪里就够了,而配置所花的时间是最多的,本来就是几步很简单的操作,但是就是有各种问题,也许是我第一次没经验,所以就这样呗。

我遇到的问题就不复现了,按照我这个教程做下去理论上不会有任何问题,为了写这个笔记我花了两个小时编译安装配置,真是拿命在肝呀。

下载源码

MySQL官网有点慢,这里是从华为开源镜像站下载的

注意下载带boost的版本,MySQL5.7.30使用cmake的方式构建,需要boost_1.59这个库

从yum安装的boost版本是1.52,如果不下载带boost的版本的话需要自己下载对应的boost源码编译安装

yum install wget
wget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-boost-5.7.30.tar.gz
[root@localhost ~]# ll mysql-boost-5.7.30.tar.gz 
-rw-r--r--. 1 root root 51363998 Mar 24 00:50 mysql-boost-5.7.30.tar.gz

解压

tar -xvf mysql-boost-5.7.30.tar.gz
cd mysql-5.7.30/
mkdir bld
cd bld

安装依赖

openssl-develncurses-devel都是开发包,而bison是没安装开发包的,cmake是正常的

yum install cmake gcc-c++ openssl-devel ncurses-devel bison

image-20200614112545811

构建

其它参数我不知道,这里只需要指定boost目录就好了(官网一个参数也没加)

这里的..是指上级目录为源码

注意:构建过程中会又输出日志,有ERROR的话根据提示解决,一般都是依赖问题,如果其中有任何提示比如:测试失败、模块找不到等等都不用管,只要不是ERROR就好了。

cmake .. -DWITH_BOOST=../boost

image-20200614113000319

image-20200614113054669

编译

这个编译过程时间比较长,我没有尝试MySQL8.0大概就是因为这个过程太长了,特别是虚拟机里面又不能完全发挥电脑性能,虽然我双系统装了一个Ubuntu,但是那个已经被我调教的可以日常使用过了,我不想去折腾,搞不好编译失败出现啥问题,而且apt源默认的mysql版本就是8.0,我没有任何必要去尝试手动编译。

这个过程无论它输出什么信息都不用管,反正也不知道怎么解决,除非它自动中断了,不然就一直等着。

如果它中断了,那么就删除当前目录的所有构建文件,然后重新构建编译。

make

image-20200614122740794

安装

一般来说安装过程是不会有问题的。

我之前构建的时候没有指定安装目录什么的,一切都是默认的,最后安装位置是/usr/local/mysql

make install

image-20200614123108181

image-20200614123158002

配置

这一步只需要注意文件权限问题(关键)

创建用户和用户组

参照自MySQL官方的教程,不用纠结解释器是不是/sbin/nologin这些东西

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

/etc/my.cnf

初始化的时候应该是采用这个文件的配置(如果不指定的话),暂时不要修改任何东西

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

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

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

创建文件

这一步就是把上面配置文件里面的各种文件夹创建出来

同时把mariadb.log文件创建出来了,其实我觉得配置这些文件夹的属组属性之后应该就不用手动创建了吧,但是后面启动服务的时候发现它自己创建不了这个日志文件,而那个.pid文件没管它倒是好好的。

mkdir /var/lib/mysql
mkdir /var/log/mariadb
touch /var/log/mariadb/mariadb.log
mkdir /var/run/mariadb
chown mysql:mysql /var/lib/mysql/
chown mysql:mysql /var/log/mariadb -R
chown mysql:mysql /var/run/mariadb/

初始化

参照自MySQL官方文档,别管其它参数

把临时密码记下来,这个不会记录到日志里面去。

bin/mysqld --initialize --user=mysql

image-20200614125004850

这一步也是官方文档的,不知道有什么用,可以不执行

bin/mysql_ssl_rsa_setup

启动服务

截图是正常的,到现在为止没有一个错误,前提是前面说的那些文件夹以及文件都创建好了,权限都设置好了,如果没有,那请你多折腾吧。

bin/mysqld_safe --user=mysql &

image-20200614130312497

测试登录的时候会出现了一个问题,这个需要修改一下/etc/my.cnf文件(也可以创建软连接,这里就不提了),追加如下:

[mysql]
socket=/var/lib/mysql/mysql.sock

image-20200614130742842

运行安全配置

这一步可以把临时密码改了,其它配置随缘

中间询问了是否开启密码安全插件,为了方便起见,本地服务器,密码要多简单就多简单,所有我啥也没开启。后面还问了移除什么东西,都是无效的操作,随便选择。

bin/mysql_secure_installation

image-20200614130936761

配置环境变量

这样配置之后可以在任意的地方执行/usr/local/mysql/bin目录下的脚本,在/etc/profile追加内容如下:

vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile

添加服务

这也是可选择的,本质上就是用系统服务来管理mysqld_safe的状态

可以看到/usr/local/mysql/bin还有其它的脚本:这里说一下mysqldmysqld_safe,这两个脚本都可以启动服务,但是更推荐使用mysqld_safe,就这。

cp support-files/mysql.server /etc/init.d/mysql.server
systemctl daemon-reload

由于我们手动编译安装之后的mysql的服务并不是系统服务,因此使用systemctl enable mysql.server会提示错误,根据它的错误提示更改操作就好了,其实也没有太大的必要添加开机自启,应个人情况而定吧。

systemctl start mysql.server
systemctl stop mysql.server
systemctl status mysql.server

# Executing /sbin/chkconfig mysql.server on
systemctl enable mysql.server	# is not a native service
systemctl diable mysql.server

image-20200614131647988

配置远程登录

根据自己的需求配置,一般服务器配置一下没关系,但是为了安全期间,生产环境还是别了。

只不过我有点奇怪,这里有两个root用户,只是Host不同就算两个不同的用户?

测试发现本地还是只能用以前那个用户登录,远程只能用新添加的这个(密码)。

use mysql;
select user, authentication_string, host from user;
grant all privileges on *.* to 'root'@'%' identified by 'password';
flush privileges;
systemctl restart mysql.server

image-20200614132158842

防火墙端口放行

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

测试

非常尴尬,上一步修改host权限的时候忘记把密码换成自己的了,现在就是password,我是没有系统学习用户权限管理的,万年root用户了,目前学习阶段还不影响,以后还是要认真的关注一下了。

image-20200614132643861

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://blog.imoyb.com/archives/building-mysql-from-source