MySQL ERROR 1045 (28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используется пароль: YES)


430

Прежде всего позвольте мне упомянуть, что я прошел через многие предложенные вопросы и не нашел подходящего ответа. Вот что я делаю.

Я подключен к своему экземпляру Amazon EC2. Я могу войти с MySQL root с помощью этой команды:

mysql -u root -p

Затем я создал новый счет пользователя с хостом%

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

Предоставлены все привилегии для счета пользователя:

grant all privileges on *.* to 'bill'@'%' with grant option;

Затем я выхожу от пользователя root и пытаюсь войти с помощью счета:

mysql -u bill -p

ввел правильный пароль и получил эту ошибку:

ОШИБКА 1045 (28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используя пароль: ДА)


34

6
Хорошо, я попробовал это без какого-либо успеха. Любое другое предложение, пожалуйста.
Али

1
Какую версию сервера вы используете? Я видел 5.1 странно себя вести по этому поводу.
Пудель

2
Это случилось со мной при установке Magento, и я совершил гораздо более глупую ошибку. При вводе «mysql -u magento -p magento» у меня
запрашивался

2
@authentictech, к сожалению, ни одно из предложенных решений не помогло мне на момент публикации этого вопроса. Пожалуйста, посмотрите мой собственный ответ, который помог мне разобраться в этой ситуации. Вот почему я не пометил ни одного из них как ответ. Вероятно, я могу отметить ответ с самым высоким рейтингом как ответ.
Али

Ответы:


442

Возможно, у вас есть анонимный пользователь ''@'localhost'или ''@'127.0.0.1'.

Согласно инструкции :

Если возможно несколько совпадений, сервер должен определить, какое из них использовать. Это решает эту проблему следующим образом: (...)

  • Когда клиент пытается подключиться, сервер просматривает строки [таблицы mysql.user] в отсортированном порядке.
  • Сервер использует первую строку, которая соответствует имени хоста клиента и имени пользователя.

(...) Сервер использует правила сортировки, которые сначала упорядочивают строки с наиболее конкретными значениями хоста . Литеральные имена хостов [например, localhost] и IP-адреса являются наиболее конкретными.

Следовательно, такой анонимный пользователь «маскирует» любого другого пользователя, как '[any_username]'@'%'при подключении с localhost.

'bill'@'localhost'соответствует 'bill'@'%', но будет соответствовать (например) ''@'localhost'заранее.

Рекомендуемое решение состоит в том, чтобы удалить этого анонимного пользователя (как правило, в любом случае это хорошая вещь).


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

Редактировать 1

Аутентификация как 'bill'@'%'через сокет.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    Добро пожаловать на монитор MySQL (...)

    mysql> ВЫБЕРИТЕ пользователя, хост FROM mysql.user;
    + ------ + ----------- +
    | пользователь | хозяин |
    + ------ + ----------- +
    | счет | % |
    | корень | 127.0.0.1 |
    | корень | :: 1 |
    | корень | местный хост |
    + ------ + ----------- +
    4 ряда в наборе (0,00 сек)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | ПОЛЬЗОВАТЕЛЬ () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | счет @ localhost | счет @% |
    + ---------------- + ---------------- +
    1 ряд в наборе (0,02 сек)

    mysql> SHOW VARIABLES LIKE 'skip_networking';
    + ----------------- + ------- +
    | Переменное_имя | Значение |
    + ----------------- + ------- +
    | skip_networking | ON |
    + ----------------- + ------- +
    1 ряд в наборе (0,00 сек)

Редактировать 2

Точно такая же настройка, за исключением того, что я повторно активировал сеть, и теперь я создаю анонимного пользователя ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Добро пожаловать на монитор MySQL (...)

    mysql> CREATE USER '' @ 'localhost', ИДЕНТИФИЦИРОВАНЫ 'anotherpass';
    Запрос в порядке, затронуто 0 строк (0,00 с)

    mysql> Пока

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / TMP / MySQL-5.5.sock
    ОШИБКА 1045 (28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используя пароль: ДА)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    ОШИБКА 1045 (28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используя пароль: ДА)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    ОШИБКА 1045 (28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используя пароль: ДА)

