понедельник, 4 марта 2019 г.

MySQL error 1045

Ошибка MySQL 1045


Автор: Василий Лукьянчиков , vl (at) sqlinfo (dot) ru
Статистика форума SQLinfo показывает, что одной из наиболее популярных проблем является ошибка mysql №1045 (ошибка доступа). 
Текст ошибки содержит имя пользователя, которому отказано в доступе, компьютер, с которого производилось подключение, а также ключевое слово YES или NO, которые показывают использовался ли при этом пароль или была попытка выполнить подключение с пустым паролем.
Типичные примеры:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) -- сервер MySQL
-- сообщает, что была неудачная попытка подключения с локальной машины пользователя с именем root и
-- не пустым паролем.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) -- отказано в 
-- доступе с локальной машины пользователю с именем root при попытке подключения с пустым паролем.
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) -- отказано в 
-- доступе с локальной машины пользователю с именем ODBC при попытке подключения с пустым паролем.

Причина возникновения ошибки 1045

Как ни банально, но единственная причина это неправильная комбинация пользователя и пароля. Обратите внимание, речь идет о комбинации пользователь и пароль, а не имя пользователя и пароль. Это очень важный момент, так как в MySQL пользователь характеризуется двумя параметрами: именем и хостом, с которого он может обращаться. Синтаксически записывается как 'имя пользователя'@'имя хоста'.
Таким образом, причина возникновения MySQL error 1045 - неправильная комбинация трех параметров: имени пользователя, хоста и пароля.
В качестве имени хоста могут выступать ip адреса, доменные имена, ключевые слова (например, localhost для обозначения локальной машины) и групповые символы (например, % для обозначения любого компьютера кроме локального). Подробный синтаксис смотрите в документации
Замечание: Важно понимать, что в базе не существует просто пользователя с заданным именем (например, root), а существует или пользователь с именем root, имеющий право подключаться с заданного хоста (например, root@localhost) или даже несколько разных пользователей с именем root (root@127.0.0.1, root@webew.ru, root@'мой домашний ip' и т.д.) каждый со своим паролем и правами.
Примеры.
1) Если вы не указали в явном виде имя хоста
ПРЕДОСТАВЛЯЙТЕ ВСЕ  НА ПУБЛИКАЦИЯХ  . *  ДЛЯ  'ODBC'  ИДЕНТИФИЦИРОВАНО  'Newpass' ;
то у вас будет создан пользователь 'ODBC'@'%' и при попытке подключения с локальной машины вы получите ошибку:
ОШИБКА  1045  ( 28000 ) : доступ запрещен для пользователя  'ODBC' @ 'localhost'  ( с использованием  пароля: ДА )
так как пользователя 'ODBC'@'localhost' у вас не существует.
2) Другой первопричиной ошибки mysql 1045 может быть неправильное использование кавычек.
CREATE USER 'new_user@localhost' IDENTIFIED BY 'mypass'-- будет создан пользователь 'new_user@localhost'@'%'
Правильно имя пользователя и хоста нужно заключать в кавычки отдельно, т.е. 'имя пользователя'@'имя хоста'
3) Неочевидный вариант. IP адрес 127.0.0.1 в имени хоста соответствует ключевому слову localhost. С одной стороны, root@localhost и 'root'@'127.0.0.1' это синонимы, с другой, можно создать двух пользователей с разными паролями. И при подключении будет выбран тот, который распологается в таблице привелегий (mysql.user) раньше.
4) Аккаунт с пустым именем пользователя трактуется сервером MySQL как анонимный, т.е. позволяет подключаться пользователю с произвольным именем или без указания имени. Например, вы создали пользователя ''@localhost с пустым паролем, чтобы каждый мог подключиться к базе. Однако, если при подключении вы укажите пароль отличный от пустого, то получите ошибку 1045. Как говорилось ранее, нужно совпадение трех параметров: имени пользователя, хоста и пароля, а пароль в данном случае не совпадает с тем, что в базе.

Что делать?

