likes
comments
collection
share

MySQL8.0 安装踩坑指南

作者站长头像
站长
· 阅读数 10

就在昨天上午,刚为云服务器安装好Apache2.4.33和PHP7.2.4环境,准备再来一个最新的MySQL5.7.22。寻找5.7版本的rpm包时下到mysql80xxx.rpm,看人家的教程是mysql57,难道80是MySQL出出...出了8版,一搜新闻2个小时前MySQL发布了8.0.11正式稳定版(GA)。我心里什么感觉

——刚刚准备起步就被超车

看到宣传的2倍性能提高、诸多新特性,objk。那就来飙(踩)车(坑)吧,果断放弃MySQL5.7直接上8。

MySQL8.0用到了新的密码插件验证方式,5.7叫做mysql_native_password,8.0叫做caching_sha2_password,这种加密方式让很多和MySQL连接的界面工具(如Navicat)或编程语言(如PHP)mysqli接口失效:

Error : The server requested authentication method unknown to the client [caching_sha2_password]

报错:客户端不知道服务器要求验证的规则[caching_sha2_password],

MySQL8.0 安装踩坑指南

目标:在云服务器Linux和本地windows都上最新MySQL8.0.11,同时让PHP7能连通用mysqli接口连通。

工具:PuTTY用于远程连接云服务器输入命令;FileZilla Client监控服务器的文件目录,看看到底命令做了什么。

windows版

1、在官方下载MySQL ZIP压缩版

https://dev.mysql.com/downloads/mysql/

MySQL8.0 安装踩坑指南

2、解压后放到任意一个你指定的目录

例如:E:\myServer\mysql-8.0.11-winx64

新建自定义默认配置文件my.ini内容如下,根据实际存放地址修改路径

[mysqld] # port 设置端口 ,若设置3306是默认端口可生路# basedir 设置MySQL的安装目录  # datadir 设置MySQL数据库的数据的存放目录port = 3380basedir=E:\myServer\mysql-8.0.11-winx64\datadir=E:\myServer\mysql-8.0.11-winx64\data# mysql8.0.11 默认值为caching_sha2_passworddefault_authentication_plugin=mysql_native_password[client]# cmd.exe MySQL命令行所用端口 与上方保持一致port = 3380# https://dev.mysql.com/doc/refman/8.0/en/connecting.html

3、以管理员身份进入命令行cmd.exe执行安装和初始化

注意:以管理员身份执行cmd.exe,输入完一行指令按回车键执行

语句解释如下,默认路径为E:\myServer请根据实际修改# 1 [跳转到MySQL主进程mysqld目录]E:cd E:\myServer\mysql-8.0.11-winx64\bin# 2 [加入windows服务,自定义名字MySQL3380]mysqld -install MySQL3380#3 [初始化将生成数据存放文件夹data,生成无密码root帐号]mysqld --initialize-insecure# 4 [启动MySQL服务]net start MySQL3380# 5 通过命令行,进入mysql控制台。默认密码为空,回车即可mysql -u root -p#--------------------------------------------# [卸载服务(未用到)]net stop MySQL3380sc delete MySQL3380

[上方指令动图演示.gif]

MySQL8.0 安装踩坑指南


Linux版

环境为云服务器系统版本CentOS7.3,使用Yum Repository安装

[root@codenight ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)

发现系统目录/etc下存在一个MySQL配置文件my.cnf(2016年11月显然是系统自带的),我们想知道在执行mysql-server过程中,哪一步会生成或修改my.cnf,默认存的内容只有几行

