Ошибка MySQL 1045( 28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используя пароль: да)
во-первых, позвольте мне упомянуть, что я прошел через многие предложенные вопросы и не нашел соответствующего ответа. Вот что я делаю.
Я подключен к моему экземпляру Amazon EC2. Я могу войти в систему с MySQL root с помощью этой команды:
mysql -u root -p
затем я создал новый счет пользователя с хостом %
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
предоставлены все привилегии пользователю Билл:
grant all privileges on *.* to 'bill'@'%' with grant option;
затем я выхожу из корневого пользователя и пытаюсь войти в систему с Биллом:
mysql -u bill -p
вошел правильный пароль и получил эту ошибку:
ошибка 1045( 28000): доступ запрещен для пользователя 'bill'@'localhost' (используя пароль: да)
30 ответов:
Вы, наверное, анонимный пользователь!--3--> или
''@'127.0.0.1'
.по состоянию на руководство:
если возможно несколько совпадений, сервер должен определить, какое из них их использовать. Он решает эту проблему следующим образом: (...)
- когда клиент пытается подключиться, сервер просматривает строки [из таблицы mysql.пользователь] в отсортированном порядке.
- сервер использует первую строку соответствует имени хоста клиента и имени пользователя.
(...) Сервер использует правила сортировки, которые упорядочивают строки с наиболее конкретные значения Хоста сначала. Литеральные имена хостов [например, '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 Welcome to the MySQL monitor (...) mysql> SELECT user, host FROM mysql.user; +------+-----------+ | user | host | +------+-----------+ | bill | % | | root | 127.0.0.1 | | root | ::1 | | root | localhost | +------+-----------+ 4 rows in set (0.00 sec) mysql> SELECT USER(), CURRENT_USER(); +----------------+----------------+ | USER() | CURRENT_USER() | +----------------+----------------+ | bill@localhost | bill@% | +----------------+----------------+ 1 row in set (0.02 sec) mysql> SHOW VARIABLES LIKE 'skip_networking'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | skip_networking | ON | +-----------------+-------+ 1 row in set (0.00 sec)изменить 2
точно такая же настройка, за исключением того, что я повторно активировал сеть, и теперь я создаю анонимного пользователя
''@'localhost'
.root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql Welcome to the MySQL monitor (...) mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass'; Query OK, 0 rows affected (0.00 sec) mysql> Bye root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ --socket=/tmp/mysql-5.5.sock ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES) root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ -h127.0.0.1 --protocol=TCP ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES) root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ -hlocalhost --protocol=TCP ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)редактировать 3
та же ситуация, что и в edit 2, теперь предоставляя пароль анонимного пользователя.
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost Welcome to the MySQL monitor (...) mysql> SELECT USER(), CURRENT_USER(); +----------------+----------------+ | USER() | CURRENT_USER() | +----------------+----------------+ | bill@localhost | @localhost | +----------------+----------------+ 1 row in set (0.01 sec)вывод 1, из edit 1: можно аутентифицироваться как
'bill'@'%'
через сокет.вывод 2, из edit 2: независимо от того, подключается ли он через TCP или через сокет, это не влияет на процесс аутентификации (за исключением того, что нельзя подключиться как никто другой, кроме
'something'@'localhost'
через сокет, очевидно).вывод 3, из edit 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 -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. стол
это даст вам лучшее представление о том, как и почему вам было разрешено войти в 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, чтобы соответствовать привилегии, которые вы уже предоставили, например run
mysql -u root -p -h 192.168.1.123
или какой-либо локальный IP-адрес у вашего ящика.
Если вы забыли пароль или хотите изменить его.Вы можете выполнить следующие действия:
1: остановите mysql
[root@maomao ~] # service 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
Чтение табличной информации для завершения имен таблиц и столбцов Вы можете отключить эту функцию чтобы получить более быстрый запуск с База данных изменена5: изменить пароль ваш новый пароль должен быть введен в " ()"
в MySQL> Update пользователь Установить пароль=пароль('root123'), где пользователь root='';
Запрос ОК, 3 строки затронуты (0.00 сек)
Совпадение строк: 3 изменено: 3 предупреждения: 06: flush
mysql > flush привилегии;
7: quit
mysql > quit
Пока8: перезапустить mysql
[root@cy400 ~]# перезапуск mysqld сервиса;
Остановка 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
связанная с этим проблема в моем случае пыталась подключиться с помощью :
mysql -u mike -p mypass
пробел по-видимому, разрешено между-u #uname# но не между-p и # password#
требуется:mysql -u mike -pmypass
в противном случае с пробелом между-p mypass mysql принимает 'mypass' как db имя
избавьте себя от серьезной головной боли... Ваша проблема может заключаться в том, что вам не хватает кавычек вокруг пароля. По крайней мере, это был мой случай, который обошел меня в течение 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 "и создал пару" обычных " пользователей (aka пользователи с привилегиями только на dbs с их именем пользователя в качестве префикса), затем вышел из системы, а затем продолжил проверку первого обычного пользователя. Я не мог войти. Ни через phpMyAdmin, ни через оболочку. Оказывается, виновник - это" любой " пользователь.
супер поздно к этому
я попробовал все эти другие ответы и запустил много разных версий
mysql -u root -p
но никогда просто не бежал
mysql -u root -p
и просто нажав
[ENTER]
пароль.
как только я это сделал, это сработало. Надеюсь, это кому-то поможет.
лучшее решение я нашел для себя.
мой пользователь сонар и всякий раз, когда я пытаюсь подключиться к моей базе данных с внешней или другой машины я получаю ошибку как
ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)
также, как я пытаюсь это с другой машины и через работу Дженкинса мой 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';
хорошо, я не уверен, но, вероятно, это мой.CNF файл внутри каталога установки MySQL является виновником. Закомментируйте эту строку и проблема может быть решена.
bind-address = 127.0.0.1
это разница между:
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;
Это также происходит, когда пароль содержит некоторые специальные символы, такие как @, $и т. д. Чтобы избежать этой ситуации, вы можете обернуть пароль в одинарные кавычки:
$ 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>
просто хотел, чтобы вы знали необычных обстоятельствах я получил ту же ошибку. Возможно, это поможет кому-то в будущем.
Я разработал несколько базовых представлений, созданных на сайте разработки и передал их на производственную площадку. Позже на этой неделе я изменил PHP-скрипт, и внезапно возникли ошибки, из-за которых доступ был запрещен для пользователя "local-web-user" @ "localhost". Объект datasource не изменился, поэтому я сосредоточился на пользователе базы данных в MySQL, беспокоясь в пока кто-то взломал мой сайт. К счастью, остальная часть сайта казалась невредимой.
позже выяснилось, что взгляды на виновника(ов). Наши передачи объектов выполняются с использованием другого (и удаленного: admin@ip-адрес) пользователя, чем локальный пользователь веб-сайта. Таким образом, представления были созданы с "admin" @ "ip-адрес" в качестве определителя. Безопасность создания представления по умолчанию
SQL SECURITY DEFINER
когда локальный веб-пользователь пытается использовать представление, он натыкается на недостающие привилегии определителя используйте таблицы. После того, как безопасность была изменена на:
SQL SECURITY INVOKER
проблема была решена. Фактическая проблема была совершенно иной, чем ожидалось, основываясь на сообщении об ошибке.
Не уверен, что кто-то еще найдет это полезным, но я столкнулся с той же ошибкой и искал всех анонимных пользователей...и их не было вообще. Проблема заключалась в том, что учетная запись пользователя была установлена на "Require SSL", которую я нашел в PHPMyAdmin, перейдя в учетные записи пользователей и нажав на права редактирования для пользователя. Как только я снял этот флажок, все работало так, как ожидалось!
для меня эта проблема была вызвана новой функцией 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'@'%' имеет пустое значение плагина. Пользователь будет проигнорирован, и никто больше не сможет войти с этим пользователем.
я публикую этот ответ здесь, чтобы, возможно, спасти кого-то от использования такого же смешного количества времени, как и я.
Я надеюсь, что вы не нанесли больше вреда, также удалив пользователя debian-sys-maint в mysql
пусть ваш демон mysql работает обычным способом. Запустите клиент mysql, как показано ниже
mysql -u debian-sys-maint -p
в другой терминал,
cat
файл/etc/mysql/debian.cnf
. Этот файл содержит пароль; вставьте этот пароль при появлении запроса.
У меня была несколько похожая проблема - при моей первой попытке войти в MySql, как root, он сказал мне, что доступ запрещен. Оказывается, я забыл использовать судо...
Итак, если вы потерпите неудачу с первой попытки root, попробуйте:
sudo mysql -u root -p
а затем введите свой пароль, это должно работать.
Отладка Резюме
- проверьте наличие ошибки опечатки: имя пользователя или пароль.
- Проверьте имя хоста и сравните его с mysql.имя хоста таблицы пользователей.
- проверьте, существует пользователь или нет.
- проверьте, содержит ли хост IP-адрес или имя хоста.
существует большая вероятность того, что вы могли столкнуться с этой проблемой несколько раз в своей работе. Эта проблема возникла со мной в большинстве случаев из-за неверный ввод имени пользователя или пароля. Хотя это одна из причин, есть и другие много шансов, что вы можете получить эту проблему. Иногда, это выглядит очень похоже, но когда вы копаете глубже, вы поймете, что несколько факторов, способствующих этой ошибке. Этот пост будет подробно объяснить, большинство распространенных причин и обойти, чтобы исправить эту проблему.
возможные причины:
- Случай 1: ошибка опечатки: имя пользователя или пароль:.
это наиболее распространенная причина этой ошибки. Если вы ввели имя пользователя или пароль неправильно, наверняка вы получите эту ошибку.
устранение:
решение для этого типа ошибки очень просто. Просто введите правильный логин и пароль. Эта ошибка будет устранена. В случае если вы забыли пароль, вы можете восстановить имя пользователя/пароль. Если вы забыли пароль для администратора / root учетная запись, есть много способов сбросить / вернуть пароль root. Я опубликую еще один пост о том, как сбросить пароль root в случае, если вы забыли пароль root.
- случай 2: Доступ с неправильного хоста.
MySQL предоставляет ограничение на основе хоста для доступа пользователей в качестве функций безопасности. В нашей производственной среде мы использовали для ограничения запроса доступа только к серверам приложений. Эта функция действительно полезно во многих производственных сценариях.
устранение:
когда вы сталкиваетесь с этим типом проблемы, сначала проверьте, разрешен ли ваш хост или нет, проверив mysql.пользовательская таблица. Если он не определен, вы можете обновить или вставить новую запись в mysql.пользовательская таблица. Как правило, доступ от имени пользователя root с удаленной машины отключен, и это не лучшая практика из-за проблем безопасности. Если у вас есть требования для доступа к серверу из несколько машин, дают доступ только к этим машинам. Лучше не использовать подстановочные знаки ( % ) и дает Универсальный доступ. Позвольте мне обновить mysql.пользовательская таблица, теперь демонстратор может получить доступ к серверу MySQL с любого хоста.
- Пример 3: пользователь не существует на сервере.
этот тип ошибки возникает, когда пользователь, к которому вы пытаетесь получить доступ, не существует в MySQL сервер.
решения:
когда вы сталкиваетесь с этим типом проблемы, просто проверьте, существует ли пользователь в mysql.пользовательская таблица или нет. Если запись не существует, пользователь не может получить доступ. Если для этого пользователя требуется доступ, создайте нового пользователя с этим именем пользователя.
- случай 4: Сочетание числовых и имя хозяев.
важные моменты
Это не рекомендуется использовать подстановочные знаки при определении хоста пользователя, попробуйте использовать точное имя хоста.
отключить корневой вход с удаленного компьютера.
использовать концепцию прокси-пользователя.
есть несколько других понятий, связанных с этой темой и вдаваясь в детали этих темах очень разные рамки данной статьи. Мы рассмотрим следующие связанные темы в предстоящем статьи.
- Что делать, если вы забыли пароль root в MySQL server.
- вопросы привилегий доступа MySQL и пользователя, связанных с таблицами.
- функции безопасности MySQL с лучшими практиками.
я надеюсь, что этот пост поможет вам исправить код ошибки MySQL 1045 Доступ запрещен для пользователя в MySQL.
Я решил эту проблему, удалив старые записи пользователя багги "Билл" (это важная часть: оба из mysql. и mysql.db), затем создал тот же пользователь, что и sad раньше:
FLUSH PRIVILEGES; CREATE USER bill@localhost IDENTIFIED BY 'passpass'; grant all privileges on *.* to bill@localhost with grant option; FLUSH PRIVILEGES;
работал, пользователь подключается. Теперь я удалю некоторые previlegies из него:)
в окне, как устранить ошибку 1045( 28000): доступ запрещен для пользователя 'root'@'localhost' (с помощью пароля: нет)
1) Uninstall mysql from control panel 2)Delete MySql folder from C:\Program Files,C:\Program Files (x86) and C:\ProgramData 3)Install mysql
я столкнулся с той же ошибкой. Настройка, которая не работала, выглядит следующим образом:
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.
имена учетных записей MySQL состоят из имени пользователя и имени хоста, имя 'localhost' в имени хоста указывает на локальный хост, также вы можете использовать подстановочные знаки "%" и "_" в имени хоста или значениях IP-адреса. Они имеют то же значение, что и для операций сопоставления шаблонов, выполняемых с помощью оператора LIKE. Например, значение узла " % "соответствует любому имени узла, тогда как значение"%. mysql.com ' соответствует любому хосту в mysql.com домен. '192.168.1.% 'соответствует любому хосту в 192.168.1 сеть класса С.
выше было просто введение:
на самом деле как пользователи
'bill'@'localhost'
и'bill'@'%'
разные учетные записи MySQL, поэтому оба должны использовать свои собственные данные аутентификации, такие как пароль.дополнительную информацию см. http://dev.mysql.com/doc/refman//5.5/en/account-names.html
при выполнении
mysql -u bill -p
,localhost
разрешен на ваш ip, так как это 127.0.0.1 и в вашем/etc/hosts
файл, по умолчанию . Итак, mysql интерпретирует вас какbill@localhost
, который не получает сbill@'%'
. Вот почему есть 2 разные записи дляroot
пользователь в результатеselect host, user from mysql.user;
запрос.есть два способа решить эту проблему.
одно указание IP-адреса, который не в обратном порядке решается при попытке входа в систему. Например, ip сервера
10.0.0.2
. При выполнении командыmysql -u bill -p -h 10.0.0.2
, вы сможете войти. Если вы наберетеselect user();
, выbill@10.0.0.2
. Конечно, любое доменное имя не должно быть разрешено на этот ip в вашем .во-вторых, вам нужно предоставить доступ к этому конкретному доменному имени. Ибо
bill@localhost
, вы должны вызвать командуgrant all privileges on *.* to bill@localhost identified by 'billpass';
. В этом случае вы сможете войти в систему с помощью командыmysql -u bill -p
. После входа в систему,select user();
команда возвращаетbill@localhost
.но это только для этого вы пытаетесь войти в сервер mysql на том же хосте. От удаленных хостов mysql ведет себя ожидаемо, " % " предоставит вам вход в систему.
убедитесь, что нет других запущенных экземпляров SQL, которые используют сообщение localhost. В нашем случае другой экземпляр был запущен на локальном хосте, который конфликтовал с логином. Выключение его решило эту проблему.
также проблема может возникнуть, если вы используете старую версию пользовательского интерфейса MySQL (например, SQLYoug), который генерирует пароли с неправильным хэшем.
создание пользователя с помощью SQL-скрипта устранит проблему.
У меня была та же проблема, но в моем случае решение было решено комментарием eggyal. Я анонимный пользователь, но удаление не решит проблему. Однако команда "FLUSH PRIVILEGES" работала.
удивительной вещью для меня было то, что я создал пользователя с MySQL Workbench, и я ожидал, что он выполнит все необходимые функции для выполнения задачи.
знак процента означает, что все ip-адреса, поэтому localhost является излишним ... Нет необходимости во второй записи с localhost .
на самом деле есть, "localhost" является Специальным в mysql, это означает соединение через сокет unix (или именованные каналы на windows, я считаю) в отличие от сокета TCP/IP. использование % в качестве хоста не включает 'localhost'
учетные записи пользователей MySQL имеет два компонента: имя пользователя и имя хоста. Имя пользователя идентифицирует пользователя и хост имя указывает, с каких узлов пользователь может подключиться. Имя пользователя и имя хоста объединяются для создания учетной записи пользователя:
'<user_name>'@'<host_name>'
Вы можете указать определенный IP-адрес или диапазон адресов для имени хоста или использовать символ процента ( " % " ), чтобы позволить этому пользователю войти с любого хоста.обратите внимание, что учетные записи пользователей определяются как имя пользователя и имя хоста. Например,
'root'@'%'
это другая учетная запись пользователя, чем'root'@'localhost'
.
У меня была та же проблема, что и OP при попытке получить доступ к контейнеру MySQL docker, построенному с помощью compose, у которого был очень длинный пароль:
# docker-compose.yml snippet services: db: environment: MYSQL_ROOT_PASSWORD: some_password_more_than_32_characters
уменьшение длины пароля и перестройка через compose позволила мне получить доступ к контейнеру MYSQL с помощью клиента, такого как Workbench.
для пользователей Mac, Если у них все еще есть проблема (как и в моем случае), я обнаружил, что это решение работает для меня:Командная строка MySQL '- команда bash не найдена'
использовать команду т. е.
mysql
на терминале macbook вам нужно экспортировать путь с помощью:export PATH=$PATH:/usr/local/mysql/bin/
учитывая установку по умолчанию, используйте следующую команду, чтобы получить приглашение mysql в качестве пользователя root:
mysql -u root
В противном случае вы используете неправильный пароль root.
Ref: установка MySQL пароль пользователя root на OSX