10

我已经进行了很好的搜索,但还没有找到可以让我纠正这个问题的答案。

我正在尝试从 MS Access 连接到远程服务器上的 MySQL 5.2 数据库。

我已经设置了一个用户帐户,该帐户对相关表具有选择、插入、更新、删除权限。但是,当我尝试连接此帐户时,我得到:

连接失败 [HY000][MySQL][ODBC 5.2(w) Driver] 使用旧(4.1.1 之前)身份验证协议的连接被拒绝(客户端选项“secure_auth”已启用)

当我尝试使用 root 帐户访问时,连接正常,这让我想知道为什么它会返回身份验证协议错误,因为正在使用相同的驱动程序 - 所改变的只是所使用的帐户 - 所以肯定是通过相同的身份验证协议?为什么一个用户名/密码组合会返回协议错误而不返回另一个?

似乎这个错误很常见,但我还没有找到给出明确解决方案的响应。你能帮我吗?

4

3 回答 3

9

这里的问题是由于两个并发问题。

  1. 在远程服务器上,全局设置 OLD_PASSWORDS 设置为 1 - 这意味着密码在 4.1 之前的方法中被散列。
  2. 尽管有全局设置(可能是在设置此参数之前输入的),root 帐户已以较新的散列方法编码,这意味着它通过 ODBC 连接被授予访问权限,因为新散列已被识别。

全局设置导致 MySQL 中的 PASSWORD() 函数对旧方法中的任何输入值进行散列,而不是像预期的那样对新方法进行散列。

我认为 DBA 将 OLD_PASSWORDS 设置为 1 是有充分理由的,因此我使用了一个解决方案

设置会话 old_passwords=0; 为 'user'@'%' 设置密码 = password('mypassword');

由于全局设置 OLD_PASSWORDS=1 导致它使用与 OLD_PASSWORD() 函数相同的散列,因此使用 password() 函数以前不起作用。会话设置允许它生成正确的密码。

于 2013-08-02T14:46:50.763 回答
3

“当我安装 5.1.12 时,我没有任何问题”

同上!刚刚使用 ODBC 驱动程序版本 5.1.12 成功通过 MySQL 身份验证。我不知道为什么 MySQL 没有提供更好的方法来处理带有较新驱动程序的此错误,但我可以确认使用 ODBC 驱动程序 5.1.12 确实有效。

这是 5.1.12 ODBC 驱动程序安装页面的链接。

http://dev.mysql.com/downloads/file.php?id=411741

于 2015-03-10T16:47:18.857 回答
1

我收到了同样的错误信息,而我的同事没有任何问题。我试图使用 MySQL ODBC 驱动程序 5.1.13(可用的最新 GA 版本),她有 5.1.12。当我安装 5.1.12 时,我没有任何问题。

于 2014-05-13T18:53:32.047 回答