Odmowa dostępu dla użytkownika „root” @ „%”

29

Zwykle uzyskiwałem dostęp do użytkownika root w MySQL. Ale ostatnio nie jestem już w stanie.

Jestem w stanie zalogować się dobrze:

 mysql -u root -p

Oto status mysql po zalogowaniu:

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (i686) using readline 6.2

Connection id:      37
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.28-0ubuntu0.12.04.3 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         4 min 16 sec

Threads: 1  Questions: 112  Slow queries: 0  Opens: 191  
Flush tables: 1  Open tables:  6  Queries per second avg: 0.437
--------------

Ale kiedy chcę wykonać dowolne działanie, takie jak:

mysql> CREATE DATABASE moyennegenerale;
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'moyennegenerale'

Rozumiem, że %jest używany do oznaczenia dowolnego hosta, ale mój status wyraźnie wskazuje localhost. Czy ktoś ma pojęcie o tym, co się dzieje?

RolandoMySQLDBA
źródło

Odpowiedzi:

17

Myślę, że masz anonimowych użytkowników

Spróbuj uruchomić to:

SELECT user,host,password FROM mysql.user WHERE user='';

To pokaże, którzy anonimowi użytkownicy istnieją. Najprawdopodobniej zobaczysz wiersz z pustym użytkownikiem, hostem %i pustym hasłem, jak pokazano poniżej:

mysql> select user,host,password from mysql.user;
+-----------+-------------+-------------------------------------------+
| user      | host        | password                                  |
+-----------+-------------+-------------------------------------------+
| lwdba     | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | %           | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| vanilla   | localhost   |                                           |
| mywife    | %           |                                           |
|           | %           |                                           | <<<--- LOOK !!!
| replicant | 10.64.113.% | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| kumar     | %           |                                           |
+-----------+-------------+-------------------------------------------+

Jak się zalogowałeś? Uruchom to zapytanie:

SELECT USER(),CURRENT_USER();

Co ci to mówi?

  • USER () informuje o próbie uwierzytelnienia w MySQL
  • CURRENT_USER () informuje o tym, w jaki sposób możesz uwierzytelnić się w MySQL

Druga funkcja CURRENT_USER()pokazuje, w jaki sposób anonimowy użytkownik został użyty do zalogowania.

Jakie uprawnienia posiadałeś po zalogowaniu?

Proszę biegnij

SHOW GRANTS;

Ujawni to, jakie uprawnienia posiadałeś podczas logowania. Fakt, że nie możesz utworzyć bazy danych, pokazuje, że nie byłeś rootem, ale jakimś uprzywilejowanym użytkownikiem.

Wyczyść swoje granty użytkownika.

Jeśli chodzi o resetowanie hasła roota, wykonaj następujące czynności:

echo "SET PASSWORD FOR root@localhost=PASSWORD('password');" > /var/lib/mysql/rootpwd.sql
service mysql restart
rm -f /var/lib/mysql/rootpwd.sql

Nauczyłem się tej wydajnej metody od @ShlomiNoach .

Spróbuj !!!

RolandoMySQLDBA
źródło
10

Wiem, co zrobiłeś.

Zrób to:

SELECT `User`, `Grant_priv` FROM `mysql`.`user` WHERE `User` = 'root';

Prawdopodobnie zauważysz, że zwraca „N” dla Grant_priv. Więc zrób to:

UPDATE `mysql`.`user` SET `Grant_priv` = 'Y' WHERE `User` = 'root';
FLUSH PRIVILEGES;
SELECT `User`, `Grant_priv` FROM `mysql`.`user`;

I walla! Mam nadzieję, że to pomaga.

Kevin na Florydzie
źródło
Ponadto, ze względów bezpieczeństwa, zawsze powinieneś usunąć użytkownika root po utworzeniu nowego dba. Upewnij się, że są to GRANT WSZYSTKIE UPRAWNIENIA, a na koniec Z OPCJĄ GRANT .. ten bit jest ważny.
Kevin Florida
To, w połączeniu z zamknięciem i ponownym otwarciem połączenia (w moim przypadku z HeidiSQL) załatwiło sprawę!
xorinzor,
4

Po wprowadzeniu jako rootużytkownik sprawdź swoje uprawnienia:

 mysql> show grants for 'root'@'localhost';

Po sprawdzeniu swoich uprawnień możesz spróbować nadać innemu użytkownikowi wszystkie uprawnienia lub możesz spróbować ponownie nadać mu rootwszystkie uprawnienia:

 mysql> grant all privileges on *.* to 'root'@'localhost';

Jeżeli twój root użytkownik nie ma uprawnień, możesz spróbować je przywrócić, więc:

Zatrzymaj mysqld serwer

Zrestartuj serwer w ten sposób mysqld_safe --skip-grant-table

Przywróć rootuprawnienia za pomocą:

 mysql> flush privileges;
 mysql> grant all privileges on *.* to 'root'@'localhost' with grant option;
Atropo
źródło
Oto, co otrzymuję po przyznaniu programu dla komendy „root” @ „localhost”: ERROR 1141 (42000): Nie zdefiniowano takiego grantu dla użytkownika „root” na hoście „localhost”
Jaki jest wynik drugiego polecenia?
2
Istnieje „lepszy” sposób, aby to zrobić w Debianie, gdzie nie trzeba restartować serwera. Podobnie jak rootpodłączyć, jak debian-sys-maint@localhosti używać hasło /etc/mysql/debian.cnf. Ten użytkownik ma WSZYSTKIE uprawnienia w MySQL. Dobrą rzeczą jest to, że nie trzeba ponownie uruchamiać serwera.
Anders
Spróbuj tego. sudo mysql --defaults-file = / etc / mysql / debian.cnf
Anders
0

Twoje uprawnienia mogą zostać zmniejszone?

Możesz także spróbować utworzyć kolejne konto z uprawnieniami administratora.

I usuń użytkownika root i ponownie utwórz z określonymi uprawnieniami.

Może to być pomocne: http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

C.5.4.1.2 - LINUX (Utwórz plik z zapytaniem, kto tworzy, nowy użytkownik z pełnymi uprawnieniami roota)

C.5.4.1.1 - Windows (Utwórz plik z zapytaniem, kto tworzy, nowy użytkownik z pełnymi uprawnieniami roota)

Zapytanie: (Utwórz użytkownika root)

  CREATE USER 'new_root'@'%' IDENTIFIED BY '***';
  GRANT ALL PRIVILEGES ON *.* TO 'new_root'@'%' IDENTIFIED BY '***' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

Podręcznik MySQL Utwórz użytkownika: http://dev.mysql.com/doc/refman/5.5/en/adding-users.html

David Metcalfe
źródło