linux自定义搭建mysql服务

本来想要搭建lnmp环境的,忽然发现自定义搭建的话,得处理很多问题,特别是mysql,因此开了三个不同的章节专门讲php、nginx、mysql的安装,然后顺带能够熟悉各种命令了。其实mysql也可以单独拆开来用的,因此会自定义安装也可以方便以后的安装了,本文用的是mysql-8.0.21-linux-glibc2.12-x86_64.tar,这个文件属于二进制文件,和源码文件是不一样的,因此和网上有些教程不一样,不需要使用.configure和make命令,进行编译。接下来还是讲一下如何搭建好了。
1、下载mysql二进制包,我这里下载的是mysql8.0.21的包:

https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar

然后放到自己存放下载文件的文件夹,我这里是/root/tools文件夹(没有tools文件夹就新建一个)
2、解压二进制文件,需使用下列命令:(这里第一次解压之后会出现三个压缩文件,但只有一个是主要文件,因此还要对那个文件进行解压

tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar
tar -xvJf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz   

TIPS:大多数人使用tar命令的时候都是-zxvf的,但是其中的-z是用于解压zip文件(或者gzip),因此这里不需要-z,而-x是表示解压文件,-v会在处理完之后列出已处理的文件,-f代表将解压后的文件放在当前文件夹下,下面就是解压后的的mysql目录结构了:
mysql01.png

TIPS:在mysql5.7及以上版本的二进制文件没有了my.cnf,一般的设置都集成在mysql.server里面了,但是如果需要更方便快捷的进行配置的话,最好还是使用my.cnf比较好。

解压之后的目录结构如下所示:
|-- LICENSE //证书文件,不用管它
|-- README //阅读文件,不用管它
|-- bin //二进制文件,存放可执行文件,如mysql、mysqld等
|-- docs //文档目录,不用管它
|-- include //
|-- lib //库目录
|-- man //
|-- share //
|-- support-files //
2、进行配置,首先要让mysql服务能够启动,其实只要输入命令(不用急着敲这两个命令)

./bin/mysqld --initialize --basedir=/root/server/mysql/ --datadir=/root/data/mysql/ --user=root 

先初始化,然后输入

./bin/mysqld --basedir=/root/server/mysql/ --datadir=/root/data/mysql/ --user=root 

就可以启动服务了,但是中间有可能会报错:
mysql02.png
这里是少了个库,因此需要使用命令 yum install libaio numactl -y 把库装上就可以了
但是这样的话不够方便,而且对于之后的操作可能会出现BUG,因此这里创建一个my.cnf放在/etc目录下,用来简化一些步骤:
mysql03.png
上面的my.cnf可以看出,配置了basedir,basedir是用来设置服务的基础目录,自然是mysql目录了,还有datadir,是存放数据的目录,这里我在/root下新建了data目录,并新建了mysql目录用来存放mysql数据,还有user配置,用来设置启动用户的。如上配置好之后其实可以很快捷的进行mysql服务的初始化,只要输入如下命令即可:

./bin/mysqld --initialize &

初始化过程如下(如果没有ERROR就表示初始化成功了):
mysql04.png
初始化完成之后就可以尝试运行mysql服务了,这里运行如下命令:

./bin/mysqld &

TIPS:这里之所以运行起来这么简单是因为在my.cnf里面配置了东西的缘故,要不然又得设置basedir、datadir等数据,命令就太长了,写起来不方便
成功运行会出现如下的图样:
mysql05.png
然后使用ps -ef|grep mysql命令,如果显示有mysqld服务正在运行,即可以算成功了。
mysql06.png
然后尝试进入mysql的界面,输入如下命令:

./bin/mysql

但是一般会报如下错误:

./bin/mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory

这里好像是没有相应的文件,输入以下命令

find / -name libtinfo*
ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5

即可。(如果找到的libtinfo.so.6.1不在/usr/lib64文件夹下,则写其对应的文件夹)
改正这个错误之后再输入如下命令,一般会报这个错误

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

刚初始化完成可以直接使用命令

其实这是因为在initialize的时候分配了一个初始密码。
ALTER USER USER() IDENTIFIED BY ‘newpassword’;
修改密码
但是一般不记得密码的话,就很难受,因此这里就直接写一个忘记mysql密码之后该怎么不凭密码进去,并且修改密码的过程吧,其实很简单,只要在my.cnf里面加入一行

skip-grant-tables

就可以了,当然修改了配置之后需要重启一下mysql服务(我这里直接kill掉的)。
再输入./bin/mysql命令之后应当是可以进入mysql命令行的,就如下图所示:
mysql07.png
然后需要修改密码:进入mysql命令行之后,使用

 update mysql.user set  authentication_string='newpassword' where user='root';

TIPS:如果不行可先使用use mysql;切换数据库,再使用update user set authentication_string=‘newpassword’ where user=‘root’;修改密码。
命令,就可以修改成功了,然后再输入命令

flush privileges;

对mysql权限表进行重洗(重启mysql服务也可以起到相同效果),这样修改密码的步骤就结束了。

到上面之后大概的东西都差不多了,服务也能起来,也可以进入命令行进行操作了。但是,总是要进入相应文件夹进行操作总是很麻烦,因此还需要进行全局操作
3、对mysql服务进行全局设置,让服务能够在全局使用。
将bin目录下的mysql复制一份到/usr/bin目录下,即可以在全局进入mysql命令行了,如下图所示:
mysql08.png
然后要让mysql服务作为system服务,能够开机自启,并且能够使用systemctl进行操作,

cp support-files/mysql.server /etc/init.d/mysqld

首先将suuport-files/mysql.server复制到/etc/init.d/目录下,并改成mysqld(自定义服务一般要放在/etc/init.d/目录下,然后将其设置为系统服务,需要输入如下命令:

chkconfig --add mysqld

这样其实就可以成功了,然后输入如下命令:

systemctl restart mysqld 
systemctl status mysqld 

如果得到了如下图的话,表示已经将其设置为系统服务了:
mysql09.png
到这里,mysql服务的搭建就完成了。

有时候使用systemctl status mysqld会产生报错:
/etc/init.d/mysqld: line 256: my_print_defaults: command not found
这个错误根据提示可以发现,是没有找到my_print_defaults命令,只要使用下面的命令将bin目录下的该文件复制到/usr/bin目录下就可以了
cp /root/server/mysql/bin/my_print_defaults /usr/bin

还有一个错误是
Starting MySQL ERROR! Couldn’t find MySQL server (/root/server/mysql/bin/mysqld_safe)
这个错误暂时没解决,只能说,现在可以全局使用mysql启动,但是没办法开机自启了。。
经我实验,应该是由于SELINUX开了的原因,组织了mysqld启动,最方便的方法就是setenforce 0,这样就可以立即看到效果了,但是只是一次性的,如果要永久设置需要进入/etc/selinux/目录下找到config文件,将SELINUT=enforcing设置为SELINUX=disable,这样就可以了,不过这样好像会不太安全,因此如果要更安全的方法,需要对selinux进行更细致的工作。