首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl如何使用DBI模块更改帐户主机?

问Perl如何使用DBI模块更改帐户主机?
EN

Stack Overflow用户
提问于 2021-11-04 01:48:44
回答 1查看 182关注 0票数 6

我的公司在服务器上有一个带有IP:10.10.3.39的Perl应用程序。

由于新规则的实现,我必须使用IP:10.10.1.18在服务器中将数据库迁移到10.10.1.18数据库。

我的公司DB管理员已经创建了一个帐户,并授予应用程序用户名:'user'@'10.10.3.39'的访问权限。因此,该帐户只需使用IP 10.10.3.39服务器即可使用。

我使用命令mysql -h 10.10.1.18 -u user -p尝试了服务器中的连接

代码语言:javascript
复制
[hanief@dev39 project]$ mysql -h 10.10.1.18 -u user -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 19484169
Server version: 10.0.15-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

我在Perl中有一个数据库连接脚本test_db.pm,如下所示:

代码语言:javascript
复制
use DBI;

$user = "user";
$pw = 'password';
$dbh = DBI->connect("DBI:mysql:database=mysql;host=10.10.1.18;mysql_enable_utf8=1",$user, $pw, %attr) or die "Cannot connect to MySQL server\n";

然后,我尝试使用命令perl test_db.pm运行它,得到了以下错误

代码语言:javascript
复制
[hanief@dev39 project]$ perl test_db.pm
DBI connect('database=mysql;host=10.10.1.18;port=3306;mysql_enable_utf8=1','user',...)
failed: Access denied for user 'user'@'%' to database 'mysql' at test_db.pm line 6.
Cannot connect to MySQL server

我不知道为什么账户名突然有@'%'在后面

我尝试将变量$user更改为:

  • $user = "user\@10.10.3.39";

代码语言:javascript
复制
failed: Access denied for user 'user@10.10.3.39'@'10.10.3.39' (using password: YES) at test_db.pm line 6.

  • $user = "user\@'10.10.3.39'";

代码语言:javascript
复制
failed: Access denied for user 'user@'10.10.3.39''@'10.10.3.39' (using password: YES) at test_db.pm line 6.

  • $user = "'user'\@'10.10.3.39'";

代码语言:javascript
复制
failed: Access denied for user 'user'@'10.10.3.39'@'10.10.3.39' (using password: YES) at test_db.pm line 6.

但还是没起作用。服务器仍然无法连接到DB服务器。

我不知道为什么在用户帐户后面有一个额外的@'10.10.3.39'。不知道为什么%之前突然变成了10.10.3.39

我的案子有什么解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-04 11:05:36

我不太清楚这是怎么回事,但我想我可以给你一点启示。

MySQL (因此,也就是MariaDB)有一个不只是依赖用户名和密码的登录系统。它还考虑到连接来自哪个主机。如果您查看mysql.user表,您将看到前三列是Host、User和Password。

Host列很有趣。它可以包含IP地址或主机名,但也可以包含符号'%',意思是“任意主机”。

所以当DBA告诉你他们有:

创建一个帐户并授予应用程序用户名:'user'@'10.10.3.39'的访问权限

我敢打赌,它们意味着它们已经将user和10.10.3.39值插入到mysql.user表中。

这意味着您的$user变量需要设置为user,而不是user@10.10.3.39,因为MySQL将从传入连接中计算出IP地址。

所以当你看到这样的错误时:

失败:用户“用户@10.10.3.39”@“10.10.3.39”被拒绝访问

第一对引号("user@10.10.3.39")中的位是您试图使用的用户名,第二对引号("10.10.3.39")中的位是MySQL认为您正在连接的IP地址。显然,这是行不通的,因为mysql.users表中不存在这个用户名。

所以,让我们看一下第一个例子:

代码语言:javascript
复制
$dbh = DBI->connect("DBI:mysql:database=mysql;host=10.10.1.18;mysql_enable_utf8=1",$user, $pw, %attr)
  or die "Cannot connect to MySQL server\n";

这就产生了这个错误:

失败:拒绝用户“用户”@‘%’的访问

现在,此错误使用"%“作为主机名的事实似乎意味着,MariaDB服务器没有将您来自的IP地址识别为您的用户所允许的特定IP地址之一。

所以,在这个例子中,我要反复检查两件事:

  • ,您肯定是在尝试从10.10.3.39连接吗?这包括检查您和DB服务器之间是否有可能更改IP地址的代理。
  • 是mysql.user表中的IP地址,真的是10.10.3.39吗?或者,该值是否包含错误?

我知道这不是一个“这是你的问题的解决方案”的帖子,但希望它能解释更多关于正在发生的事情,并为你提供一些调查的途径。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69833666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档