【问题背景】
最近做项目时,小组成员需要共享数据库,局域网连接mysql数据库时报1251号错误,现将处理过程记录下来,给遇到同样问题的同行们提供一点参考解决办法。
【问题分析】
报错内容是:1251-Client does not support authentication protocol requested by server;consider upgrading MySQL client。
意为:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端。
说明问题在于身份验证协议规则上。
由于我使用的是mysql8.0,进入官方mysql8.0参考手册中在“Security”一栏下的“Pluggable Authentication”一节中可以看到:
可知MySQL 5.7及之前的版本中加密规则是mysql_native_password,而MySQL 8.0的加密规则是caching_sha2_password。
看来是小组成员登录我的mysql8.0数据库时使用的是低版本的客户端,正如官方参考文档所说的“When a 5.7 client tries to connect to an 8.0 server, the server specifies caching_sha2_password
as its default authentication plugin, but the client still sends credential details per either mysql_native_password”。
可知刚才报错内容说“consider upgrading MySQL client”建议升级客户端,看来也并不是没有道理,那就升级客户端?不,由于一个大家都懂的原因,我更愿意另想办法也不要让小组成员升级“Navicat for MySQL”(偷笑)。
那就只有一种比较便捷的方法了,那就是让我这边的MySQL 8.0 数据库以低版本的身份验证协议“mysql_native_password”来验证来自相应客户端的用户及其口令。
【操作步骤】
1.如果开发者A想要向局域网里的其他开发者B,C,D...共享自己的mysql数据库,则开发者A应该登录数据库后给相应的用户委派用户名和密码:
如:给ip地址为10.96.122.226的开发者B设置用户名为‘hl’,设置登录口令为‘123456’,且该口令永不过期。则命令为:
ALTER USER 'hl'@'10.96.122.226' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
2.接下来就是1251报错解决方法的核心:更改身份验证方式为“mysql_native_password”:
ALTER USER 'hl'@'10.96.122.226' IDENTIFIED WITH mysql_native_password BY '123456';
3.刷新,使设置生效。
FLUSH PRIVILEGES;
4.开发者A在防火墙里设置好对应端口的出入站规则后,开发者B就可以连接到开发者A的ip对应端口进行数据库访问了。
【写在最后】
1.远程访问mysql数据库遇到1251报错也可以这样解决。
2.确保客户端与服务器之间通信正常,且防火墙设置合理。
3.同样地,本地登录root时报错1251也可以参考这样的方法。将上面语句中的'hl'@'10.96.122.226'改为'root'@'localhost'即可。