Редактировать 3

Та же ситуация, что и в редактировании 2, теперь указывается пароль анонимного пользователя.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Добро пожаловать на монитор MySQL (...)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | ПОЛЬЗОВАТЕЛЬ () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | счет @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 ряд в наборе (0,01 с)

Вывод 1, из редактирования 1: Можно аутентифицироваться как 'bill'@'%'через сокет.

Вывод 2, из редактирования 2. Независимо от того, подключается ли кто-либо через TCP или через сокет, процесс аутентификации не влияет (за исключением того, что никто не может подключиться, как кто-либо другой, но 'something'@'localhost'через сокет, очевидно).

Вывод 3, из редактирования 3: Хотя я указал -ubill, мне предоставили доступ в качестве анонимного пользователя. Это из-за "правил сортировки", рекомендованных выше. Обратите внимание, что в большинстве установок по умолчанию анонимный пользователь без пароля существует (и должен быть защищен / удален).


9
Для всех, кто интересуется, почему «bill» @ «localhost» совпадает с «@» localhost », как это было у меня, пустая строка эффективно действует как подстановочный знак в алгоритме аутентификации MySQL.
Дин или

2
@Sanja Будьте очень осторожны с этим решением. Возможно, вы разрешаете анонимный доступ к вашей базе данных из любого места. В случае сомнений я бы лучше удалил пользователя.
RandomSeed

7
@RandomSeed Спасибо за этот комментарий! Вероятно, я должен просто удалить анонимного пользователя. PS Я нашел dev.mysql.com/doc/refman/5.1/en/default-privileges.html , что говорит , что эти пользователи , безусловно , могут быть удалены DROP USER ''@'localhost';. Они не нужны для какой-то особой цели.
Алекс

1
Я уронил анонимного пользователя, но все равно ничего не получалось. Тогда я обнаружил, что мне нужно выдать также "FLUSH PRIVILEGES". Было бы полезно упомянуть это также.
Neeme Praks

2
Это ответ! Почему это не входит в жирные заглавные буквы в каждом руководстве MySQL. УДАЛИТЕ АНОНИМНОГО ПОЛЬЗОВАТЕЛЯ, ИЛИ УБИТ ВСЕ ВАШИ ПОПЫТКИ, ЧТОБЫ ВОЙТИ ИЗ LOCALHOST!
Сергей

140

Пытаться:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

10
Это довольно опасно, если кто-то взломает вашу учетную запись bill @ localhost mysql, у него будет неограниченный доступ ко всем базам данных вашего сервера mysql.
Адонис К. Какоулидис

2
Whehey. Я должен был поместить цитату вокруг моего пользователя 'myusername'@'myhost.static.myip.com', чтобы это сработало.
Бендецко,

Это работает для меня, но я боюсь, что дал слишком много привилегий для пользователя
Csaba Toth

1
@ CsabaТо, что вы сделали, снова уменьшите привилегии, пока у вашего пользователя не будет то, что ему нужно, и не более.
jwenting

... и что вы будете делать, если это даст вам "Доступ запрещен для пользователя 'root' @ 'localhost' (используя пароль: YES)" тогда?
Груньон Шафто

75

Когда ты побежал

mysql -u bill -p

и получил эту ошибку

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

mysqld ожидает, что вы подключитесь как bill@localhost

Попробуйте создать bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

Если вы хотите подключиться удаленно, вы должны указать либо DNS-имя, публичный IP-адрес, либо 127.0.0.1 с использованием TCP / IP:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

После входа в систему, пожалуйста, запустите

SELECT USER(),CURRENT_USER();

USER () сообщает, как вы пытались пройти аутентификацию в MySQL

CURRENT_USER () сообщает, как вам разрешили проходить аутентификацию в MySQL из таблицы mysql.user

