【问题标题】:Remote mySQL connection throws "cannot connect to MySQL 4.1+ using the old insecure authentication" error from XAMPP远程 mySQL 连接从 XAMPP 引发“无法使用旧的不安全身份验证连接到 MySQL 4.1+”错误
【发布时间】:2012-01-18 21:04:30
【问题描述】:

我正在 XAMPP/WinXP 上运行 WordPress 的本地副本以进行开发,但想保持与远程数据库的连接。无论我尝试什么,我都会不断收到“建立数据库连接时出错”。

在同一台 PC 上,我可以使用任意数量的 mySQL 客户端连接到远程 mySQL 数据库,并且在 mySQL 端,用户和数据库都设置为接受来自任何通配符域的传入请求。我还可以从我的 PC 轻松 ping 远程数据库服务器(虽然我不知道如何从 WITHIN XAMPP 中执行此操作)。

XAMPP 是不是它自己的小宇宙,无法到达外界?还是有什么我明显忽略的东西让我无法连接?

错误

Warning: mysql_connect() [function.mysql-connect]: Premature end of data (mysqlnd_wireprotocol.c:553) in C:\xampp\htdocs\dbtest.php on line 5 
Warning: mysql_connect() [function.mysql-connect]: OK packet 1 bytes shorter than expected in C:\xampp\htdocs\dbtest.php on line 5 
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication

编辑

感谢@Michael 建议我创建一个简单的连接脚本,以便我可以更好地了解引发的实际错误。这表明它与 mySQL 中的 old_password 设置有关。有关如何解决此问题的完整说明,请参阅下面的答案。

这是我放在xampp\htdocs 文件夹中并进行测试的测试脚本:

<?php

$mysqli = new mysqli('my.server.address', 'user_name', 'password', 'database_name');

if ($mysqli->connect_error){
    die ("Connect error: " . $mysqli->connect_error );
}

【问题讨论】:

  • 您在 wordpress 环境中从哪里得到错误?您是否尝试创建一个带有 mysql 连接的简单 index.php 来检查您是否真的有 mysql 连接问题?
  • 我发布了这些错误:警告:mysql_connect() [function.mysql-connect]:C:\xampp\htdocs\dbtest.php 中的数据过早结束 (mysqlnd_wireprotocol.c:553)第 5 行警告:mysql_connect() [function.mysql-connect]:OK 数据包比第 5 行 C:\xampp\htdocs\dbtest.php 中预期的短 1 个字节警告:mysql_connect() [function.mysql-connect]: mysqlnd 无法使用旧的不安全身份验证连接到 MySQL 4.1+
  • 这很奇怪,因为如果我在远程数据库的计算机上运行相同的简单脚本,一切都会正常连接,而且我看不到任何关于“不安全身份验证”的信息
  • 我应该指出这个错误是不正确的,因为密码是加密的并且是正确创建的。只有在 XAMPP 上运行的 PHP 认为由于某种原因它没有被加密。

标签: mysql xampp remote-access


【解决方案1】:

我不太清楚为什么这会成为我的 XAMPP 安装中的问题,因为我也在服务器的本地机器上运行 PHP 5.3.x 并且在那里没有遇到这些问题。但是,它与运行在“旧密码”加密模式下的 mySQL 服务器有关。较新版本的 PHP 不允许此类连接,因此您需要更新您的 mySQL 服务器以使用较新的密码加密。以下是步骤,假设您可以控制 mySQL 服务器。如果你不这样做,那不在我的知识范围内。

  1. 找到名为my.cnf 的mysql 服务器的配置文件。我在/etc/my.cnf 找到了我的。你可以用sudo nano /etc/my.cnf编辑它

  2. 查找写有old_passwords=1 的行并将其更改为old_passwords=0。您现在已经告诉服务器,下次运行时,它被要求使用 PASSWORD() 命令加密密码,它使用新的 41 个字符加密而不是 16 个字符的“旧”样式加密

  3. 现在你必须重启你的mysql服务器/服务。 YMMV,但在 Fedora 上使用 sudo service mysqld restart 很容易完成。检查您的操作系统关于重新启动 mysql 守护程序或服务的说明

  4. 现在我们必须在 mysql 中实际编辑 user 表。所以打开一个交互式shell到mysql(在服务器上你可以输入mysql -uYourRootUsername -pYourRootPassword

  5. 更改为 mysql 数据库。这是包含服务器操作和身份验证的所有好东西的数据库。您必须具有 root 访问权限才能使用此数据库。如果您收到“拒绝访问”,您就是 SOL。对不起。 use mysql; 将切换到该数据库

  6. 现在我们要更新让您伤心的用户。最终,您可能希望更新所有用户,但目前,我们只关注引发错误的用户。 update user set Password=password('YOUR_PASSWORD') where User='YOUR_USERNAME';

  7. 现在您只需要告诉 mysql 在该用户尝试连接时使用新密码进行身份验证。 flush privileges;.

你应该很高兴!

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2011-09-25
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多