Фатальная ошибка PHP: неперехваченное исключение «PDOException» с сообщением «SQLSTATE[HY000] [2002] Соединение отклонено»

Фатальная ошибка PHP: неперехваченное исключение «PDOException» с сообщением «SQLSTATE[HY000] [2002] Соединение отклонено»

У меня есть другой сервер для моей базы данных.

При подключении к базе данных с помощью 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, отличный от того, который слушает сервер. Чтобы исправить это, вам нужно вызвать клиентскую программу (например, указав --portoption), чтобы указать правильный номер порта или правильный именованный канал или файл сокета Unix (например, --socketoption).

Видеть:Устранение неполадок при подключении к 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.

Связанный контент