mysql8.0无法远程连接 The server requested authentication method unknown to the client
先解决你的问题,我再讲一下为什么? 分两步骤:修改配置、创建用户
一、修改配置,改变mysql8默认的密码校验方式
修改mysql配置,一般在etc目录下:
vim /etc/my.cnf
打开如下注释:
重启mysql8
systemctl restart mysqld
二、创建用户
登录数据库,选择mysql库
use mysql
创建远程和本地用户,一个是本地服务器账户,一个是远程项目或者naivate链接使用
创建本地用户,并制定密码校验方式
CREATE USER 'native'@'localhost' IDENTIFIED WITH mysql_native_password;
为这个本地用户,设置密码(mysql8只能创建用户在设置密码,一次性操作密码是失败的)
ALTER USER 'native'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Pposis!65';
为该用户赋予对数据表操作权限
grant all privileges on *.* to 'native'@'localhost' with grant option;
接下来继续创建一个同名同密码的用户,不过是远程的,本质上是2个账号了,但同名同密码,我们就当一个
CREATE USER 'native'@'%' IDENTIFIED WITH mysql_native_password;
为这个远程用户设置密码
ALTER USER 'native'@'%' IDENTIFIED WITH mysql_native_password BY 'Pposis!65';
为该远程用户,赋予权限
grant all privileges on *.* to 'native'@'%' with grant option;
刷新权限
FLUSH PRIVILEGES;
接下来,你无论在服务器还是远程连接navicate 还是在php和java项目中都使用如下账号
账号为:native
密码:Pposis!65
接下来,详细描述一下这个问题
1、问题描述
当我用 PHP 连接 MySQL 时报如下错误:
上面错误信息的字面意思: 服务器请求使用的是客户端未知的身份验证方法。分析: 以明文形式发送密码可能会出现某些安全问题(如密码被截获),为了避免这些安全问题,许多客户端在将密码发送到服务器之前会使用 “身份验证插件” 对密码进行加密,MySQL 客户端连接到 MySQL 服务器的时候也是一样的道理。土说就是兄弟们,我升级了,以后检验密码的方式我用某某校验,以前哪一套不管用了,别用php和java的自带的校验方式来找我,你要和我统一,不然就不然过。
我查了一下我php连接该mysql的校验集支持,我这是php7.2.3的,支持如下画红线的;
我们在看一下mysql8刚安装完默认所有账户的校验方式:
show variables like 'default_authentication_plugin';
叫什么caching_sha2_password, 但是可以看到我上面的phpinfo输出的 我支持的是sha2_password 看起来后半截差不多,但不是一回事,还有常规支持一个mysql_native_password;所以连不上正常。这个校验呢,我给一个解释 如下:
所以上面上面我直接把mysql8校验方式改成原来较为传统的方式,也是很多版本支持的方式,就是修改配置那块,而且也是php或者java语言常规支持的方式。
不过不要忘记了,不仅这2个地方要支持(数据库8和语言),创建账号也需要指定校验方式,也必须统一:
数据库中执行如下,查看账号所指定校验方式:
select user,host,plugin from mysql.user;
我为了给你们做测试,创建了多个不同账号,后面画红线的就是说,你登录的时候我mysql用啥校验方式,所以上面我们都改成了mysql_native_password,你在创建账户的时候,不要指定成caching开头的那个校验集,这是默认的。所以创建用户的时候,需要指定,不过请放心,我上面给大家的案例,都是写好的,只要修改语句中的密码和用户名即可,甚至你都不用修改。
到了这里 语言和数据库和账号指定的校验集三者统一!
接下来我介绍一下上面创建账号,写的语句都啥意思(下面是图,不要被文字打扰,偷个懒)
收藏、点赞、下课!赵锐庆