Это даст вам лучшее представление о том, как и почему вам было разрешено войти в MySQL. Почему это мнение важно знать? Это связано с протоколом заказа аутентификации пользователя.

Вот пример: я создам анонимного пользователя на моем рабочем столе MySQL

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

ОК, смотри, как я вошел как анонимный пользователь

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

Порядок аутентификации очень строг. Он проверяет от наиболее конкретного до наименее. Я написал об этом стиле аутентификации в DBA StackExchange .

Не забудьте явно вызвать TCP как протокол для клиента mysql, когда это необходимо.


1
'bill'@'localhost'должно совпадать 'bill@%', не так ли?
RandomSeed

@Yak порядок сортировки не основан исключительно на пользовательском столбце mysql.user. MySQL не выполняет никаких сопоставлений символов как таковых. Я написал о протоколе порядка аутентификации пользователей в DBA StackExchange: dba.stackexchange.com/a/10897/877
RolandoMySQLDBA

@YaK Вот почему я специально упомянул SELECT USER(),CURRENT_USER();. Вы почти никогда не увидите анонимных пользователей из этих двух функций, за исключением очень плохих настроек.
RolandoMySQLDBA

1
Я никогда не предполагал, что порядок сортировки основан исключительно на mysql.user. На самом деле, если вы прочитаете мой ответ еще раз, вы увидите, что я сказал (на самом деле, в руководстве написано), порядок сортировки hostсначала основан на столбце. Вы много писали о том, как проверить свои текущие учетные данные, но я вижу мало информации о том, почему 'bill'@'localhost'не могу войти как 'bill'@'%', что является сегодняшним вопросом AFAIK. У OP, вероятно, плохая настройка, поэтому он получает эти ошибки.
RandomSeed

2
--protocol=TCPбыл ключ. Большое спасибо!
lfx

22

Супер поздно к этому

Я попробовал все эти другие ответы и запустил много разных версий, mysql -u root -pно никогда не бегал


mysql -u root -p

И просто нажимаю [ENTER]на пароль.


Как только я это сделал, это сработало. Надеюсь, это кому-нибудь поможет.


18

Связанная проблема в моем случае была попытка подключения с помощью:

mysql -u mike -p mypass

Пробелы, по- видимому, разрешены между -u # uname #, но НЕ между -p и # password #

Поэтому необходимо:

mysql -u mike -pmypass

В противном случае с белым пространством между -p mypass MySQL принимает «» mypass как дб имя


1
или: mysql -u usrname -p - никто не увидит пароль, так как он уронит новую строку и запросит пароль без его отображения

отличный ответ @mstram
Арпит Соланки

1
Это удобное решение, тем не менее, очевидно, что вводить пароль небезопасно, но нет необходимости вводить привилегии и определять другие вещи. Так что, если ваша книга Mac защищена - этот подход очень удобен, тем более что я использовал его для импорта данных в aws из драйвера docker mysql.
Dimpiax

17

Когда вы печатаете mysql -u root -p, вы подключаетесь к серверу mysql через локальный сокет unix.

Однако предоставленный вами грант, как 'bill'@'%'ни странно , соответствует только соединениям TCP / IP.

Если вы хотите предоставить доступ к локальному сокету unix, вам нужно предоставить привилегии для 'bill' @ 'localhost', что, как ни странно, не то же самое, что 'bill'@'127.0.0.1'

Вы также можете подключиться с помощью TCP / IP к клиенту командной строки mysql, чтобы соответствовать привилегиям, которые вы уже предоставили, например, запускать mysql -u root -p -h 192.168.1.123или какой-либо локальный IP-адрес, который есть у вашего ящика.


