Spojrzałem na wiele podobnych pytań, więc pokazuję, że sprawdziłem podstawy. Chociaż oczywiście nie oznacza to, że nie przegapiłem czegoś całkowicie oczywistego. :-)
Moje pytanie brzmi: dlaczego odmówiono mi dostępu użytkownikowi z uprawnieniami do tego, co próbuję zrobić i gdzie już wpisałem hasło i uzyskałem dostęp? (Ze względu na kompletność próbowałem wpisać nieprawidłowe hasło, aby upewnić się, że klient MySQL odmówi mi dostępu przy uruchomieniu programu).
Tło:
Zalogowany do powłoki maszyny z serwerem MySQL przez ssh, loguję się jako root:
[myname@host ~]$ mysql -u root -p -hlocalhost
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Niesamowite. Czytanie odpowiedzi na podobne pytania sugeruje, że powinienem upewnić się, że uprawnienia są aktualne z tym, co znajduje się w tabelach dotacji
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql>
Następnie upewnij się, że jestem tym, kim myślę, że jestem:
mysql> SELECT user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
... i naprawdę naprawdę upewnić się:
mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql>
Na razie w porządku. Jakie mam przywileje?
mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
To trochę trudne do odczytania, więc spróbujmy w ten sposób (zobaczysz również, że istnieje użytkownik `` root '' niebędący lokalnym hostem):
mysql> SELECT * FROM mysql.user WHERE User='root'\G
*************************** 1. row ***************************
Host: localhost
User: root
Password: *[OBSCURED]
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
*************************** 2. row ***************************
Host: [HOSTNAME].com
User: root
Password: *[OBSCURED]
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
2 rows in set (0.00 sec)
Niesamowite! MySQL myśli, że jestem root @ localhost, a root @ localhost ma wszystkie te przywileje. Oznacza to, że powinienem móc robić, co chcę, prawda?
mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Jak mogłem schrzanić coś tak podstawowego?
Nota boczna: dla każdego, kto chce zasugerować, że nie mam użytkownika o nazwie root ze wszystkimi uprawnieniami, to świetnie i rozważę zrobienie czegoś, gdy będę mógł nadać innemu użytkownikowi pewne uprawnienia.
Dziękuję Ci!
źródło
-p
hasłem a hasłem. Wiem, że to głupie, ale może komuś pomóc.Odpowiedzi:
Zwróć uwagę, jak wynik
nie powiedział „WSZYSTKIE PRZYWILEJE”, ale musiał przeliterować, co ma root @ localhost.
PRZYZNANIE WSZYSTKICH PRZYWILEJÓW nie powiedzie się, ponieważ użytkownik nie może przyznać tego, czego nie ma, a serwer wydaje się myśleć, że czegoś tu nie ma ...
Czego w takim razie brakuje?
W moim systemie otrzymuję to:
W 5.5 są też nowe tabele, takie jak mysql.proxies_user: upewnij się, że je masz.
Podczas instalowania zupełnie nowej instancji serwera mysql, skrypt instalacyjny utworzy wszystkie tabele mysql. * Z odpowiednią strukturą.
Podczas aktualizacji ze starej wersji upewnij się, że została użyta odpowiednia procedura aktualizacji (mysql_upgrade), która doda brakujące tabele / kolumny.
To tylko przypuszczenie, ale wydaje się, że mysql_upgrade nie został wykonany dla tej instancji, powodując zaobserwowane zachowanie.
źródło
Miałem z tym ten sam problem, ale w systemie Windows po aktualizacji do MySQL 5.5 z MySQL 5.1. Próbowałem już zmienić, utworzyć i zresetować hasło wspomniane tutaj , tutaj , tutaj i tutaj , bez pojęcia. Nadal pojawia się ten sam błąd:
Mogę łączyć się normalnie, wyświetlać wszystkie bazy danych, wybierać i wstawiać, tworzyć i dodawać użytkowników, ale jeśli chodzi o GRANT, to mam schrzaniony. Ten błąd odmowy dostępu pojawia się ponownie.
Udało mi się rozwiązać ten problem, naprawiając uprawnienia za pomocą następującego polecenia w katalogu bin / katalogu serwera MySQL, jak wspomniano tutaj :
Wtedy problem zniknął. Mam nadzieję, że to rozwiązanie działa również w systemie Linux, ponieważ zwykle MySQL zapewnia to samo polecenie zarówno w systemie Linux, jak i Windows.
źródło
cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
/usr/bin/mysql_upgrade -u root -p
wprowadź hasło i Twój wujek Boba!mysqldump ... --all-databases
a następnie zaimportowałeś je do MySQL> = 5.5, twoi użytkownicy zostaną zastąpieni (oczywiście), ale twójroot
będzie miał ten sam problem co OP. Imysql_upgrade
nie zadziała - musisz dodać--force
flagę, tjmysql_upgrade -u root -p --force
. Mam nadzieję, że to pomoże komuś tutaj.Może się to zdarzyć, gdy spróbujesz nadać wszystkie uprawnienia do wszystkich tabel innemu użytkownikowi, ponieważ tabela mysql.users jest uważana za niedostępną dla użytkownika innego niż root.
Poniższe jednak powinny działać:
Zauważ, że używamy `%`. * Zamiast *. *
źródło
'%'.*
działa, ale nie*.*
?'%'.*
zamiast`%`.*
nie działa. Państwo musi użyć`%`.*
Zdarzyło mi się to, gdy próbowałem zainstalować wyższą wersję MySQL niż ta dostarczana z dystrybucją.
Usunąłem starą wersję, a następnie zainstalowałem nową (rpm -e ... następnie rpm -i MySQL-server *) Ale nie zdawałem sobie sprawy, że pliki w / var / lib / mysql nadal pochodzą ze starszej wersji (z różnicami jak wyjaśnił Marc Alff - dzięki!)
Mogłem zrobić mysql_upgrade, ale ponieważ chciałem zacząć od zera, zrobiłem:
Następnie ustaw hasło roota (/ usr / bin / mysqladmin -u hasło root) i wszystko działało zgodnie z oczekiwaniami z poleceniami GRANT ...
źródło
Zasadniczo ten błąd pojawia się, gdy nie podałeś hasła, oznacza to, że masz niepoprawne hasło wymienione w jakimś pliku opcji.
Przeczytaj ten DOC, aby dowiedzieć się, jak przypisywać hasła do kont i zarządzać nimi.
Sprawdź także, czy uprawnienie do folderu
/var/lib/mysql/mysql
to 711, czy nie.źródło
Miałem ten sam problem czyli wszystkie uprawnienia nadane rootowi:
... ale nadal nie można utworzyć tabeli:
Cóż, przyczyną był irytujący błąd użytkownika, tj. Nie wybrałem bazy danych. Po wydaniu USE dbname działało dobrze.
źródło
Na Debianie ( wheezy , 7,8) z MySQL 5.5.40, znalazłem
SELECT * FROM mysql.user WHERE User='root'\G
wykazała, żeEvent_priv
i „Pola Trigger_priv` były obecne, ale nie ustawiony na Y.Bieganie
mysql_upgrade
(z lub bez--force
) nie robiło różnicy; Musiałem zrobić instrukcję:update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'
W końcu mogłem użyć:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION
… A następnie używaj go dokładniej na indywidualnej bazie danych / koncie użytkownika.
źródło
Być może przyszedłeś do tego pytania z zainstalowanym MySQL w wersji 8 (tak jak ja) i nie znalazłeś satysfakcjonującej odpowiedzi. W wersji 8 nie można już tworzyć takich użytkowników:
Dość mylący komunikat o błędzie, który otrzymujesz, to:
ERROR 1410 (42000): You are not allowed to create a user with GRANT
Aby stworzyć użytkowników w wersji 8 musisz to zrobić w dwóch krokach:
Oczywiście, jeśli wolisz, możesz również podać ograniczoną liczbę uprawnień (zamiast
GRANT ALL PRIVILEGES
), npGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER
źródło
Wpisywanie
SHOW GRANTS FOR 'root'@'localhost';
pokazało mi jakieś niejasne hasło, więc zalogowałem się do mysql tego systemu używając HeidiSQL na innym systemie (używającroot
jako nazwy użytkownika i odpowiedniego hasła) i wpisałemGRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;
i zadziałało, kiedy wróciłem do systemu i zalogowałem się przy użyciu
mysql -uroot -pthepassword;
źródło
Uruchomiłem na tym, gdy próbowałem dodać uprawnienia do performance_schema, czyli błędu mysql http://bugs.mysql.com/bug.php?id=44898 (obejście dodania --single-transaction).
źródło
Miałem ten sam problem i zajęło mi to dużo czytania postów SO i dokumentacji Google. W końcu znalazłem to w FAQ Cloud SQL :
źródło
Dla tych, którzy nadal natkną się na to, tak jak ja, warto sprawdzić, czy próba
GRANT
nie istnieje:W moim przypadku błąd nie wynikał z faktu, że wystąpił błąd uprawnień, ale dlatego, że
GRANT
już istniał.źródło
Jedno proste rozwiązanie, które zawsze działa w przypadku błędów mysql „odmowa dostępu”: użyj
sudo
.Wtedy istnieją niezbędne uprawnienia dla
GRANT
poleceń.źródło