La meg først nevne at jeg har gått gjennom mange foreslåtte spørsmål og ikke funnet noe relevant svar. Her er hva jeg gjør.
Jeg er koblet til Amazon EC2-forekomsten min. Jeg kan logge inn med MySQL root med denne kommandoen:
mysql -u root -p
Deretter opprettet jeg en ny brukerregning med vert% ...
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
Gitt alle rettighetene til brukerregning:
grant all privileges on *.* to 'bill'@'%' with grant option;
Så avslutter jeg fra root-bruker og prøver å logge inn med bill:
mysql -u bill -p
skrev inn riktig passord og fikk denne feilen:
ERROR 1045 (28000): Tilgang nektet for brukeren 'bill'@'localhost' (bruker passord: YES)
Da du løp
mysql -u bill -p
og fikk denne feilen
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
mysqld forventer at du kobler til som bill@localhost
.
Prøv å opprette bill@localhost
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
Hvis du vil koble til eksternt, må du angi enten DNS-navnet, den offentlige IP-en eller 127.0.0.1 ved hjelp 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 logget inn, kan du kjøre dette
SELECT USER(),CURRENT_USER();
USER() rapporterer hvordan du forsøkte å autentisere deg i MySQL.
CURRENT_USER() rapporterer hvordan du fikk tillatelse til å autentisere i MySQL fra tabellen mysql.user.
Dette vil gi deg en bedre oversikt over hvordan og hvorfor du fikk lov til å logge på mysql. Hvorfor er denne visningen viktig å vite? Det har å gjøre med bestillingsprotokollen for brukerautentisering.
Her er et eksempel: Jeg vil opprette en anonym bruker på skrivebordet mitt 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 meg logge inn som anonym bruker:
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>
Autentiseringsrekkefølgen er svært streng. Den sjekker fra det mest spesifikke til det minste. Jeg skrev om denne autentiseringsstilen i DBA StackExchange.
Ikke glem å eksplisitt be om TCP som protokoll for mysql-klienten når det er nødvendig.
Når du skriver mysql -u root -p
, kobler du til mysql-serveren via en lokal unix-socket.
Men tilskuddet du ga, 'bill'@'%'
samsvarer bare med TCP / IP-tilkoblinger merkelig nok.
Hvis du vil gi tilgang til den lokale unix-kontakten, må du gi privilegier til 'bill'@'localhost' , som merkelig nok ikke er det samme som 'bill'@'127.0.0.1'
Du kan også koble til ved hjelp av TCP/IP med mysql-kommandolinjeklienten, for å matche rettighetene du allerede har gitt, f.eks. kjøre mysql -u root -p -h 192.168.1.123
eller hvilken lokal IP-adresse boksen din har.