我已经设置了一个安全组的RDS数据库实例,我使用我的EC2弹性IP作为我的CIDR / IP。我还将安全组与我的EC2联系起来。
EC2实例上的我的安全组看起来像这样。我将3306端口中的一个与我的弹性IP相关联。
我在phpMyAdmin中创建了一个数据库和一个表,并试图通过使用以下代码打印出所有值来测试它:
<?php
// set database server access variables:
$host = "XXXXXXX.XXXXXXXXXX.eu-west-1.rds.amazonaws.com";
$user = "XXXXXXX";
$pass = "XXXXXXXX";
$db = "XXXXXXX";
$con = mysql_connect($host, $user, $pass, $db);
// Check connection
if (mysql_connect_error())
{
echo "Failed to connect to MySQL: " . mysql_connect_error();
}else { echo "You have connected successfully!";
}
$result = mysql_query($con, "SELECT * FROM `XXXXX` LIMIT 0, 30 ");
echo "<p>starting again..</p>";
while($row = mysql_fetch_assoc($result)){
//iterate over all the fields
foreach($row as $key => $val){
//generate output
echo $key . ": " . $val . "<BR />";
}
}
mysql_close($connection);
?>
我得到的错误是Unknown database 'XXXX'
。有什么想法吗?
编辑1
我刚刚将所有mysqli
语句更改为mysql
。但是连接仍然不成功,即无法找到数据库。
编辑2
以下是我的mysql权限的截图。
答案 0 :(得分:5)
未知数据库'XXXX'表示无法访问数据库。这可能是因为:
服务器连接成功,但数据库不存在。尝试连接而不将数据库名称作为参数。然后运行查询show databases;
。它将显示那里的所有数据库。
您正在连接到错误的服务器(您在其他服务器上存在其他数据库的数据库)。检查存在的数据库可以帮助您识别它是哪个服务器。
您似乎可以连接到Amazon RDS服务器。但数据库不在那里。如果我们尝试连接到mysql的全新安装,则会显示类似的错误。它没有数据库(information_schema
和mysql
除外)。
答案 1 :(得分:5)
首先,你不应该(从不)再使用mysql_ *扩展及其功能。它们已过时,已弃用,将在近似版本中从php中删除。使用mysqli_或PDO。有关详细信息,请参阅the huge red warning at the top of the mysql_connect page in the php docs。
在ssh中连接到您的网络服务器,并使用本地mysql客户端以root身份连接到数据库服务器(您将被询问root用户的密码):
$ mysql -uroot -p -hXXXXXXX.XXXXXXXXXX.eu-west-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 100530
Server version: 5.1.66-0+squeeze1 (Debian)
[...]
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
如果这样做,你应该在mysql提示符下结束。如果这不起作用,您的问题在于您的网络配置,您的网络服务器无法连接到mysql服务器(检查端口开口)。
确保服务器上存在有问题的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| [... db names ...] |
+--------------------+
X rows in set (0.00 sec)
mysql>
如果在列表中看不到您的数据库名称,这意味着您在phpmyadmin中看到的服务器不正确;检查你的phpmyadmin设置。
检查您是否可以使用cli mysql客户端与此用户建立连接。请注意,我没有在连接线上指定数据库。
// close the root connection
mysql> quit
Bye
// connect using your specific user, replace USERNAME with your db user (and type its password when asked)
$ mysql -uUSERNAME -p
Enter password:
[...]
mysql>
如果此操作失败并且您没有收到提示,则可能是因为权限不存在,或者因为此用户无法从您指定的主机进行连接。看看mysql会显示的错误信息;类似的东西!
ERROR 1045 (28000): Access denied for user 'USERNAME'@'HOST' (using password: NO)
主机中的内容很重要,您必须确保允许使用您的权限。如果一切正常并且仍然无效,请尝试编辑该用户的权限并将主机设置为'%'(表示允许任何内容)。如果它适用于它,则意味着在mysql的权限中错误地配置了HOST。
检查用户是否可以看到有问题的数据库。当您与特定用户连接时,“show databases”将仅列出此用户有权查看的数据库。
mysql > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| [... db names ...] |
+--------------------+
X rows in set (0.00 sec)
mysql>
如果您在列表中看不到您的数据库,则表示该数据库的用户权限错误/未设置。
如果此处的每个步骤都正常,则可能意味着您的PHP代码出错,请仔细检查主机,密码,用户名,......
如果你真的无法弄清楚权限的哪些部分是错误的,尝试创建一个虚拟用户将获得来自任何主机的所有权限:
$ mysql -uroot -p -hXXXXXXX.XXXXXXXXXX.eu-west-1.rds.amazonaws.com
Enter password:
mysql > GRANT ALL ON yourdbname.* to 'testuser'@'%' IDENTIFIED BY 'dummypassword';
mysql > quit
Bye
// note that I give the password in the prompt directly, to make sure this isn't an input error just in case
$ mysql -utestuser -pdummypassword
mysql >
创建此用户并可以连接到该用户后,请尝试使用您的php代码连接到该用户。完成此操作后,删除用户(使用DROP USER 'testuser'
),使用更有限的HOST权限再次创建它,然后重试,直到您复制所需的权限。
请记住删除该用户,您已完成。
答案 2 :(得分:2)
简介
错误Unknown database 'XXXX'
表示数据库does not exist
,与您的mysql权限无关。
关于RDS的phpMyAdmin
如果您是通过phpMyAdmin
创建数据库的,那么您确定它已配置为连接到远程Amazon RDS instance
,或者您正在使用localhost
请检查您的config.inc.php
以确保其配置正确。您可以通过调用
$i++; // This would add the new servers
$cfg['Servers'][$i]['host'] = 'XXXXXXX.XXXXXXXXXX.eu-west-1.rds.amazonaws.com';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['compress'] = TRUE;
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'XXXXXXX';
$cfg['Servers'][$i]['password'] = 'XXXXXXX';
更好的数据库管理
您还可以使用MySQL workbench,这不仅可以让您创建和管理您的数据库,还可以实时监控。您可以直接连接或使用SSH
<强>最后强>
我刚刚将所有mysqli语句更改为mysql。但是连接仍然没有成功,即无法找到数据库。
没有理由将mysqli
更改为mysql
,因为它Officially Depreciated at 5.5.0
答案 3 :(得分:0)
你需要使用mysqli_或mysql_,最好是第一个。交换它们是行不通的。
如果您收到未知数据库错误,您的连接成功,您正在尝试选择不存在的数据库,或者用户没有授权来访问。