msgstr "'bill' @ '%' соответствует только соединениям TCP / IP" Это неправильно. Попробуйте это на чистом (нетронутом, skip-networking
готовом

@ ЯК Я не могу заставить 'пользователя' @ '%' функционировать в такой обстановке, что ты имеешь в виду, должно было произойти?

Я мог подключиться как 'bill' @ '%' на v5.0 без подключения к сети (следовательно, через сокет). Какую версию ты используешь? Я попробую это на v5.5.
RandomSeed

Пожалуйста, смотрите мой обновленный ответ. Я смог войти как 'bill'@'%'через сокет на v5.5.
RandomSeed

17

Если вы забыли свой пароль или хотите изменить его. Вы можете выполнить следующие действия:

1: останови свой mysql

[root @ maomao ~] # служба mysqld stop
Остановка MySQL: [OK]

2: используйте «--skip-grant-tables» для перезапуска mysql

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # Запуск демона mysqld с базами данных из / var / lib / mysql

3: откройте новое окно и введите mysql -u root

[root @ cy400 ~] # mysql -u root
Добро пожаловать в монитор MySQL. Команды заканчиваются на; или \ g.

4: изменить базу данных пользователей

mysql> использовать mysql
Чтение информации о таблице для дополнения имен таблиц и столбцов Вы можете отключить эту функцию, чтобы ускорить запуск с -A База данных изменена

5: измените свой пароль, ваш новый пароль должен быть введен в «()»

mysql> обновить пользовательский набор password = пароль ('root123'), где user = 'root';
Запрос в порядке, затронуто 3 строки (0,00 с)
Соответствующие строки: 3 Изменено: 3 Предупреждения: 0

6: флеш

mysql> сброс привилегий;

7: выйти

mysql> выход
пока

8: перезапустите MySQL

[root @ cy400 ~] # служба mysqld restart;
Остановка MySQL: [OK]
Запуск MySQL: [OK]

Бинго! Вы можете связать свою базу данных с вашим именем пользователя и новым паролем:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye

1
Это помогло мне, но на Mac, если вы устанавливаете с homebrew это mysql.server stop. В моем случае я не смог обновить столбец пользователя, потому что его нет; также не может создать его, потому что он находится в безопасном режиме. Для того, что я делаю сейчас, мне все равно, но я действительно ценю этот формат ответа с точными показанными входами и выходами. Спасибо!
Сейтлин

Извините, я никогда не пользовался Mac раньше. Так что я не могу вам помочь.
Ли Инцзюнь

15

Избавьте себя от ОСНОВНОЙ головной боли ... Ваша проблема может заключаться в том, что вы пропускаете кавычки вокруг пароля. По крайней мере, это был мой случай, который отвлек меня на 3 часа.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

Найдите «Вот типичный файл опций пользователя:» и посмотрите пример, который там указан. Удачи, и я надеюсь сэкономить кому-то еще время.


1
Спасибо тебе за это. Я потратил впустую половину дня на это, и глупые цитаты вокруг пароля сделали свое дело!
guyfromfl

Ха - ха. Я потерял почти столько же, когда это случилось со мной. Рад помочь.
Mimoralea

12

Решение состоит в том, чтобы удалить анонимного (любого) пользователя!

Я также столкнулся с той же проблемой при настройке сервера кем-то другим. Обычно я не решаю создать анонимного пользователя после установки MySQL, поэтому не заметил этого. Первоначально я вошел в систему как «root» пользователь и создал пару «обычных» пользователей (то есть пользователей с привилегиями только на dbs с их именем пользователя в качестве префикса), затем вышел из системы и продолжил проверку первого обычного пользователя. Я не мог войти. Ни через phpMyAdmin, ни через shell. Оказывается, виновником этого «любого» пользователя.


11

У меня была несколько похожая проблема - при первой попытке войти в MySQL, как rootмне сказали, доступ запрещен. Оказывается, я забыл использовать sudo...

Итак, если вы потерпели неудачу с rootпервой попытки, попробуйте:

sudo mysql -u root -p

и затем введите свой пароль, это должно работать.


6

Лучшее решение, которое я нашел для себя, это.

мой пользователь - сонар, и всякий раз, когда я пытаюсь подключиться к своей базе данных с внешней или другой машины, я получаю сообщение об ошибке, так как

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)

