身份验证协议的当前实现使用密码散列算法,该算法与旧版(4.1 之前)客户端使用的算法不兼容。尝试使用较旧的客户端连接到 4.1 或更高版本的服务器可能会失败,并显示以下消息:
$> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
针对这个问题,首选的解决方案是将所有客户端程序升级为使用4.1.1或更高版本的客户端库。如果这不可能,请使用以下方法之一:
要使用 4.1 之前的客户端程序连接到服务器,请使用仍然具有 4.1 之前样式密码的帐户。
为每个需要使用 pre-4.1 客户端程序的用户将密码重置为 pre-4.1 样式。这可以使用
SET PASSWORD
语句和OLD_PASSWORD()
函数来完成。从 MySQL 5.6.6 开始,还需要首先确保帐户的身份验证插件是mysql_old_password
:mysql> UPDATE mysql.user SET plugin = 'mysql_old_password' mysql> WHERE User = 'some_user' AND Host = 'some_host'; mysql> FLUSH PRIVILEGES; mysql> SET PASSWORD FOR -> 'some_user'@'some_host' = OLD_PASSWORD('new_password');
将上例中的“
new_password
” 替换为您要使用的密码 。MySQL 无法告诉您原始密码是什么,因此您需要选择一个新密码。告诉服务器默认使用旧的密码哈希算法:
将 系统变量设置为 1 启动mysqld 。
old_passwords
为每个已将其密码更新为更长的 4.1 格式的帐户分配一个旧格式密码。您可以使用以下查询识别这些帐户:
mysql> SELECT Host, User, Password FROM mysql.user -> WHERE LENGTH(Password) > 16;
对于查询显示的每个帐户记录,使用
Host
和User
值并使用前面描述的方法之一分配密码。
Client does not support authentication
protocol
如果安装了多个版本的 MySQL 但客户端程序动态链接并链接到较旧的库,也会发生
该错误。确保客户端使用与其兼容的最新库版本。执行此操作的过程取决于您的系统。
PHPmysql
扩展不支持 MySQL 4.1.1 及更高版本中的身份验证协议。无论使用何种 PHP 版本,都是如此。如果您希望将mysql
扩展与 MySQL 4.1 或更高版本一起使用,您可能需要遵循上面讨论的选项之一来配置 MySQL 以与旧客户端一起使用。该mysqli
扩展(代表“MySQL,改进”;在 PHP 5 中添加)与 MySQL 4.1 及更高版本中采用的改进密码散列兼容,无需对 MySQL 进行特殊配置即可使用此 MySQL 客户端库。有关mysqli
扩展的更多信息,请参阅
http://php.net/mysqli。
有关密码散列和身份验证的其他背景,请参阅第 6.1.2.4 节,“MySQL 中的密码散列”。