Я использую учетную запись root создал учетную запись 'a'@'%'
. Но я не могу использовать эту учетную запись для подключения к серверу MySQL, когда я указываю параметр хоста. Я могу успешно подключиться без -h
параметра. Пожалуйста, смотрите стенограмму ниже. Я надеюсь, что кто-то может помочь мне объяснить это. Спасибо.
mysql> grant all on *.* to 'a'@'%' identified by a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a' at line 1
mysql> grant all on *.* to 'a'@'%' identified by 'a';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'a'@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for a@% |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'a'@'%' IDENTIFIED BY PASSWORD '*667F407DE7C6AD07358FA38DAED7828A72014B4E' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> exit
Bye
[root@localhost ~]# mysql -h localhost -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -h 127.0.0.1 -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.17 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, 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>
mysql> status
--------------
mysql Ver 14.14 Distrib 5.5.17, for Linux (x86_64) using readline 5.1
Connection id: 20
Current database:
Current user: a@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.5.17 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 15 days 15 hours 20 min 18 sec
Threads: 1 Questions: 40 Slow queries: 0 Opens: 41 Flush tables: 1 Open tables: 4 Queries per second avg: 0.000
--------------
mysql>
Редактировать:
Да, MySQL прослушивает порт 3306.
[root@localhost ~]# nmap localhost
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2012-01-18 07:35 CST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1674 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
631/tcp open ipp
840/tcp open unknown
3306/tcp open mysql
Nmap finished: 1 IP address (1 host up) scanned in 0.064 seconds
[root@localhost ~]#
mysql
authentication
Просто ученик
источник
источник
'a'@'%'
. Итак, первая запись была'a'@'%'
, а вторая есть'a'@'localhost'
.Ответы:
Вот быстрый и грязный метод для проверки того, как MySQL выполняет успешную аутентификацию.
Пожалуйста, запустите этот запрос:
USER () сообщает, как вы пытались пройти аутентификацию в mysqld
CURRENT_USER () сообщает, как вам разрешили пройти аутентификацию в mysqld
Иногда
USER()
иCURRENT_USER()
бывают разные. Это потому, что аутентификация mysql следует специальному протоколу.Согласно справочному руководству по сертификации MySQL 5.0
на страницах 486,487 говорится об алгоритме аутентификации mysql:
Из этого описания вам не нужно беспокоиться о порядке таблиц mysql.user, поскольку в памяти есть копия таблиц предоставления, которая отсортирована, как упоминалось ранее.
Что касается того, как вы вошли в систему, только
mysql -u a
работал. Вернитесь и войдите снова и выполните эти командыУбедитесь что
Это всего лишь предположение, но я подозреваю, что
mysql -u a
соединение через localhost происходит, потому что, если протокол соединения не указан, по умолчанию используется соединение через файл сокета. Может существовать записьmysql.user
, разрешающая анонимное локальное соединение.Запустите этот запрос:
Если вы получите строку без пароля, это полностью объясняет, почему
mysq -u a
работает.ОБНОВЛЕНИЕ 2012-01-19 11:12 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Крейг Эфрейн поднял интересный вопрос: если в таблице mysql.user существуют два одинаковых имени пользователя, одно с паролем, а другое без него, означает ли это, что MySQL запрещает аутентификацию, когда не используется пароль?
Этот вопрос отлично подходит для аутентификации пользователей MySQL.
Обратите внимание, что первичным ключом mysql.user является host, user. Других индексов нет. Это позволяет несколько раз использовать имя пользователя. В каждом случае может быть свой пароль или пароль отсутствует. Это позволяет пользователю 'dbuser' локально входить в систему (dbuser @ localhost), не используя пароль, и входу того же пользователя с другого сервера в пределах данного сетевого блока (dbuser@'10.1.2.20 ') с паролем, подобным' pass1 ', и тому пользователю для входа в систему. удаленно из любого места (dbuser @ '%') с помощью удаленного пароля, например, «pass2».
Учитывая алгоритм аутентификации, который использует MySQL, нет никаких ограничений, накладываемых на пользователей с наличием или отсутствием пароля.
Вот почему в « Руководстве по изучению сертификации MySQL 5.0» на странице 6 параграфа 6 указывается, как очистить процесс аутентификации:
источник
Подстановочный знак хоста "%" не соответствует "localhost". По умолчанию клиент mysql будет пытаться подключиться через сокет, а не через tcp (обычно в каком-то месте, например /var/lib/mysql/mysql.sock).
Вы можете либо изменить свой грант на 'a' @ 'localhost', либо заставить клиента работать над стеком TCP, например:
источник
my.cnf
чтобы больше не нуждаться в этом параметре?Вы проверили, чтобы убедиться, что MySQL действительно прослушивает 3306? Запустите netstat -tlpn и предоставьте результаты. Если вы не видите 3306, то, вероятно, нет.
В my.cnf вы должны убедиться, что --skip-network закомментировано
источник
Как описано в @atxdba, чтобы подключить демон mysql с удаленного компьютера, который не подключен через сокет, вам необходимо подключиться с удаленного компьютера через TCP.
Для этого вы должны указать для
--protocol=TCP
каждого соединения. Хотя вы можете установить егоmy.cnf
на сервере:источник