Во-первых, нужно убедиться, что вы используете правильные имя пользователя и пароль. Для этого нужно подключиться к MySQL с правами администратора (если ошибка 1045 не дает такой возможности, то нужно перезапустить сервер MySQL в режиме --skip-grant-tables), посмотреть содержимое таблицы user служебной базы mysql, в которой хранится информация о пользователях, и при необходимости отредактировать её.
Пример.
ВЫБЕРИТЕ  пользователя, хост, пароль ОТ mysql.user; + -----------
---- + ----------------- + --------------- ---------------------------- + | пользователь | хозяин | пароль | + --------------- + ----------------- + --------------- ---------------------------- + | корень | дом-f26710394 | * 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | аа | местный хост | * 196BDEDE2AE4F84CA44C47D54D78478C7E2BD7B7 | | тест | местный хост | | | new_user | % | | | | % | * D7D6F58029EDE62070BA204436DE23AC54D8BD8A |  
| новый @ localhost | % | * ADD102DFD6933E93BCAD95E311360EC45494AA6E |
| корень | местный хост | * 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+ --------------- + ----------------- + --------------- ---------------------------- +
Если изначально была ошибка:
  • ОШИБКА 1045 ( 28000 ) : доступ запрещен для пользователя 'root' @ 'localhost' ( с использованием пароля: ДА )     
    значит вы указывали при подключении неверный пароль, так как пользователь root@localhost существует. Сам пароль храниться в зашифрованном виде и его нельзя узнать, можно лишь задать новый
    SET PASSWORD FOR root@localhost=PASSWORD('новый пароль');
  • ОШИБКА 1045 ( 28000 ) : доступ запрещен для пользователя 'ODBC' @ 'localhost' ( с использованием пароля: ДА )     
    в данном случае в таблице привилегий отсутствует пользователь 'ODBC'@'localhost'. Его нужно создать, используя команды GRANT, CREATE USER и SET PASSWORD.
Экзотический пример. Устанавливаете новый пароль для root@localhost в режиме --skip-grant-tables, однако после перезагрузки сервера по прежнему возникает ошибка при подключении через консольный клиент:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) Оказалось, что было установлено два сервера MySQL, настроенных на один порт.

PHPMyAdmin

При открытии в браузере phpmyadmin получаете сообщение:
Ошибка
MySQL  говорит: # 1045 - Доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: НЕТ). Соединение для controluser, как определено в вашей конфигурации, не удалось. phpMyAdmin попытался подключиться к серверу MySQL , и сервер отклонил соединение. Вы должны проверить хост, имя пользователя и пароль в вашей конфигурации и убедиться, что они соответствуют информации, предоставленной администратором сервера MySQL .


     
    
Ни логина, ни пароля вы не вводили, да и пхпадмин их нигде требовал, сразу выдавая сообщение об ошибке. Причина в том, что данные для авторизации берутся из конфигурационного файла config.inc.php Необходимо заменить в нем строчки
$ cfg [ 'Servers' ] [ $ i ] [ 'user' ]  = 'root' ;      // MySQL user $ cfg [ 'Servers' ] [ $ i ] [ 'password' ] = '' ;      // Пароль MySQL (нужен только 
  

на

$cfg['Servers'][$i]['user'] = 'ЛОГИН';    
$cfg['Servers'][$i]['password'] = 'ПАРОЛЬ'

Установка новой версии

Устанавливаете новую версию MySQL, но в конце при завершении конфигурации выпадает ошибка:
ОШИБКА Nr. 1045 Доступ запрещен для пользователя 'root' @ 'localhost' ( используется пароль: НЕТ ) 
   
Это происходит потому, что ранее у вас стоял MySQL, который вы удалили без сноса самих баз. Если вы не помните старый пароль и вам нужны эти данные, то выполните установку новой версии без смены пароля, а потом смените пароль вручную через режим --skip-grant-tables.
P.S. Статья написана по материалам форума SQLinfo, т.е. в ней описаны не все потенциально возможные случаи возникновения ошибки mysql №1045, а только те, что обсуждались на форуме. Если ваш случай не рассмотрен в статье, то задавайте вопрос на форуме SQLinfo
Вам ответят, а статья будет расширена.