Прежде всего позвольте мне упомянуть, что я прошел через многие предложенные вопросы и не нашел подходящего ответа. Вот что я делаю.
Я подключен к своему экземпляру 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’ (с использованием пароля: ДА)
Вы, вероятно, есть анонимный пользователь ''@'localhost'
или же ''@'127.0.0.1'
,
Согласно руководство:
Если возможно несколько совпадений, сервер должен определить, какой из
их использовать. Это решает эту проблему следующим образом: (…)
- Когда клиент пытается подключиться, сервер просматривает строки [таблицы mysql.user] в отсортированном порядке.
- Сервер использует первую строку, которая соответствует имени хоста клиента и имени пользователя.
(…)
Сервер использует правила сортировки, которые упорядочивают строки с самые специфические значения хоста в первую очередь.
Литеральные имена хостов [такой как ‘localhost’] и IP-адреса являются наиболее конкретными.
Следовательно, такой анонимный пользователь «маскирует» любого другого пользователя, такого как '[any_username]'@'%'
при подключении из localhost
,
'bill'@'localhost'
соответствует 'bill'@'%'
, но будет соответствовать (например) ''@'localhost'
beforehands.
Рекомендуемое решение состоит в том, чтобы удалить этого анонимного пользователя (как правило, в любом случае это хорошая вещь).
Приведенные ниже правки в основном не имеют отношения к основному вопросу. Они предназначены только для ответа на некоторые вопросы, поднятые в других комментариях в этой теме.
Редактировать 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
Мне был предоставлен доступ в качестве анонимного пользователя. Это из-за «правил сортировки», рекомендованных выше. Обратите внимание, что в большинстве установок по умолчанию, нет пароля, существует анонимный пользователь (и должен быть защищен / удален).
Пытаться:
~$ mysql -u root -p
Enter Password:
mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
Когда ты побежал
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 [email protected]
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP
После входа в систему, пожалуйста, запустите
SELECT USER(),CURRENT_USER();
USER () сообщает, как вы пытались пройти аутентификацию в MySQL
ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ() сообщает, как вам было разрешено пройти аутентификацию в 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, когда это необходимо.
Когда вы печатаете 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-адрес вашего ящика.
Связанная проблема в моем случае была попытка подключения с помощью:
mysql -u mike -p mypass
Пробелы Очевидно, допускается между -u # uname #, но НЕ между -p и # паролем #
Поэтому необходимо:
mysql -u mike -pmypass
В противном случае с пробелом между -p mypass MySQL принимает «Mypass» в качестве децибел название
Если вы забыли свой пароль или хотите изменить его. Вы можете выполнить следующие действия:
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 / mysql3: откройте новое окно и введите 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 Предупреждений: 06: флеш
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
Избавьте себя от ОСНОВНОЙ головной боли … Ваша проблема может заключаться в том, что вы пропускаете кавычки вокруг пароля. По крайней мере, это был мой случай, который отвлек меня на 3 часа.
[client]
user = myusername
password = "mypassword" # <----------------------- VERY IMPORTANT (quotes)
host = localhost
http://dev.mysql.com/doc/refman/5.7/en/option-files.html
Найдите «Вот типичный файл опций пользователя:» и посмотрите пример, в котором они изложены. Удачи, и я надеюсь сэкономить кому-то еще время.
Решение состоит в том, чтобы удалить анонимного (любого) пользователя!
Я также столкнулся с той же проблемой при настройке сервера кем-то другим. Обычно я не решаю создать анонимного пользователя после установки MySQL, поэтому не заметил этого. Сначала я вошел в систему как «root» пользователь и создал пару «обычных» пользователей (то есть пользователей с привилегиями только на dbs с их именем пользователя в качестве префикса), затем вышел из системы и продолжил проверку первого обычного пользователя. Я не мог войти. Ни через phpMyAdmin, ни через shell. Оказывается, виновником этого «любого» пользователя.