У меня довольно стандартная установка MySQL на Debian Wheezy ( apt-get install mysql-server mysql-client
), которую я успешно делал много раз раньше.
Когда я пытаюсь подключиться через localhost
, все работает. Но подключение через 127.0.0.1
выдает сообщение об ошибке:
$ mysql -h localhost -P 3306 -u xxx -p
-- works
$ mysql -h 127.0.0.1 -P 3306 -u xxx -p
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
Когда я пытаюсь подключиться из приложения Java, я получаю похожие ошибки, хотя я использую в localhost
качестве имени хоста:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure. The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
Я обычно получаю это исключение, когда сервер MySQL закрыл простое соединение или был перезапущен. Однако теперь это происходит при запуске приложения, когда приложение пытается подключиться в первый раз.
Забавно , это достаточно сделал работу всего за несколько часов до этого . К сожалению, я не могу вспомнить, чтобы что-то изменилось на сервере. :-(
Поэтому, если честно, этот пост содержит два вопроса: почему я не могу подключиться через 127.0.0.1
? И почему мои приложения не могут подключиться через localhost
хотя я могу через CLI?
# mysqld -V
mysqld Ver 5.5.37-0+wheezy1-log for debian-linux-gnu on x86_64 ((Debian))
# mysql -V
mysql Ver 14.14 Distrib 5.5.37, for debian-linux-gnu (x86_64) using readline 6.2
# grep bind /etc/mysql/my.cnf
bind-address = 127.0.0.1
# grep socket /etc/mysql/my.cnf
socket = /var/run/mysqld/mysqld.sock
# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.022 ms
# grep localhost /etc/hosts
127.0.0.1 localhost
::1 ip6-localhost ip6-loopback
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# netstat -ln | grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tomcat # grep mysql conf/server.xml
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/dbname"
РЕДАКТИРОВАТЬ
Я пытался привязать сервер к 0.0.0.0
и ::
безрезультатно.
Сервер поддерживает IPv6 и настроен соответственно:
# host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
Когда я пытаюсь подключиться, возникает та же проблема, что описана выше ::1
.
# ping6 ::1
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.020 ms
# ping6 localhost
64 bytes from ip6-localhost: icmp_seq=1 ttl=64 time=0.018 ms
РЕДАКТИРОВАТЬ 2
Подключение через telnet
дает не много информации, но показывает, что соединение закрывается немедленно.
# telnet localhost 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
Кстати, лог-файлы MySQL абсолютно бесшумны даже при включенной регистрации.
localhost
в сокет, а использует сеть. Как и следовало ожидать ... Но оригинальный вопрос остается.Ответы:
Виновным, казалось бы, является
hosts.deny
иhosts.allow
который по умолчанию имеет файловый режим0x600
. MySQL не может прочитать их, чтобы определить, разрешать ли подключения. Я изменил режимы файлов на0x644
, и теперь все работает гладко. Я все еще задаюсь вопросом, почему MySQL не регистрировал никаких ошибок ...источник
Этот вопрос очень похож на то, что MySQL не может подключиться через "localhost", только 127.0.0.1 . Как указано здесь, вы, вероятно, настроили MySQL для прослушивания только сетевого сокета, а не сокета файловой системы.
источник
Возможно, у вас включен IPv6, вполне возможно, что localhost преобразуется в локальный хост ipv6, который не определен в вашей конфигурации mysql.
Вы можете проверить это, посмотрев, возвращает ли 'host localhost' в командной строке :: 1, а также 127.0.0.1. Если это так, вы можете либо удалить отображение :: 1, либо перенастроить MySQL для прослушивания адреса IPv6 :: 1, а также 127.0.0.1.
источник
127.0.0.1
и::1
. Я пытался привязать MySQL к::1
, без изменений. Я даже пытался привязать MySQL к0.0.0.0
и::
, без разницы.Недавно я сломал рабочую установку, где большинство клиентов основано на Java. Инструменты CLI будут работать, но все Java-клиенты замерли. В моем случае виновником была новая настройка, которую я включил «для повышения производительности»:
Когда вы сделаете это, MySQL вот больше RDNS виды использования , чтобы решить
127.0.0.1
->localhost
и, так как все моиGRANT
s предназначены дляuser@localhost
, пользователю не разрешено подключаться от хоста127.0.0.1
.Для этой конкретной проблемы существует два решения:
skip-name-resolve
GRANT
чтобы включить,127.0.0.1
а такжеlocalhost
источник