Кроме того, как я пытаюсь это с другой машины и через работу Jenkins, мой URL для доступа

alm-lt-test.xyz.com

если вы хотите подключиться удаленно, вы можете указать это различными способами следующим образом:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

Чтобы получить доступ к этому с помощью URL, вам просто нужно выполнить следующий запрос.

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';

4

Хорошо, я не уверен, но, вероятно, виноват этот файл my.cnf внутри установочного каталога mysql. Закомментируйте эту строку, и проблема может быть решена.

bind-address = 127.0.0.1

1
Для более подробной информации, вы можете просмотреть это также wiki.bitnami.org/Components/MySQL
Али

1
Я совершенно уверен, что это не проблема. В этом случае MySQL отклоняет соединения с любого хоста, кроме 127.0.0.1, и вы не получите ошибку SQL «Отказано в доступе».
Pellmeister

3

Просто хотел сообщить вам необычное обстоятельство, я получил ту же ошибку. Возможно, это поможет кому-то в будущем.

Я разработал несколько базовых представлений, создал их на сайте разработки и перенес их на производственную площадку. Позже на этой неделе я изменил PHP-скрипт, и внезапно возникли ошибки, когда доступ был запрещен для пользователя 'local-web-user' @ 'localhost'. Объект источника данных не изменился, поэтому я сосредоточился на пользователе базы данных в MySQL, опасаясь, пока кто-нибудь взломает мой сайт. К счастью, остальная часть сайта казалась невредимой.

Позже выяснилось, что взгляды были виновником (ами). Наши передачи объектов выполняются с использованием другого (и удаленного: admin @ ip-address) пользователя, нежели пользователь локального веб-сайта. Таким образом, представления были созданы с «admin» @ «IP-адрес» в качестве определителя. По умолчанию создание представления SECURITY

SQL SECURITY DEFINER

Когда локальный веб-пользователь пытается использовать представление, он сталкивается с отсутствующими привилегиями определителя для использования таблиц. После того, как безопасность была изменена на:

SQL SECURITY INVOKER

проблема была решена. Фактическая проблема полностью отличалась от ожидаемой на основании сообщения об ошибке.


1
Это также стало источником моей проблемы - точка зрения с отсутствующим «определителем». Один из быстрых способов выяснить, происходит ли это с вами, состоит в том, чтобы попытаться запросить ту же таблицу или представление в качестве пользователя root - если вы это сделаете, сообщение об ошибке изменится на гораздо более описательный "ОШИБКА 1449 (HY000): пользователь указан как определитель не существует ".
Джошуа Дэвис

3

Это разница между:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

а также

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

Проверь это:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

Команда

mysql -u bill -p

доступ неявный к 'bill' @ 'localhost' и НЕ к 'bill' @ '%'.

Нет разрешений для 'bill' @ 'localhost'

Вы получаете ошибку:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

решение проблемы:

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;

Оператор предоставления вернул ошибку. Мне нужно было указать базу данных примерно так: предоставить все привилегии для newdb. * To ....
LeBird

3

Это также происходит, когда ваш пароль содержит некоторые специальные символы, такие как @, $ и т. Д. Чтобы избежать этой ситуации, вы можете заключить пароль в одинарные кавычки:

$ mysql -usomeuser -p's0mep@$$w0Rd'

Или вместо этого не используйте пароль при вводе. Оставьте это поле пустым, а затем введите его, когда терминал спросит. Это рекомендуемый способ.

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

3
Это действительно может быть проблемой (как это было для меня). Все мои пароли для любой из моих учетных записей создаются с использованием pwgen. Сегодня я создал новый для базы данных MySQL и ее пользователя. К сожалению, пароль содержал обратную косую черту "\", которую я не определил как источник ошибок (я даже не думал об этом). Итак, я часами искал решение. После установки пароля на «123» в отчаянии логин наконец заработал. … Пользователи должны знать, что некоторые специальные символы могут вызывать проблемы, поскольку MySQL не показывает никаких предупреждений об использовании паролей, таких как, например, «daiy4ha4in7chooshuiphie \ Th * aew».
Арвид

