一、二进制包与源码包的区别
二进制包和源码包是软件包的两种形式。源码包里面包含程序原始的代码,需要在计算机上进行编译后才可以产生可运行程序,所以源码安装时间会比较长;而二进制包里面包含已经编译过、可马上运行的程序,一般只需下载解包后即可使用。
rpm格式的包很好区分。二进制格式的包名字往往很长,并带有版本号、适应平台、适应硬件类型等信息,例如:mysql-5.7.24-el7-x86_64.tar.gz就是二进制包;而源码包仅仅就是带有版本号的tar包,例如:mysql-5.7.14.tar.gz
二、安装前准备
安装前最重要两个准备步骤就是:检查是否有默认的mysql,规划好目录。
1、检查是否默认的mysql
[root@jt ~]# rpm -qa |grep mysql
[root@jt ~]#
说明没有
2、规划好目录
准备在服务器上安装mysql5.6和5.7,所以安装目录和数据目录需要规划清晰,至少数据目录所在磁盘分区要足够大。
[root@jt ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 2.3G 35G 7% /
devtmpfs 911M 0 911M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 340K 920M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
tmpfs 184M 0 184M 0% /run/user/0
[root@jt ~]# mkdir /usr/local/mysql-5.7
[root@jt ~]# mkdir /usr/local/mysql-5.6
[root@jt ~]# mkdir -p /mydata/mysql-5.7
[root@jt ~]# mkdir -p /mydata/mysql-5.6
根分区空间最大,数据目录就设置在这里。
3、添加mysql用户组
[root@jt ~]# groupadd mysql
[root@jt ~]# useradd -r -g mysql -s /bin/false mysql
[root@jt ~]# chown -R mysql:mysql /usr/local/mysql-5.7
[root@jt ~]# chown -R mysql:mysql /usr/local/mysql-5.6
三、安装mysql5.7
将二进制mysql包上传到服务器后,解压:
[root@jt tmp]# tar xf mysql-5.7.24-el7-x86_64.tar.gz
[root@jt tmp]# cd mysql-5.7.24-el7-x86_64
[root@jt mysql-5.7.24-el7-x86_64]# ls
COPYING README bin docs include lib man share support-files
[root@jt mysql-5.7.24-el7-x86_64]# mv ./* /usr/local/mysql-5.7
确定mysql配置文件,进行必要的参数设置:
初始化mysql:
[root@jt bin]# ./mysqld --defaults-file=/etc/my5-7.cnf --initialize --user=mysql --basedir=/usr/local/mysql-5.7 --datadir=/mydata/mysql-5.7
初始化时指定好配置文件,--defaults-file参数必须放在第一位,否则报错;这里初始化的目的是以mysql用户身份生成数据目录下的一些必要文件,例如:
在初始化命令的最后一条输出记录中,告诉了我们root@localhost用户的临时密码,等启动mysql后,可以通过这个临时密码登陆mysql。
启动mysql:
[root@jt ~]# ./mysqld_safe --defaults-file=/etc/my5-7.cnf --user=mysql &
通过前面给定的临时密码,登陆数据库后,首先必须要修改密码才能做其它操作。
四、安装mysql5.6
将二进制包上传后,解压:
[root@jt tmp]# tar xf mysql-5.6.42-linux-glibc2.12-x86_64.tar.gz
[root@jt tmp]# cd mysql-5.6.42-linux-glibc2.12-x86_64
[root@jt mysql-5.6.42-linux-glibc2.12-x86_64]# mv ./* /usr/local/mysql-5.6/
拷贝一份mysql5.7的配置文件,并做相应的改动,注意目录改为5.6的,尤其注意端口号改为3307:
初始化mysql5.6:
[root@jt scripts]# ./mysql_install_db --defaults-file=/etc/my5-6.cnf --datadir=/mydata/mysql-5.6/ --basedir=/usr/local/mysql-5.6/ --user=mysql
mysql5.6的初始化通过basedir的scripts目录下的mysql_install_db命令来完成。
启动数据库,进入bin目录下,启动mysql5.6:
[root@jt bin]# ./mysqld_safe --defaults-file=/etc/my5-6.cnf --user=mysql &
mysql5.6可以直接空密码进入,并无初始密码,进去后可以给root用户改个密码。
五、配置mysql命令和服务
1、添加mysql命令到环境变量中
mysql的命令都在安装目录下的bin目录里,将这个目录添加到环境变量中,这样就不用每次都用命令的绝对路径。
在文件/etc/profile中末尾添加如下一行:
PATH=$PATH:/usr/local/mysql-5.7/bin:/usr/local/mysql-5.6/bin
[root@jt ~]# source /etc/profile
注意️:
当我想要根据mysqld_safe命令重启mysql5.6时,系统根据PATH变量找到的是mysql5.7的mysqld_safe命令,因此若不指定该命令的绝对路径会出现如下情况:
这种情况就是用mysql5.7的mysqld_safe命令启动了mysql5.6的数据库,因此,在同一个服务器上有多个mysql版本时,对于mysql5.6的启动还是要指定mysqld_safe命令的绝对路径比较好。
2、将mysql5.7添加到系统服务中
将support-files下的mysql.server文件拷贝到/etc/init.d/目录下:
[root@jt support-files]# cp mysql.server /etc/init.d/mysql5-7
vim打开/etc/init.d/mysql5-7文件,找到文件中的如下几个参数位置,并设置:
basedir=/usr/local/mysql-5.7
datadir=/mydata/mysql-5.7
other_args="--defaults-file=/etc/my5-7.cnf"
除此之外需要改动代码,改动后如下图标记处:
上面图中标记处,是service mysql5-7 start的实际执行命令,可以看出是调用了mysqld_safe命令的,而服务器上有两个版本的mysql实例,所以该命令必须指定配置文件位置,因此用到了$other_args参数,令:other_args="--defaults-file=/etc/my5-7.cnf"。而该参数的最开始位置在--pid-file参数后面,而--defaults-file文件必须位于第一位置,所以需要将$other_args参数调到第一位置,如上图标记处。
将mysql服务添加到服务列表中:
[root@jt support-files]# chkconfig --add mysql5-7
这样就可以通过chkconfig命令查看到mysql5.7的系统服务了,这里是将mysql5.7服务命名为mysql5-7,之后可以通过service mysql5-7 start来启动mysql。
3、将mysql5.6添加到系统服务中
将support-files下的mysql.server文件拷贝到/etc/init.d/目录下:
[root@jt support-files]# cp mysql.server /etc/init.d/mysql5-6
vim打开/etc/init.d/mysql5-6文件,找到文件中的如下几个参数位置,并设置:
basedir=/usr/local/mysql-5.6
datadir=/mydata/mysql-5.6
other_args="--defaults-file=/etc/my5-6.cnf"
除此之外需要改动代码,改动位置如前一步骤一致。
将mysql服务添加到服务列表中:
[root@jt support-files]# chkconfig --add mysql5-6
这样就可以通过chkconfig命令查看到mysql5.6的系统服务了,这里是将mysql5.6服务命名为mysql5-6,之后可以通过service mysql5-6 start来启动mysql
六、安装过程的问题记录:
1、在初始化mysql5.7时执行mysqld命令报如下错误:
[root@jt bin]# ./mysqld --help
./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
说明没有环境缺少libaio和libaio-devel包:
yum install libaio*
2、在使用mysqld命令指定配置文件时,总是报错:
[root@jt bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql-5.7 --datadir=/mydata/mysql-5.7 --defaults-file==/etc/my5-7.cnf
2019-01-03T07:52:43.670298Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-01-03T07:52:44.734671Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-01-03T07:52:44.853486Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-01-03T07:52:44.916334Z 0 [ERROR] unknown variable 'defaults-extra-file==/etc/my5-7.cnf'
2019-01-03T07:52:44.916356Z 0 [ERROR] Aborting
排查发现是--defaults-file参数必须放在命令的第一位才行。说明:mysqld和mysqld_safe命令若是指定--defaults-file参数时,该参数必须放在第一位置,否则命令会报错。
3、如果有Aborting的错误提示:
2019-01-03 23:20:10 12678 [ERROR] Aborting
错误提示aborting,这十有八九是配置文件中有参数配置错误,主要排查:参数有没有写错、目录有没有创建或者权限是否正确。
4、在初始化mysql5.6时,首次执行mysql_install_db命令时,发生如下报错:
[root@jt scripts]# ./mysql_install_db --defaults-file=/etc/my5-6.cnf --user=mysql --datadir=/mydata/mysql-5.6/
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LANG = "en_US.UTF-8"
这是linux系统环境的问题,
需要在/root/.bashrc文件末尾添加:export LC_ALL=C
并安装:yum install autoconf
将basedir目录的属主和属组改为mysql:chown -R mysql:mysql /usr/local/mysql-5.6。
5、设置mysql系统服务时遇到的问题:
本次在服务器安装了两个不同版本的mysql,并且有两个单独的配置文件。因此在添加mysql服务时遇到的问题比较多。
设置mysql系统服务,实际上就是把support-files目录下的mysql.server 文件复制到/etc/init.d/目录下,之后执行的service mysql start等命令都是执行mysql.server脚本文件。
在最开始设置时,只是将mysql.server文件里的basedir和datadir参数设置了一下,导致mysql5.7启动方式不准确而且mysql5.6启动时一直报错;究其原因就是:通过service mysql start方式启动mysql实际上是调用了mysqld_safe命令,而这种命令调用并不是按照我配置的/etc/my5-7.cnf配置文件启动的。这在脚本文件可以看到,如下图:
通过上面截图的倒数第二行,发现service mysql start的命令启动mysql实际上是调用了mysqld_safe命令来启动mysql,看后面只指定了--datadir和--pid-file参数,另外还有个$other_args变量;那么这种启动方式实际上没有指定我配置的/etc/my5-7.cnf和/etc/my5-7.cnf配置文件的,如果不显示指定的话系统是找不到的,不是期望的启动方式。
因此$other_args参数提供了指定配置文件的方式,在脚本文件中找到other_args参数的赋值语句,如下图:
根据后面的注释,表示这里可以添加我们期望的参数,因此令:other_args="--defaults-file = /etc/my5-7.cnf"。
此外,mysqld_safe命令若指定了--defaults-file参数的话,该参数需要位于第一位置,所以将命令中$other_args参数挪到第一位置,如图:
作出如上的改动后,就可以将mysql5.6和mysql5.7都添加到系统服务中,以后可以通过service * start的命令形式启动数据库了。
6、mysql查找配置文件的顺序
可以用如下命令去看mysql查找配置文件的顺序:
[root@jt ~]# mysql --help|grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
当几个配置文件中包含同一个参数时,mysql会以最后一个文件中的参数为准。在本次安装中,两个版本的配置文件分别是/etc/my5-7.cnf和/etc/my5-6.cnf;在初始化和启动mysql时,让mysql按照默认的方式去配置文件肯定是不行的,因此需要通过--defaults-file参数显示指定。