【发布时间】:2014-05-07 07:23:12
【问题描述】:
编辑:据我所知,这个问题的根本原因是安装了正确的 Perl 模块,但加载了错误的 mysql.so 文件。
my $dsn = "DBI:mysql:"
. "database=$db;"
. "host=$dbhost;"
. "mysql_ssl=$dbssl;"
. "mysql_skip_secure_auth=1;";
我最近尝试升级我们的 DBD::mysql 版本,但不断遇到DBI connect('database=mydb;host=myhost','myuser',...) failed: Connection using old (pre-4.1.1) 错误。
经过数小时的调试,并确定正确选项不更新我们的 mysql 表的密码散列方法在我们的整个系统中是不可能的,我发现使用DBD::Mysql 4.027 你可以将“mysql_skip_secure_auth”声明为 dsn 的一部分。
但是,这似乎不起作用。
如果我运行mysql -h $myhost -u $myuser -p --skip-secure-auth,我可以毫无意外地连接,但是尝试使用 DBI/DBD::mysql 执行此操作时,我总是遇到上述错误,好像该指令被忽略了一样。
我也尝试过使用具有相同选项集的mysql_read_default_file,以及在DSN 中简单地使用mysql_skip_secure_auth。这些东西的任何组合都没有奏效。
我错过了什么吗?
编辑:
跟踪输出(经过编辑以删除敏感信息):
imp_dbh->mysql_dr_connect: host = |{host}|, port = 0, uid = {user}, pwd = {pwd}
imp_dbh->mysql_dr_connect: Skipping secure auth
imp_dbh->bind_type_guessing: 0
imp_dbh->use_server_side_prepare: 0
imp_dbh->mysql_dr_connect: client_flags = 2
imp_dbh->mysql_dr_connect: <- --> do_error
Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) error 2049 recorded: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)
my $versions = DBI->installed_versions;
foreach (keys %$versions) {
print "\n$_: " . %$versions->{$_};
}
DBD::SQLite: 1.26
DBD::ExampleP: 12.014310
DBD::Sponge: 12.010002
DBD::Gofer: 0.015057
DBD::DBM: 0.06
DBD::mysql: 4.027
DBI: 1.618
【问题讨论】:
-
了解 4.1 之前的密码是 officially deprecated,并且在未来的版本中将删除对它们的支持。在某些时候,您将不得不升级到新的密码散列。对于您的直接问题,请在您的
connect语句之前打开 DBI 的 tracing 以查看幕后发生的情况:DBI->trace('3|CON');我在跟踪输出中看到了这一点:imp_dbh->mysql_dr_connect: Skipping secure auth -
perl -MDBD::mysql -e 'print $DBD::mysql::VERSION'将显示您的 Perl 正在使用的 DBD::mysql 的版本。我猜你实际上并没有使用 4.027,因为当我使用 4.027 运行时,我在跟踪中的imp_dbh->mysql_dr_connect: host = ...之后立即得到imp_dbh->mysql_dr_connect: Skipping secure auth;使用 4.013,没有这样的消息。 -
也许将
print $DBD::mysql::VERSION添加到您遇到问题的脚本的顶部,以确保。我非常怀疑这会影响它,但可能会仔细检查 DBI 是否也是最新的。 -
你是对的,对不起。而不是在
use DBI;之后打印调用DBI->installed_versions;来显示所有已安装驱动程序的版本。我会拿出use DBD::mysql; -
我也很难过。不确定更新 DBI 是否会修复它,但值得一试。仅供参考,您的 Perl 和 MySQL 版本是什么?
标签: perl perl-module dbi