1
Собирался опубликовать это как ответ, если он еще не появился, он был слишком далеко внизу списка, чтобы я мог его заметить (поэтому я поднимаю его +1)
Ассимилятор

3

Для меня эта проблема была вызвана новой функцией MySQL 5.7.2: userзаписи игнорируются, если их pluginполе пусто.

Установите его, например, mysql_native_passwordчтобы включить их:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

См. Примечания к выпуску для MySQL 5.7.2 , в разделе «Примечания проверки подлинности».

По какой-то причине (возможно, из-за того, что мои хеши паролей до 4.1 были удалены), mysql_upgradeскрипт не установил значение плагина по умолчанию.

Я узнал, заметив следующее предупреждение в /var/log/mysql/error.log:

[Предупреждение] Пользовательская запись 'foo' @ '%' имеет пустое значение плагина. Пользователь будет проигнорирован, и никто больше не сможет войти с этим пользователем.

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


2

Не уверен, что кто-то еще найдет это полезным, но я столкнулся с той же ошибкой и все время искал анонимных пользователей ... а их там не было. Проблема закончилась тем, что для учетной записи пользователя было установлено «Требовать SSL» - что я нашел в PHPMyAdmin, перейдя в раздел «Учетные записи пользователей» и нажав «Изменить привилегии для пользователя». Как только я снял эту опцию, все заработало как положено!


2

Сводка отладки

  • Проверьте на опечатку: имя пользователя или пароль.
  • Проверьте имя хоста и сравните его с именем хоста таблицы mysql.user.
  • Проверьте, существует ли пользователь или нет.
  • Проверьте, содержит ли хост IP-адрес или имя хоста.

Существует большая вероятность того, что вы, возможно, сталкивались с этой проблемой несколько раз в своей работе. Эта проблема возникала у меня чаще всего из-за неправильного ввода имени пользователя или пароля. Хотя это одна из причин, есть много других шансов, что вы можете получить эту проблему. Иногда это выглядит очень похоже, но когда вы копаете глубже, вы поймете несколько факторов, способствующих этой ошибке. В этом посте будет подробно объяснено большинство распространенных причин и способы решения этой проблемы.

Возможные причины:

  • Случай 1: опечатка: имя пользователя или пароль.

Это самая распространенная причина этой ошибки. Если вы ввели имя пользователя или пароль неправильно, вы обязательно получите эту ошибку.

Решение:

Решение для этого типа ошибки очень просто. Просто введите правильное имя пользователя и пароль. Эта ошибка будет устранена. В случае, если вы забыли пароль, вы можете сбросить имя пользователя / пароль. Если вы забыли пароль для учетной записи администратора / root, существует много способов сбросить / восстановить пароль root. Я опубликую еще один пост о том, как сбросить пароль root на случай, если вы забудете пароль root.

  • Случай 2: доступ с неверного хоста.

MySQL предоставляет ограничения на основе хоста для доступа пользователей в качестве функций безопасности. В нашей производственной среде мы использовали ограничение доступа только к серверам приложений. Эта функция действительно полезна во многих производственных сценариях.

Решение:

Когда вы сталкиваетесь с этим типом проблемы, сначала проверьте, разрешен ли ваш хост или нет, проверив таблицу mysql.user. Если он не определен, вы можете обновить или вставить новую запись в таблицу mysql.user. Как правило, доступ с правами root с удаленного компьютера отключен, и это не рекомендуется из-за проблем безопасности. Если у вас есть требования для доступа к вашему серверу с нескольких компьютеров, предоставьте доступ только к этим машинам. Лучше не использовать подстановочные знаки (%) и дает универсальный доступ. Позвольте мне обновить таблицу mysql.user, теперь демосер может получить доступ к серверу MySQL с любого хоста.

  • Случай 3: Пользователь не существует на сервере.

Этот тип ошибки возникает, когда пользователь, к которому вы пытаетесь обратиться, не существует на сервере MySQL.

