Jak nadać wszystkie uprawnienia użytkownikowi root w MySQL 8.0


116

Wypróbowany

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

Dostać

BŁĄD 1064 (42000): Wystąpił błąd w składni SQL; sprawdź podręcznik, który odpowiada twojej wersji serwera MySQL, aby znaleźć właściwą składnię, której należy użyć w pobliżu „IDENTIFIED BY„ root ”WITH GRANT OPTION” w wierszu 1.

Uwaga: to samo działa, gdy próbowano w poprzednich wersjach.

Próbowałem też

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Dostać

BŁĄD 1410 (42000): Nie możesz utworzyć użytkownika za pomocą GRANT

MySQL (8.0.11.0) nazwa użytkownika / hasło to root / root.


łączysz się bezpośrednio z mysql czy używasz ssh?
Harald

bezpośrednio z wiersza poleceń jako użytkownik root
Praveen


7
Jestem zbyt skazany na ten sam problem. Uruchamiam powłokę mysql za pomocą mysql -u root -p, a następnie wpisuję hasło roota. Potem spróbowałem GRANT GRANT OPTION ON *.* TO 'root'@'%';i otrzymałem błądERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman

Odpowiedzi:


203

Począwszy od MySQL 8 nie można już (niejawnie) tworzyć użytkownika za pomocą GRANTpolecenia. Zamiast tego użyj polecenia CREATE USER , a następnie instrukcji GRANT :

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Przestroga dotycząca zagrożeń bezpieczeństwa dotyczących WITH GRANT OPTION, zobacz:


3
To polecenie utworzy nowego użytkownika. Ale chcę przyznać uprawnienia istniejącemu użytkownikowi root. mysql> UTWÓRZ UŻYTKOWNIKA 'root' @ '%' IDENTIFIED BY 'root'; Zapytanie OK, dotyczy 0 wierszy (0,31 s) mysql> PRZYZNAJ WSZYSTKIE PRZYWILEJE WŁĄCZONE . DO 'root' @ '%' Z OPCJĄ GRANT; Zapytanie OK, dotyczy 0 wierszy (0,16 s) mysql> WYBIERZ użytkownika z mysql.user; + ------------------ + | Użytkownik | + ------------------ + | root | | mysql.infoschema | | mysql.session | | mysql.sys | | root | + ------------------ + 5 rzędów w zestawie (0,00 s)
Praveen

Teraz dwóch użytkowników z nazwą root jest obecnych w tabeli użytkowników !! Nie mogę też połączyć się zdalnie (użytkownik root). ------------- Szczegóły: Wpisz: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException Stan SQL: 08001
Praveen

Dziwne. Komunikat o błędzie w Twoim pytaniu wskazuje, że ten użytkownik nie istnieje. To jedyny powód, dla którego zasugerowałem, aby go najpierw utworzyć. Nie można mieć tego samego użytkownika dwa razy w jednej instancji MySQL. Różnią się nazwą lub częścią hosta.
Mike Lischke

2
Tych 2 użytkowników łączy się z różnych hostów. SELECT User, Host FROM mysql.user;Zamiast tego biegnij .
Mike Lischke

3
Mam ten błąd:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi

32

1) To zadziałało dla mnie. Najpierw utwórz nowego użytkownika. Przykład: użytkownik fooz hasłembar

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';

2) Zamień poniższy kod na nazwę użytkownika z „foo”.

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';

Uwaga: database_name jest baza danych, które chcesz mieć przywileje . znaczy wszystko na wszystko

3) Zaloguj się jako użytkownik foo

mysql> mysql -u foo -p

Hasło: bar

4) Upewnij się, że twoje początkowe połączenie z Sequelize jest ustawione na foo z pw bar.


5
To zdecydowanie nie daje odpowiedzi na pytanie. Chodzi o uprawnienia globalne, a nie uprawnienia specyficzne dla bazy danych.
tmuecksch

30

Widzę wiele (błędnych) odpowiedzi, jest to tak proste, jak to:

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

Uwaga: zamiast samodzielnie utworzonego user, możesz użyć rootdo połączenia się z bazą danych. Jednak użycie domyślnego konta głównego, aby umożliwić aplikacji połączenie się z bazą danych, nie jest preferowanym sposobem.

Alternatywne przywileje (bądź ostrożny i pamiętaj o zasadzie najmniejszego uprzywilejowania):

-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';

-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';

-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';

Jeśli w jakiś sposób napotkasz następujący błąd:

BŁĄD 1130 (HY000): Host „1.2.3.4” nie może połączyć się z tym serwerem MySQL

