mysql - Perl 如何使用 DBI 模块更改帐户主机?
问题描述
我的公司在具有 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)]>
我test_db.pm
在 Perl 中有一个这样的数据库连接脚本:
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
,我得到了这个错误
[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";
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'";
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'";
failed: Access denied for user 'user'@'10.10.3.39'@'10.10.3.39' (using password: YES) at test_db.pm line 6.
但是,仍然没有工作。服务器仍然无法连接到数据库服务器。
我不知道为什么
@'10.10.3.39'
用户帐户后面有一个额外的东西。而且之前不知道为什么%
,突然改成10.10.3.39
我的情况有什么解决方案吗?
解决方案
我不完全确定这里发生了什么,但我想我可以阐明一点。
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 地址。
所以当你看到这样的错误时:
失败:用户'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";
这给出了这个错误:
失败:用户 'user'@'%' 的访问被拒绝
现在,这个错误使用“%”作为您的主机名这一事实似乎意味着 MariaDB 服务器没有将您来自的 IP 地址识别为允许您的用户列出的特定 IP 地址之一。
因此,在这种情况下,我会仔细检查两件事:
- 您确定要从 10.10.3.39 连接吗?这包括检查您和数据库服务器之间是否有任何代理可能会更改您的 IP 地址。
- 表中的IP地址
mysql.user
真的是10.10.3.39吗?或者该值是否包含拼写错误?
我知道这不是一篇“这是您的问题的解决方案”的帖子,但希望它能够更多地解释正在发生的事情,并为您提供一些调查途径。
推荐阅读
- heroku - 部署到 Heroku,管理员 UI 登录突然停止工作
- r - R:更改 geom_bar 中的条形标签
- html - 预加载字体不起作用,至少在 google pagespeed 中不起作用。有人可以解释为什么吗?
- mysql - MySQL获取位于给定条件之间的以逗号分隔的记录ID行
- java - 如何在简单的多线程条件下更新我的 JPanel?
- android - 如何从应用内订阅或订阅中获取“paymentState”是否免费?
- javascript - 如何使用 JavaScript 检测 Dom 中是否存在滚动条?
- google-chrome - 调试模式下的 Chrome 步骤非常慢
- session - 当会话值为空时设置会话值
- serverless-framework - 使 serverless.yml 使用现有的 vpc