У меня есть другой сервер для моей базы данных.
При подключении к базе данных с помощью PDO я использовал IP-адрес виртуальной машины базы данных для параметра хоста:
$dbh = new pdo("mysql:host=192.168.56.103;port=3306;dbname=data",'root','root')
Но я получаю отказ в подключении (PDOException с сообщением SQLSTATE[HY000] [2002]). Я думаю, что он не смог найти MySQL там. Однако он смог найти виртуальную машину с этим IP.
решение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
option), чтобы указать правильный номер порта или правильный именованный канал или файл сокета Unix (например,--socket
option).
Видеть:Устранение неполадок при подключении к MySQL
Другие утилиты/команды, которые могут помочь отследить проблему:
netstat -ln | grep mysql
php -r "phpinfo();" | grep mysql
php -i | grep mysql
- Используйте XDebug
xdebug.show_exception_trace=1
в вашемxdebug.ini
- В OS X попробуйте
sudo dtruss -fn mysqld
, в Linux отладку выполните с помощьюstrace
- Проверьте права доступа к сокету Unix:
stat $(mysql_config --socket)
и достаточно ли у вас свободного места (df -h
). - Перезапустите MySQL.
- Проверять
net.core.somaxconn
.