[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockassorted security riskssymbolic-links=0[mysqld_safe]log-error=/var/log/mariadb/mariadb.logpid-file=/var/run/mariadb/mariadb.pid!includedir /etc/my.cnf.d

1.下载MySQL8.0.11的.rpm文件

wget  https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

这一步在服务器 /root 目录下载文件mysql80-community-release-el7-1.noarch.rpm

2.安装rpm包

rpm -ivh mysql80-community-release-el7-1.noarch.rpm --force --nodeps

这一步在 /etc/yum.repos.d/ 目录下生成两个文件:

mysql-community.repo

mysql-community-source.repo

3.安装mysql-community-server

yum install mysql-community-server

弹出对话框确认y,最终Complete! 这一命令安装了很多

MySQL8.0 安装踩坑指南

就是这一步生成了新的MySQL配置文件my.cnf,主要内容如下,不必修改

# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html[mysqld]# innodb_buffer_pool_size = 128M# log_bin# join_buffer_size = 128M# sort_buffer_size = 2M# read_rnd_buffer_size = 2M## 移除default_authentication_plugin前面的#, # 这样就可以兼容老旧的客户端了。有关内容请看:# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin# default-authentication-plugin=mysql_native_passworddatadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socklog-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid

4、启动mysqld服务并加入开机自启动

[root@codenight ~]# systemctl start mysqld.service[root@codenight ~]# systemctl enable mysqld.service

5、获取临时登录密码

[root@codenight ~]# grep 'temporary password' /var/log/mysqld.log

复制其中返回的密码:

MySQL8.0 安装踩坑指南

小提示:如果密码死活不对,复制到记事本仔细核对。还不行的话只能用黑魔法(其实最大的可能还是密码复制错了),去到/var/log/下载mysqld.log,找到里面的password修改自定义密码上传mysql.log并重启MySQL服务

 

6、登录数据库输入以上密码

[root@codenight ~]# mysql -u root -p

执行任意SQL语句都会提示错误

mysql> SHOW DATABASES;ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

[错误1820] 提醒必须使用ALTER USER重置你的密码

7、重置密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';ERROR 1819 (HY000): Your password does notsatisfy the current policy requirements

[错误 1819] 提示你的密码不满足当前policy要求

原因是validate_password.policy的默认值是1(中级强度),除了8位长度必须要含有数字、大小写字母、特殊字符至少一种,例如3ONbm<gdt1_j

MySQL8.0 安装踩坑指南

https://dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html#sysvar_validate_password.policy

如果还是想用简单8位密码例如abc54321,降低policy的值

mysql> SET GLOBAL validate_password.policy=0;Query OK, 0 rows affected (0.00 sec)

现在密码就改为12345678了

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';Query OK, 0 rows affected (0.04 sec)

8、开放远程连接

我们直接在user表插入一个条适用于任何主机,登录名为root密码为12345678的记录,刷新权限就可以远程登陆了,确认服务器安全组或已放行3306端口。

USE mysql;INSERT INTO `user` VALUES ('%', 'root', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', '0', '0', '0', '0', 'mysql_native_password', '*84AAC12F54AB666ECFC2A83C676908C8BBC381B1', 'N', '2018-04-21 11:25:16', null, 'N', 'Y', 'Y', null, null);FLUSH PRIVILEGES;

看看用户权限表里面用户和密码

mysql>  SELECT host,user,plugin,authentication_string FROM mysql.user;+-----------+------------------+-----------------------+---------------------------------------------------------------------+| host      | user             | plugin                | authentication_string                                               |+-----------+------------------+-----------------------+---------------------------------------------------------------------+| %         | root             | mysql_native_password | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1                           || localhost | mysql.infoschema | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE                           || localhost | mysql.session    | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE                           || localhost | mysql.sys        | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE                           || localhost | root             | caching_sha2_password | $A$005$0qyQJPnk>R5J>~}tGo2dCdahVKfz42pCUr/3tLWJYERvir2Mr5jUUkBR2B |+-----------+------------------+-----------------------+---------------------------------------------------------------------+5 rows in set

注:同样的密码12345678生成的密文string,第一行是native加密的结果,第五行是sha2加密的结果,服务器命令行使用的是host=localhost AND user=root,远程连接使用host=% AND user=root

9、优雅降级

    现在Navicat可以远程连接上了,PHP等编程语言调用的mysqli接口还不行,因为MySQL8.0.11 前天才发布正式版,这些程序接口都没来得写(PHP最新一版是3月30号),所以加密plugin需要设置为mysql_native

MySQL8.0 安装踩坑指南

修改/etc/my.cnf,保存并重启MySQL服务器

MySQL8.0 安装踩坑指南

[root@codenight ~]# systemctl restart mysqld.service

10、其他相关错误处理

MySQL8.0 安装踩坑指南

例如密码12345678,user表里的authentication_string字段必须存放根据 plugin字段指明的规则生成的密文,否则无论如何输入都提示密码错误的

MySQL8.0 安装踩坑指南


参考资料:

[官方]使用Yum Repository安装MySQL:https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html

CentOS7 通过YUM安装MySQL5.7:https://www.cnblogs.com/jorzy/p/8455519.html

https://blog.csdn.net/wisdom_c_1010/article/details/55506081