同一服务器上二进制安装mysql5.7和mysql5.6

  1. 云栖社区>
  2. 袋鼠云技术团队>
  3. 博客>
  4. 正文

同一服务器上二进制安装mysql5.7和mysql5.6

未央& 2019-01-04 23:53:43 浏览961
展开阅读全文

一、二进制包与源码包的区别

二进制包和源码包是软件包的两种形式。源码包里面包含程序原始的代码,需要在计算机上进行编译后才可以产生可运行程序,所以源码安装时间会比较长;而二进制包里面包含已经编译过、可马上运行的程序,一般只需下载解包后即可使用。

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配置文件,进行必要的参数设置:
image

初始化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用户身份生成数据目录下的一些必要文件,例如:
image

在初始化命令的最后一条输出记录中,告诉了我们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:
image

初始化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命令,因此若不指定该命令的绝对路径会出现如下情况:
image

这种情况就是用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"

除此之外需要改动代码,改动后如下图标记处:
image

上面图中标记处,是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配置文件启动的。这在脚本文件可以看到,如下图:
image

通过上面截图的倒数第二行,发现service mysql start的命令启动mysql实际上是调用了mysqld_safe命令来启动mysql,看后面只指定了--datadir和--pid-file参数,另外还有个$other_args变量;那么这种启动方式实际上没有指定我配置的/etc/my5-7.cnf和/etc/my5-7.cnf配置文件的,如果不显示指定的话系统是找不到的,不是期望的启动方式。

因此$other_args参数提供了指定配置文件的方式,在脚本文件中找到other_args参数的赋值语句,如下图:
image

根据后面的注释,表示这里可以添加我们期望的参数,因此令:other_args="--defaults-file = /etc/my5-7.cnf"。
此外,mysqld_safe命令若指定了--defaults-file参数的话,该参数需要位于第一位置,所以将命令中$other_args参数挪到第一位置,如图:
image

作出如上的改动后,就可以将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参数显示指定。

网友评论

登录后评论
0/500
评论
未央&
+ 关注
所属云栖号: 袋鼠云技术团队