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

Han*_*Han 6 mysql perl dbi mariadb

我的公司在具有 IP 的服务器中有一个 Perl 应用程序:10.10.3.39

由于实施了新规则,我必须将数据库迁移到具有 IP 的服务器中的 MySQL DB:10.10.1.18

我公司的数据库管理员已创建一个帐户并授予用户名 : 的应用程序访问权限'user'@'10.10.3.39'。所以该帐户只能从具有IP的服务器上使用10.10.3.39

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

[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)]>
Run Code Online (Sandbox Code Playgroud)

我有一个test_db.pmPerl 数据库连接脚本,如下所示:

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";
Run Code Online (Sandbox Code Playgroud)

然后,我尝试使用命令运行它perl test_db.pm,我收到此错误

[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
Run Code Online (Sandbox Code Playgroud)

不知道为什么账号@'%'后面突然有一个

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

  • $user = "user\@10.10.3.39";
failed: Access denied for user 'user@10.10.3.39'@'10.10.3.39' (using password: YES) at test_db.pm line 6.
Run Code Online (Sandbox Code Playgroud)
  • $user = "user\@'10.10.3.39'";
failed: Access denied for user 'user@'10.10.3.39''@'10.10.3.39' (using password: YES) at test_db.pm line 6.
Run Code Online (Sandbox Code Playgroud)
  • $user = "'user'\@'10.10.3.39'";
failed: Access denied for user 'user'@'10.10.3.39'@'10.10.3.39' (using password: YES) at test_db.pm line 6.
Run Code Online (Sandbox Code Playgroud)

但仍然没有奏效。服务器仍然无法连接到数据库服务器。

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

我的情况有什么解决方案吗?

Dav*_*oss 4

我不完全确定这里发生了什么,但我想我可以透露一点信息。

MySQL(以及 MariaDB)的登录系统不仅仅依赖于用户名和密码。它还考虑了连接来自的主机。如果您查看该mysql.user表,您会发现前三列是HostUserPassword

Host专栏很有趣。它可以包含 IP 地址或主机名,但也可以包含符号“%”,表示“任何主机”。

因此,当 DBA 告诉您他们有:

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

我打赌他们的意思是他们已经在表中插入了值user和。10.10.3.39mysql.user

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

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

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

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

所以,我们剩下看你的第一个例子:

$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";
Run Code Online (Sandbox Code Playgroud)

这给出了这个错误:

失败:用户“user”@“%”的访问被拒绝

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

因此,在这种情况下我会仔细检查两件事:

  • 您确实尝试从 10.10.3.39 进行连接吗?这包括检查您和数据库服务器之间是否存在可能更改您的 IP 地址的代理。
  • 表中的IP地址mysql.user真的是10.10.3.39吗?或者该值是否可能包含拼写错误?

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