Підключення MySQL працює з localhost, але не з 127.0.0.1


9

У мене досить стандартна установка 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"

EDIT

Я спробував прив’язати сервер до 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

EDIT 2

Підключення за допомогою telnetдає не багато інформації, але показує, що з'єднання закривається негайно.

# telnet localhost 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

До речі, реєстраційні файли MySQL абсолютно безшумні, навіть із ввімкненим журналом.


Причина, через яку я отримую помилки з мого додатку Java, полягає в тому, що драйвер JDBC не вирішує проблему localhostз сокетом, а використовує мережу. Як можна було б природно очікувати ... Але первісне питання залишається.
Philipp Jardas

Відповіді:


1

Винуватець, здавалося, hosts.denyі hosts.allowякий за замовчуванням має режим файлу 0x600. MySQL не зміг їх прочитати, щоб визначити, чи дозволити з'єднання. Я змінив режими файлів на 0x644, і тепер все працює без проблем. Мені все ще цікаво, чому MySQL не зафіксував помилок ...


0

Це питання дуже схоже на MySQL, не можна підключитися через "localhost", лише 127.0.0.1 . Як зазначено тут, ви, ймовірно, налаштували MySQL лише слухати мережевий сокет, а не розетку файлової системи.


Відповідь, яку ви опублікували, відповідає на питання, яке протилежне моєму. А в мене активні і мережеві, і файлові сокети.
Philipp Jardas

Так, ти правий. Вибачте, що неправильно прочитали своє запитання.
Небу

0

Можливо, у вас включений IPv6, його дуже можливий localhost вирішується на ipv6 localhost, що не визначено у вашій конфігурації mysql.

Ви можете перевірити це, побачивши, чи повертається "host localhost" у командному рядку :: 1, а також 127.0.0.1. Якщо так, ви можете видалити відображення :: 1 або перенастроїти MySQL для прослуховування на IPv6 :: 1 адресу, а також 127.0.0.1


Дійсно localhost вирішує як 127.0.0.1і ::1. Я намагався прив’язати MySQL до ::1, без змін. Я навіть намагався прив’язати MySQL до, 0.0.0.0і ::різниці немає.
Філіп Ярдас

0

Нещодавно я зламав робочу установку, де більшість клієнтів базується на Java. Інструменти CLI спрацювали, але клієнти Java всі зупинилися на своїх слідах. У моєму випадку винуватцем була нова настройка, яку я дозволив "підвищити продуктивність":

skip-name-resolve       = on

Коли ви це зробите, MySQL lo більше використовує rDNS для вирішення 127.0.0.1-> localhostі, оскільки всі мої GRANTs призначені user@localhost, користувачеві заборонено з'єднуватися з хостом 127.0.0.1.

Для цієї конкретної проблеми існує два рішення:

  1. Відключити skip-name-resolve
  2. Розгорніть свій GRANTs, щоб включити 127.0.0.1такожlocalhost
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.