今天在服务器上安装不同版本的 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
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;
一开始我没意识到这个问题,服务器上安装了多个 MySQL 数据库,连接的时候指定端口就行,但是始终都连不上,我有重新初始化数据各种网上找资料,来来回回折腾了好几次,用 telnet 127.0.0.1 3308 也能连得上,感觉没问题,但是就是无法登录到数据,猛然间想到用 MySQL 5.7 的用户登录,居然一次就登录成功了,那出问题的就是这个端口了。
MySQL 连接指定端口需要连同主机一起设置才能生效,不然他会忽略这个参数。
这个问题主要是 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';
在配置文件下新增配置,然后保存重启即可
[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
