my $dsn = "DBI:MysqL:" . "database=$db;" . "host=$dbhost;" . "MysqL_ssl=$dbssl;" . "MysqL_skip_secure_auth=1;";
我最近尝试升级我们的DBD :: MysqL版本,但不断遇到DBI连接(‘database = mydb; host = myhost’,’myuser’,…)失败:连接使用旧版(4.1.1之前版) )错误.
几个小时的调试后,并确定没有更新我们的MysqL表的密码哈希方法的正确的选项是不可能与我们的整个系统,我发现有@L_301_1@你可以声明“MysqL_skip_secure_auth”作为DSN的一部分.
但是,这似乎不起作用.
如果我runMysqL -h $为myhost -u $myuser的-p –skip-安全-auth的,我能够平安无事连接,而是试图用DBI / DBD为此:: MysqL的,我总是碰到上述错误,好像该指令被忽略了.
> Relevant documentation
我也尝试使用具有相同选项集的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 authimp_dbh->bind_type_guessing: 0imp_dbh->use_server_sIDe_prepare: 0imp_dbh->MysqL_dr_connect: clIEnt_flags = 2imp_dbh->MysqL_dr_connect: <- --> do_errorConnection 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解决方法 你是对的,在这方面的事情有点棘手,但挑战似乎来自C MysqL lib而不是DBD :: MysqL.
首先,将param作为驱动程序选项而不是作为主DSN字符串的一部分传递:
我的@dsn =(“DBI:MysqL:database = $db; host = $dbhost; MysqL_ssl = $dbssl”,
$用户,
$pissword,
{MysqL_skip_secure_auth => 1});
只要您没有使用.cnf文件,这应该可以正常工作.
要通过文件进行身份验证,存在一些限制.
我的@dsn =(“DBI:MysqL:”database = $db; host = $dbhost; MysqL_ssl = $dbssl;“
. “MysqL_READ_DEFAulT_file = $absolute_path.cnf”
民主基金,
民主基金,
{MysqL_skip_secure_auth => 1});
确保您的文件不包含secure_auth的条目,否则C lib会错误地将其视为已启用,即使该条目已禁用该条目也是如此.
任何类似于此的行,具有禁用(假)值
secure_auth = FALSE
必须改为
skip_secure_auth
(并确认标准工具,如MysqL和MysqLdump像以前一样工作).
C lib有一个错误,它将secure_auth = FALSE视为secure_auth = TRUE,在我看来它有第二个错误,因为它忽略了skip_secure_auth而不是尊重它.
根据http://dev.mysql.com/doc/refman/5.6/en/mysql-options.html的文档,一般不支持secure_auth选项,但奇怪的是,一个表单是(mis)实现的,而另一个表单被忽略.
如果您的代码知道它连接到v4.0服务器,上面的“工作”,但我宁愿不用服务器特定的逻辑来破坏代码.我仍然希望有一种方法可以修补C库,所以这可以完全通过.cnf文件来完成,就像标准工具一样.
作为附录,如果有一些原因你不能使用skip_secure_auth,则需要省略[clIEnt]部分中的所有secure_auth条目,而是将secure_auth = FALSE添加到工具所需的每个部分,即[MysqL],[MysqLdump],等等,这显然是可怕的.
总结以上是内存溢出为你收集整理的perl – mysql_skip_secure_auth不跳过安全身份验证全部内容,希望文章能够帮你解决perl – mysql_skip_secure_auth不跳过安全身份验证所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)