Назад | Перейти на главную страницу

Соединения с хостом иногда бывают успешными с mysql_connect () и telnet, но я всегда могу успешно пропинговать хост?

Когда я пытаюсь подключиться к хосту в своей локальной сети с помощью mysql_connect();, соединения иногда устанавливаются успешно, а иногда - нет. Я всегда могу успешно пропинговать сервер MySQL, но когда я пытаюсь использовать telnet подключиться к нему через порт 3306, не всегда получается. Я могу подключиться к посту 3306 в первый раз, но не после этого.

5.1.58-1ubuntu1)[n9pK8'Ym7j1Q'khH Got packets out of order
Lost connection with host

C:\Documents and Settings\Administrator>telnet 10.253.48.49 3306
Connecting to 10.253.48.49... Cannot open connection to the host on port 3306:
Connect failed

Pinging is always successful, however:
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64

Кроме того, другие клиенты в локальной сети могут подключаться к хосту, даже если я не могу. Я могу каждый раз успешно подключаться к другому хосту. Как я могу решить эту ошибку?

Долгий путь, но есть ли у вас в сети повторяющийся IP-адрес? Т.е. тот, на котором размещается mysql, а другой - нет, и вы случайно подключаетесь к нужному?

Попробуйте выполнить arp -a и проверить MAC-адрес того IP-адреса, который вы считаете правильным. Это может занять несколько попыток, но если у вас есть повторяющийся IP-адрес, вы в конечном итоге получите другой MAC-адрес для того же IP-адреса.

На хост-машине для MySQL (которая, как я полагаю, работает под управлением Ubuntu, судя по вашему сообщению об ошибке), попробуйте выполнить эту команду:

sudo netstat -lntp | grep 3306

Вы должны увидеть mysqld демон работает. В противном случае проблема может заключаться в том, что демон MySQL машины не запущен. Я думаю, что в Ubuntu команда /etc/init.d/mysql start запустить от имени root, что запустит демон, если он не запущен. (Я не использую Ubuntu, но это то, что дает поиск Google. В Arch это rc.d start mysqld но это точно не переводится на Ubuntu).

Если проблема не в этом, т. Е. Демон запущен на хост-машине, проблема может заключаться в том, что брандмауэр настроен неправильно и порт не открыт. Попробуйте эту команду, чтобы узнать, открыт ли порт (обе эти команды выполняются на хост-машине с MySQL, а не на вашем локальном компьютере, где вы используете PHP)

nmap -v -sT localhost

Если ты не видишь 3306 указан как открытый, и машина использует iptables в качестве брандмауэра эта команда должна открыть этот порт

iptables -I INPUT -p tcp --dport 3306 -d host.machine.ip.address -s your.machine.ip.address -j ACCEPT

что должно позволить вашей клиентской машине (той, которая работает mysql_connect(), хотя это не должно быть) для доступа к хост-машине MySQL.

Кроме того, как я уже упоминал в своем комментарии (подсказка для РикудоСеннин для этого): Пожалуйста, не используйте mysql_* функции для нового кода. Они больше не поддерживаются, и сообщество начало процесс прекращения поддержки. Увидеть красная коробка? Вместо этого вы должны узнать о подготовленные заявления и используйте либо PDO или MySQLi. Если вы не можете решить, Эта статья поможет вам. Если ты хочешь учиться, вот хороший учебник PDO.

РЕДАКТИРОВАТЬ: после еще нескольких поисков в Интернете я вижу, что другой пользователь на ServerFault ответил на эту проблему двумя из трех предложенных мною команд, поэтому я ссылаюсь на этот вопрос, поскольку он может быть актуальным.