Решения:

Когда вы сталкиваетесь с этим типом проблемы, просто проверьте, существует ли пользователь в таблице mysql.user или нет. Если запись не существует, пользователь не может получить доступ. Если для этого пользователя требуется доступ, создайте нового пользователя с таким именем.

  • Случай 4: Сочетание хостов на основе чисел и имен.

Важные точки

  • Не рекомендуется использовать подстановочные знаки при определении хоста пользователя, попробуйте использовать точное имя хоста.

  • Отключить root-логин с удаленной машины.

  • Используйте концепцию прокси-пользователя.

Есть несколько других концепций, связанных с этой темой, и подробное описание этих тем очень сильно отличается от этой статьи. Мы рассмотрим следующие связанные темы в следующих статьях.

  • Что делать, если вы забыли пароль root на сервере MySQL.
  • Проблемы с привилегиями MySQL Access и пользовательские таблицы.
  • Функции безопасности MySQL с лучшими практиками.

Я надеюсь, что этот пост поможет вам исправить MySQL Error Code 1045 Доступ запрещен для пользователя в MySQL.


2

Я надеюсь, что вы не причинили больше вреда, также удалив пользователя debian-sys-maint в mysql

Пусть ваш демон mysql работает в обычном режиме. Запустите клиент MySQL, как показано ниже

mysql -u debian-sys-maint -p

В другом терминале catфайл /etc/mysql/debian.cnf. Этот файл содержит пароль; вставьте этот пароль при запросе.

http://ubuntuforums.org/showthread.php?t=1836919


2

Я обнаружил еще один случай, который на поверхности кажется краевым; Я могу экспортировать в файловую систему через SELECT INTO .. ​​OUTFILE как root, но не как обычный пользователь. Хотя это может быть вопросом разрешений, я посмотрел на это и не вижу ничего особенно очевидного. Все, что я могу сказать, это то, что выполнение запроса обычным пользователем, имеющим все разрешения для рассматриваемой базы данных, возвращает ошибку отказа в доступе, которая привела меня к этой теме. Когда я нашел расшифровку успешного использования SELECT INTO… OUTFILE в старом проекте, я заметил, что вошел в систему как root. Конечно, когда я вошел в систему как root, запрос выполнялся как ожидалось.


1

Обновление: на v8.0.15 (возможно, эта версия) PASSWORD()функция не работает.

Вы должны:

  1. Убедитесь, что вы остановили MySQL в первую очередь.
  2. Запустите сервер в безопасном режиме с обходом привилегий: sudo mysqld_safe --skip-grant-tables
  3. Авторизоваться: mysql -u root
  4. MySQL> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. MySQL> FLUSH PRIVILEGES;
  6. MySQL> exit;
  7. Войдите снова: mysql -u root
  8. MySQL> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

0

Когда вы запускаете mysql -u bill -p, localhostон разрешается в ваш ip, так как это 127.0.0.1 и в вашем /etc/hostsфайле, по умолчанию, 127.0.0.1 localhostсуществует. Таким образом, MySQL интерпретирует вас как то, bill@localhostчто не предоставляется с bill@'%'. Поэтому rootв результате select host, user from mysql.user;запроса для пользователя есть две разные записи .

Есть два способа справиться с этой проблемой.

Один из них - указать IP-адрес, который не разрешается /etc/hostsфайлом обратно при попытке входа в систему. Например, ip сервера есть 10.0.0.2. Когда вы запустите команду mysql -u bill -p -h 10.0.0.2, вы сможете войти в систему. Если вы напечатаете select user();, вы получите bill@10.0.0.2. Конечно, любое доменное имя не должно быть разрешено до этого IP в вашем /etc/hostsфайле.

Во-вторых, вам нужно предоставить доступ для этого конкретного доменного имени. Для bill@localhost, вы должны вызвать команду grant all privileges on *.* to bill@localhost identified by 'billpass';. В этом случае вы сможете войти с помощью команды mysql -u bill -p. После входа select user();команда возвращается bill@localhost.

