您当前的位置:首页 > 计算机 > 软件应用 > 数据库 > MySQL

Centos8 安装多个 MySQL8 数据库

时间:12-14来源:作者:点击数:

今天在服务器上安装不同版本的 MySQL8,耽误了一整天时间,有些问题是操作失误和方向误导,导致浪费了大量的时间,做个笔记方便以后查阅。

安装 MySQL8

客户服务器上用得 宝塔 搭建的运行环境,但是要上一个新系统,使用到的 MySQL 版本不一致,目前服务器上的 MySQL 版本是 5.7,但是新系统是 8,通过查找资料得知 宝塔 是没法同时安装多个 MySQL 的,无奈只能自己手动安装一个。

1、到 dev.mysql 商业网/downloads/mysql/8.0.html 下载需要的压缩包:

2、解压文件

tar xvf mysql-8.0.29-linux-glibc2.12-x86_64.tar.xz

3、将解压文件移至 /usr/local 目录下

mv mysql-8.0.29-linux-glibc2.12-x86_64 /usr/local/mysql8.0

4、创建用户组 mysql(如果你的系统上已经有 mysql 用户了,可以跳过 4、5 步骤)

groupadd mysql

5、用户组下增加用户 mysql

useradd -r -g mysql mysql

6、创建 my.cnf

在 /usr/local/mysql8.0 目录下创建 my.cnf,内容如下:

[mysqld]
basedir=/www/wwwroot/mysql8
datadir=/www/wwwroot/mysql8/data
port=3308
socket=/www/wwwroot/mysql8/mysql.sock
character_set_server=utf8
lower_case_table_names=1
log-error=/www/wwwroot/mysql8/data/mysql.log
pid-file=/www/wwwroot/mysql8/data/mysql.pid
mysqlx_socket = /www/wwwroot/mysql8/mysqlx.sock
mysqlx_port = 33920
innodb_data_file_path = ibdata1:12M;ibdata2:1G:autoextend
default_authentication_plugin = mysql_native_password

[mysql]
default-character-set=utf8

7、初始化数据库

/www/wwwroot/mysql8/bin/mysqld --defaults-file=/www/wwwroot/mysql8/mysql8.cnf --user=mysql --initialize --lower-case-table-names=1

8、修改 /usr/local/mysql8 所有者及属组

chown -R mysql:mysql /usr/local/mysql8/

允许外网访问

启动 MySQL 服务

/www/wwwroot/mysql8/bin/mysqld --defaults-file=/www/wwwroot/mysql8/mysql8.cnf --user=mysql &

9、修改密码并授权

登录:

/www/wwwroot/mysql8/bin/mysql -h 127.0.0.1 -P 3308 -uroot -p

修改密码并授权:

alter user 'root'@'localhost' identified by 'xxxxxx';
CREATE USER 'root'@'%' IDENTIFIED BY 'xxxxxx';
grant all privileges on *.* to 'root'@'%';
flush privileges;

10、开启防火墙,允许外网访问

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

设置为服务

cp /www/wwwroot/mysql8/support-files/mysql.server /etc/init.d/mysqld2
vi /etc/init.d/mysqld2 # 添加路径(等号前面已写好了,只需添加后面)

在打开的文件里面配置对应的路径

...
basedir=/www/wwwroot/mysql8
datadir=/www/wwwroot/mysql8/data
....

启动服务(不知为何,我启动的时候总是显示 . 点,一直都没有启动成功,索性还是使用上面的方法启动的)

service mysqld2 start

加入开机启动

chkconfig --add mysqld2

常见错误

You must reset your password using ALTER USER statement before executing this statement.

MySQL 版本 8.0.21,在给新用户授权时,执行如下语句:

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

报错如下:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'password' with grant option'

原因分析 :高版本的 MySQL 把将创建账户和赋予权限分开了。

解决方法:分开执行。

#创建账户
create user 'root'@'%' identified by '123456';

#赋予权限
grant all privileges on *.* to 'root'@'%' with grant option;

#刷新
flush privileges;

-P 参数无效

一开始我没意识到这个问题,服务器上安装了多个 MySQL 数据库,连接的时候指定端口就行,但是始终都连不上,我有重新初始化数据各种网上找资料,来来回回折腾了好几次,用 telnet 127.0.0.1 3308 也能连得上,感觉没问题,但是就是无法登录到数据,猛然间想到用 MySQL 5.7 的用户登录,居然一次就登录成功了,那出问题的就是这个端口了。

MySQL 连接指定端口需要连同主机一起设置才能生效,不然他会忽略这个参数。

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column……

这个问题主要是 MySQL 开启了only_full_group_by ,同时 select 语句不够标准。only_full_group_by 说白了就是要求,select 的列要全部来自于group by 中的列,不能 select 之外的列。 这个主要是 MySQL 版本,5.7 之前是默认关闭的,5.7 之后的高版本都是自动打开 only_full_group_by 校验检测的。

解决方法:

方案一:不能永久生效

去掉 ONLY_FULL_GROUP_BY,重新设置值。

set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 

上面是改变了全局 sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行

set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
方案二:永久生效,改 MySQL 的配置文件

在配置文件下新增配置,然后保存重启即可

[mysqld] 
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