我的数据库有一个不同的服务器。
当我使用 PDO 连接到数据库时,我使用数据库 VM 的 IP 地址作为主机参数:
$dbh = new pdo("mysql:host=192.168.56.103;port=3306;dbname=data",'root','root')
但是我收到拒绝连接(PDOException,消息为“SQLSTATE[HY000] [2002]”)。我猜它无法在那里找到 MySQL。但是它可以找到具有该 IP 的 VM。
答案1
那么检查 mysql 是否真的没有运行:
sudo aptitude install nmap
进而:
sudo nmap -sS <ipofdbserverhere>
您也可以在 mysql 服务器上安装该工具,命令如下:
sudo nmap -sS localhost
在这两种情况下,您的答案都应该是这样的。
[simmel]@[mars]$ sudo nmap -sS 172.16.1.41
Starting Nmap 6.40 ( http://nmap.org ) at 2015-04-08 15:09 CEST
Nmap scan report for 172.16.1.41
Host is up (0.010s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 33.17 seconds
如果显示端口 3306,则表明该端口确实已打开并准备连接。如果是这种情况,请从计算机通过命令行使用 mysql。
mysql -u<USER> -p<PASSWORD> -h<ipofdbserverhere> <databasename>
出现相同的消息?连接被拒绝?那么您的用户可能拥有错误的权限。
另一个原因是当 mysql 服务器绑定到某个地址时,例如 127.0.0.1。
要找出答案,请检查以下输出:
sudo netstat -tlpen
如果 mysql 没有监听0.0.0.0:3306
但是监听127.0.0.1:3306
,则您只能从本地主机连接。
要更改此设置,请转到/etc/mysql/my.cnf
并注释掉以下行:
bind-address = 127.0.0.1
注释掉它的方法是添加一个前导#
字符:
#bind-address = 127.0.0.1
保存文件并重启mysql服务
sudo service mysql restart
现在您应该可以连接了。
要更改端口,请输入:
port = 8888
在/etc/mysql/my.cnf
。
保存文件并重新启动mysql服务:
sudo service mysql restart
答案2
错误 2002 意味着 MySQL 无法通过套接字文件(例如/tmp/mysql.sock
)连接到本地数据库服务器。
要找出套接字文件的位置,请运行:
mysql_config --socket
然后仔细检查您的应用程序是否使用正确的 Unix 套接字文件或通过 TCP/IP 端口进行连接。
测试插座:
mysql --socket=/var/mysql/mysql.sock
如果 Unix 套接字错误,您可以对其进行符号链接,例如:
ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
或者更正您的配置文件(例如php.ini
)。
测试原产地保护组织直接从 PHP 连接,你可以运行:
php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"
还请检查 Apache 和 CLI(命令行界面)之间的配置,因为配置可能不同。
可能是服务器正在运行,但您尝试使用与服务器正在监听的端口不同的 TCP/IP 端口、命名管道或 Unix 套接字文件进行连接。要纠正此问题,您需要调用客户端程序(例如指定
--port
选项)来指示正确的端口号、正确的命名管道或 Unix 套接字文件(例如--socket
选项)。
其他可以帮助追踪问题的实用程序/命令:
netstat -ln | grep mysql
php -r "phpinfo();" | grep mysql
php -i | grep mysql
xdebug.show_exception_trace=1
在您的中使用 XDebugxdebug.ini
- 在 OS X 上尝试
sudo dtruss -fn mysqld
,在 Linux 上调试strace
- 检查 Unix 套接字的权限:
stat $(mysql_config --socket)
以及是否有足够的可用空间(df -h
)。 - 重新启动 MySQL。
- 查看
net.core.somaxconn
。