Но это только для того, что вы пытаетесь войти на сервер MySQL на том же хосте. С удаленных хостов mysql ведет себя ожидаемо, «%» предоставит вам возможность войти в систему.


0

Я решил эту проблему , удалив старые ошибочные записи пользователя "bill" (это важная часть: из mysql.user и mysql.db ), затем создал того же пользователя, что и sad, до этого:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

Работал, пользователь подключается. Теперь я уберу из этого некоторые превилеты :)


0

Я столкнулся с той же ошибкой. Настройка, которая не работала, выглядит следующим образом:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

Отредактированная установка ниже - та, которая заставила это работать. Заметили разницу?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

Разница заключается в двойных кавычках. Они кажутся весьма значимыми в PHP, в отличие от Java, и они оказывают влияние, когда речь идет о экранировании символов, настройке URL-адресов и, теперь, передаче параметров в функцию. Они красивее (я знаю), но всегда используйте одинарные кавычки, насколько это возможно, тогда двойные кавычки могут быть вложены в них, если это необходимо.

Эта ошибка возникла, когда я протестировал свое приложение на Linux-боксе, а не в среде Windows.


0

У меня были похожие проблемы, потому что мой пароль содержит ";" char взламывает мой пароль, когда я создаю его в первый момент. Осторожно с этим, если может помочь вам.


0

Это может относиться к очень немногим людям, но здесь идет. Не используйте восклицательный знак !в вашем пароле.

Я сделал и получил вышеупомянутую ошибку, используя MariaDB. Когда я упростил это до просто цифр и букв, это сработало. Другие символы, такие как @и$ работают нормально - я использовал эти символы у другого пользователя в том же экземпляре.

Пятый ответ по этому адресу привел меня к решению проблемы .


0

В Windows вот как решить:

ОШИБКА 1045 (28000): доступ запрещен для пользователя 'root' @ 'localhost' (используется пароль: НЕТ)

  1. Удалите mysql с панели управления
  2. Удалите папку MySql из C:\Program Files,C:\Program Files (x86)иC:\ProgramData
  3. Установите MySQL

Перепробовал все остальные ответы, наконец решил попробовать это и все заработало!
jasonoriordan

0

Это также может произойти, если MySQL работает в нечувствительной к регистру ОС, такой как Windows.

Например, я обнаружил, что попытка подключения к базе данных с использованием этих учетных данных не удалась:

MySQL> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

ОШИБКА 1045 (28000): доступ запрещен для пользователя 'specialuser'@'10.0.1.113' (используя пароль: ДА)

Но это удалось:

MySQL> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

Введите пароль:



0

В наше время! Решение для:

MySQL ERROR 1045 (28000): доступ запрещен для пользователя 'user' @ 'localhost' (используется пароль: YES);

Wampserver 3.2.0 новая установка или обновление

Вероятно, xampиспользование mariaDBпо умолчанию хорошо.

WampСервер поставляется с mariaDBи MySQL, и установка mariaDBпо умолчанию на порт 3306 и MySQL на 3307, иногда порт 3308.

Соединить с mysql !

При установке он просит использовать mariaDBили MySql, но mariaDB отмечен по умолчанию, и вы не можете изменить его, проверьтеmysql опцию и установить.

после завершения установки оба будут работать mariaDBна порте по умолчанию 3306 иmysql на другом порту 3307 или 3308.

Щелкните правой кнопкой мыши wampserverзначок, где его запуск должен быть в правом нижнем углу, перейдите к инструментам и посмотрите ваш правильныйmysql порт запуска.

И включите его в соединение с вашей базой данных так же, как folowng:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note : Я использую pdo.

Смотрите здесь для получения дополнительной информации: https://sourceforge.net/projects/wampserver/


Пожалуйста, не используйте акценты для акцента. Они должны использоваться только для кода. Такие слова, как MySQL или Wampserver не являются кодом.
Дхарман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.