Musisz dodać / zmienić następujące dwie linie /etc/mysql/my.cnfi ponownie uruchomić mysql:

bind-address           = 0.0.0.0
skip-networking

Czy mógłbyś wyjaśnić, dlaczego to nie działa, zamiast tylko narzekać? W ten sposób mogę Ci pomóc lub zamieścić dodatkowe informacje.
Nebulastic

Ta odpowiedź nawet w pewnym sensie nie rozwiązuje kwestii uprawnień użytkownika root .
Józef

Odpowiednio zaktualizowałem odpowiedź.
Nebulastic

1
Najlepsza odpowiedź, teraz jest GRANT ALL ONdla MySQL 8.0. Uważam również, że zamiast wyłączać bind-address, możesz łączyć się 127.0.0.1i dołączać --protocol=tcpdo dowolnych poleceń. Wydajność długoterminowa jest również lepsza niż w przypadku localhost.
Jesse Nickles

4

Moje specyfikacje:

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

Co mi pomogło:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;

Odpowiedź w obu zapytaniach:

Query OK, O rows affected (0.10 sec*)

NB: Utworzyłem bazę danych (nazwa_db) wcześniej i tworzyłem poświadczenie użytkownika ze wszystkimi uprawnieniami nadanymi wszystkim tabelom w DB, zamiast korzystania z domyślnego użytkownika root, którego gdzieś przeczytałem, jest najlepszą praktyką.


3

Podany użytkownik po prostu nie istnieje w Twoim MySQL (więc MySQL próbuje go utworzyć za pomocą GRANT, tak jak przed wersją 8, ale nie udaje mu się to z ograniczeniami wprowadzonymi w tej wersji).

MySQL jest w tym momencie dość głupi, więc jeśli masz 'root' @ 'localhost' i próbujesz nadać uprawnienia 'root' @ '%', traktuje ich jako różnych użytkowników, a nie uogólnione pojęcie użytkownika root na dowolnym hoście, w tym Lokalny Gospodarz.

Komunikat o błędzie jest również mylący.

Jeśli więc otrzymujesz komunikat o błędzie, sprawdź istniejących użytkowników za pomocą czegoś takiego

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

