Låt mig först nämna att jag har gått igenom många föreslagna frågor och inte hittat något relevant svar. Här är vad jag gör.
Jag är ansluten till min Amazon EC2-instans. Jag kan logga in med MySQL root med det här kommandot:
mysql -u root -p
Sedan skapade jag en ny användare bill med host %
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
Beviljade användaren bill alla privilegier:
grant all privileges on *.* to 'bill'@'%' with grant option;
Sedan avslutar jag från root-användaren och försöker logga in med bill:
mysql -u bill -p
och anger det korrekta lösenordet och får det här felet:
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
När du körde
mysql -u bill -p
och fick detta fel
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
mysqld förväntar sig att du ansluter som bill@localhost
.
Försök att skapa bill@localhost
.
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
Om du vill ansluta på distans måste du ange antingen DNS-namnet, den offentliga IP-adressen eller 127.0.0.0.1 med hjälp av 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
När du har loggat in kan du köra följande
SELECT USER(),CURRENT_USER();
USER() rapporterar hur du försökte autentisera dig i MySQL.
CURRENT_USER() rapporterar hur du fick tillåtelse att autentisera dig i MySQL från tabellen mysql.user.
Detta ger dig en bättre överblick över hur och varför du fick tillåtelse att logga in i mysql. Varför är den här vyn viktig att känna till? Den har att göra med beställningsprotokollet för användarautentisering.
Här är ett exempel: Jag kommer att skapa en anonym användare på mitt skrivbord 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>
OK se mig logga in som anonym användare:
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>
Autentiseringsordningen är mycket strikt. Den kontrollerar från det mest specifika till det minst specifika. Jag skrev om denna autentiseringsstil i DBA StackExchange.
Glöm inte att uttryckligen kräva TCP som protokoll för mysql-klienten när det är nödvändigt.
När du skriver mysql -u root -p
ansluter du till mysql-servern via en lokal unix-socket.
Men det tillstånd du gav, 'bill'@'%'
, passar märkligt nog bara TCP/IP-anslutningar.
Om du vill ge tillgång till den lokala unix-sockeln måste du ge privilegier till 'bill'@'localhost' , vilket märkligt nog inte är samma sak som 'bill'@'127.0.0.1'
Du kan också ansluta via TCP/IP med kommandoradsklienten mysql, för att matcha de privilegier du redan beviljat, t.ex. kör mysql -u root -p -h 192.168.1.123
eller vilken lokal IP-adress som din box har.