Как всегда, ближе к выходным мне позвонил добрый знакомый и сообщил радостную весть – у него теперь новый модем. Только возникла маленькая проблемка: раньше, находясь в поездке (где-то далеко) он мог зайти через него из Интернета на свой компьютер, а сейчас – нет. И выдаётся ему MySQL-ошибка: «Access denied for user 'Test'@'xxx.xxx.xxx.xxx' (using password: NO)». Где в качестве «Test» и «ххх.ххх.ххх.ххх» - его имя пользователя и некий конкретный IP-адрес.
Не считаю себя экспертом, но в кое-чём разбираюсь. Оставаясь высокого мнения о себе, я был малость озадачен. Самое интересное, что имя пользователя и пароль вводились, а в описании ошибки чётко указано, что пароль не вводился. Нонсенс («этого не может быть потому, что не может быть»)! Что ж, сказал я себе – время поэкспериментировать и разобраться. Нужно спасать своё реноме.
Ясно одно – существует проблема с аутентификацией пользователя. Тут надо действовать последовательно. Для начала, я включил
запрет на использование имён хостов. Что гарантирует использование только IP. Но, это не помогло. Значит, надо посмотреть LOG MySQL, кто и как пытается подсоединиться. У меня используется MySQL v. 5.5.11 for Win32 on x86. Поэтому, некоторые ключи, запускающие лог, перестали работать, и мне пришлось «покопаться» в памяти…
Для верности эксперимента я включил Log непосредственно в my.ini. Для этого, в разделе [mysqld] можно дописать строки:
# Полный лог соединений и запросов (типа general-log-file), по умолчанию: C:\MySQL\Data\<имя базы>.log
log=general.log
# Лог ошибок
#log-error=error.log
# Лог медленных запросов, по умолчанию: C:\MySQL\Data\<имя базы>-slow.log
#log-slow-queries=slowquery.log
После перезапуска пытаемся подключиться, получаем ошибку и листаем журнал «general.log»… Конечно! На модеме включен NAT, который производил подмену IP-адреса. Чтобы его не отключать, я решил, что будет лучше в свойствах NAT-а настроить правило внешнего подключения, разрешив доступ только к конкретному «проброшенному» порту и только с конкретного адреса. Попутно, пришлось изменить настройку пользователя в MySQL.
Ну и ещё. Теперь я знаю, что кроме стандартного толкования текста MySQL-ошибки 1045 есть ещё одно. Допустим, у Вас есть некий пользователь, которому разрешено заходить только с определённого хоста. Если мы зайдём с другого хоста, на который мы не давали разрешения, и введём пароль - система вас не пустит. Правильно, но при этом скажет, что пароль вы не вводили. Вот такой весёлый «лючок». «Using password: NO» - может просто означать, что вы зашли с запрещённого адреса и не иметь никакого отношения к вводу паролю.
Хорошего дня!
20.04.2015 г. Карандаш.