a następnie utwórz brakującego użytkownika (zgodnie z zaleceniami Mike'a) lub dostosuj polecenie GRANT do faktycznej specyfikacji istniejącego użytkownika.


To było dla mnie ważne rozwiązanie! Po prostu nie udało mi się precyzyjnie wpisać user @ line. Sprawdź to przed wypróbowaniem innych sugerowanych rozwiązań. Dla mnie było to: CREATE USER 'user'@'%domain.com', a kiedy wydałem niezgodną instrukcję GRANT, moja składnia była przesunięta o jeden '.'. Wyglądało na to, że GRANT .... TO „user ”@ ”%.domain.com”. Zapomniałem wstawić „.” w moim oświadczeniu o stworzeniu i to wszystko zmieniło w rozwiązaniu tego problemu.
wallisds

2

Tylko moje 2 centy na ten temat. Miałem dokładnie ten sam problem przy próbie połączenia z MySQL Workbench. Używam maszyny wirtualnej bitnami-mysql, aby skonfigurować lokalną piaskownicę do programowania.

Samouczek Bitnami mówi, że uruchamia polecenie `` Przyznaj wszystkie uprawnienia '':

/opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option";

To najwyraźniej nie działało, w końcu udało mi się to, używając odpowiedzi Mike'a Lischke.

Wydaje mi się, że stało się tak, że użytkownik root @% miał z nim złe poświadczenia. Więc jeśli próbowałeś zmodyfikować uprawnienia użytkownika i bez powodzenia spróbuj:

  1. Upuszczenie użytkownika.
  2. Utwórz użytkownika ponownie.
  3. Upewnij się, że masz poprawne powiązanie w pliku konfiguracyjnym my.cnf. W moim przypadku skomentowałem linię, ponieważ jest ona przeznaczona tylko dla środowiska piaskownicy.

Z konsoli MySQL:

Lista użytkowników (pomocna przy wyświetlaniu wszystkich użytkowników):

select user, host from mysql.user;

Porzuć pożądanego użytkownika:

drop user '{{ username }}'@'%';

Utwórz użytkownika i nadaj uprawnienia:

CREATE USER '{{ username }}'@'%' IDENTIFIED BY '{{ password }}';
GRANT ALL PRIVILEGES ON *.* TO '{{ username }}'@'%' WITH GRANT OPTION;

Uruchom to polecenie:

FLUSH PRIVILEGES;

Znajdź swój plik konfiguracyjny mysql „my.cnf” i poszukaj linii, która wygląda następująco:

bind-address=127.0.0.1

i skomentuj go za pomocą „#”:

#bind-address=127.0.0.1

Następnie uruchom ponownie usługę mysql.

Mam nadzieję, że pomoże to komuś, kto ma ten sam problem!


1

To zadziałało dla mnie:

mysql> FLUSH PRIVILEGES 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES

1

Sprawdź, czy Twoja nazwa użytkownika i domena są takie same, jak utworzone wcześniej. MySQL wybierz konto za pomocą dwóch kolumn w tabeli użytkowników. Jeśli jest inaczej, mysql może pomyśleć, że chcesz utworzyć nowe konto przez grant, które nie jest obsługiwane po wersji 8.0.


1

Moje specyfikacje:

mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

Co mi pomogło:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';

Chociaż zadziałałoby to w twojej konkretnej sytuacji. Ta część składni sql aktualizuje użytkownika i nie ustawia konta użytkownika. Nie daje też przywilejów.
Nebulastic

0

Cóż, właśnie miałem ten sam problem. Nawet gdyby trasa miała „%”, nie mogła połączyć się zdalnie. Teraz, patrząc na my.iniplik (plik konfiguracyjny w systemie Windows), bind-addressinstrukcja została pominięta.

Więc ... położyłem to bind-address = *później [mysqld]i ponownie uruchomiłem usługę. Teraz działa!


W rzeczywistości jest to najbliższa poprawnej odpowiedzi.
Józef

0

1. nadaj uprawnienia

mysql> PRZYZNAJ WSZYSTKIE PRZYWILEJE NA. DO 'root' @ '%' Z OPCJĄ GRANT;

mysql> UPRAWNIENIA FLUSH

2. sprawdź tabelę użytkowników:

mysql> użyj mysql

mysql> wybierz hosta, użytkownika z użytkownika wprowadź opis obrazu tutaj

3. Zmodyfikuj plik konfiguracyjny

mysql default bind ip : 127.0.0.1, jeśli chcemy zdalnie korzystać z usług, po prostu usuń config

#Modify the configuration file
vi /usr/local/etc/my.cnf

#Comment out the ip-address option
[mysqld]
# Only allow connections from localhost
#bind-address = 127.0.0.1

4. na koniec uruchom ponownie usługi

usługi brew zrestartuj mysql


Chociaż to zadziała, nigdy nie uruchomiłbym ponownie instancji mysql w środowisku produkcyjnym podczas przyznawania pewnych uprawnień. Zamiast tego spróbuj wyrzucić uprawnienia.
Nebulastic

-1

To może zadziałać:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';

1
Zamiast wyrzucać kod, wyjaśnij również, dlaczego jest to właściwe rozwiązanie. Celem jest edukacja, aby OP wiedział, co robić następnym razem, a nie tylko rozwiązywanie bezpośredniego problemu.
Tin Man

-1

Miałem ten sam problem, który doprowadził mnie tutaj. W szczególności, jeśli chodzi o rozwój lokalny, chciałem móc się mysql -u root -pbez niego obejść sudo. Nie chcę tworzyć nowego użytkownika. Chcę używać rootz lokalnej aplikacji internetowej PHP.

Komunikat o błędzie jest mylący, ponieważ nie było nic złego w domyślnych 'root'@'%'uprawnieniach użytkownika.

Zamiast tego, jak kilka osób wspomniało w innych odpowiedziach, rozwiązaniem było po prostu ustawienie bind-address=0.0.0.0zamiast bind-address=127.0.0.1w mojej /etc/mysql/mysql.conf.d/mysqld.cnfkonfiguracji. Żadne zmiany nie były wymagane.


To nawet nie daje pełnej odpowiedzi na pytanie.
Nebulastic

-2

Miałem ten sam problem na CentOS i to działało dla mnie (wersja: 8.0.11):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'

BŁĄD 1064 (42000): Wystąpił błąd w składni SQL; sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby uzyskać właściwą składnię, której należy użyć w pobliżu '. TO 'root' @ '%' 'w linii 1
GDefender,

mysql> PRZYZNAJ WSZYSTKIE PRZYWILEJE NA. Zapuszczać korzenie'@'%'; BŁĄD 1064 (42000): Wystąpił błąd w składni SQL; sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby uzyskać właściwą składnię, której należy użyć w pobliżu '. DO 'root' @ '%' 'w linii 1 mysql>
PGOEL
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.