Come concedere tutti i privilegi all'utente root in MySQL 8.0


112

Provato

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

Ottenere

ERRORE 1064 (42000): hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'IDENTIFICATO DA' root 'CON GRANT OPTION' alla riga 1.

Nota: lo stesso funziona se provato nelle versioni precedenti.

Anche provato

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

Ottenere

ERRORE 1410 (42000): non è consentito creare un utente con GRANT

Il nome utente / password di MySQL (8.0.11.0) è root / root.


ti connetti direttamente con mysql o usi ssh?
Harald

direttamente dal prompt dei comandi come utente root
Praveen

1
Vedere le differenze tra 13.7.1.6 GRANT Syntax e 13.7.1.4 GRANT Syntax .
wchiquito

7
Sono troppo bloccato con lo stesso problema. Sto avviando la shell mysql usando mysql -u root -p, quindi inserendo la password di root. Poi ho provato GRANT GRANT OPTION ON *.* TO 'root'@'%';e ottengo l'erroreERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman

Risposte:


199

A partire da MySQL 8 non è più possibile (implicitamente) creare un utente utilizzando il GRANTcomando. Utilizza invece CREATE USER , seguito dall'istruzione GRANT :

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

Attenzione sui rischi per la sicurezza in merito WITH GRANT OPTION, vedere:


3
Questo comando creerà un nuovo utente. Ma voglio concedere i privilegi all'utente root esistente. mysql> CREA UTENTE 'root' @ '%' IDENTIFICATO DA 'root'; Query OK, 0 righe interessate (0,31 sec) mysql> GARANTISCE TUTTI I PRIVILEGI . A 'root' @ '%' CON OPZIONE DI GRANT; Interrogazione OK, 0 righe interessate (0,16 sec) mysql> SELEZIONA Utente DA mysql.user; + ------------------ + | Utente | + ------------------ + | radice | | mysql.infoschema | | mysql.session | | mysql.sys | | radice | + ------------------ + 5 righe nel set (0.00 sec)
Praveen

Ora due utenti con nome root sono presenti nella tabella utenti !! Inoltre non sono in grado di connettermi da remoto (utente root). ------------- Dettagli: Tipo: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException Stato SQL: 08001
Praveen

Strano. Il messaggio di errore nella tua domanda indica che questo utente non esiste. Questo è l'unico motivo per cui ho suggerito di crearlo prima. Ed è impossibile avere lo stesso utente due volte in una singola istanza MySQL. Differiscono nel nome o nella parte ospitante.
Mike Lischke

2
Questi 2 utenti si connettono da host diversi. Corri SELECT User, Host FROM mysql.user;invece.
Mike Lischke

3
Ho ricevuto quell'errore:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi

31

1) Questo ha funzionato per me. Innanzitutto, crea un nuovo utente. Esempio: utente foocon passwordbar

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

2) Sostituisci il codice seguente con un nome utente con "pippo".

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

Nota: database_name è il database che si desidera avere privilegi, . significa tutto sommato

3) Accedi come utente foo

mysql> mysql -u foo -p

Password: bar

4) Assicurati che la tua connessione iniziale da Sequelize sia impostata su foo con pw bar.


5
Questo di gran lunga non risponde alla domanda. Si tratta di autorizzazioni globali e non di autorizzazioni specifiche del database.
tmuecksch

29

Vedo molte risposte (sbagliate), è proprio così semplice:

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

Nota: invece di un auto-creato userpuoi usareroot per connettersi al database. Tuttavia, l'utilizzo dell'account root predefinito per consentire a un'applicazione di connettersi al database non è il modo preferito.

Privilegi alternativi (fai attenzione e ricorda il principio del privilegio minimo):

-- 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'@'*';

Se in qualche modo dovessi incorrere nel seguente errore:

ERRORE 1130 (HY000): all'host "1.2.3.4" non è consentito connettersi a questo server MySQL

È necessario aggiungere / modificare le seguenti due righe /etc/mysql/my.cnfe riavviare mysql:

bind-address           = 0.0.0.0
skip-networking

Potresti approfondire il motivo per cui non funziona invece di lamentarti? In questo modo posso aiutarti o pubblicare ulteriori informazioni.
Nebulastic

Questa risposta non affronta nemmeno la questione dei privilegi dell'utente root .
Joseph 8

Aggiornata la risposta di conseguenza.
Nebulastic

1
Migliore risposta, ora è GRANT ALL ONper MySQL 8.0. Inoltre credo che invece di disabilitare bind-addresspuoi associare 127.0.0.1e includere --protocol=tcpin qualsiasi comando. Anche le prestazioni a lungo termine sono migliori rispetto a localhost.
Jesse Nickles

3

Le mie specifiche:

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

Cosa ha funzionato per me:

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

Risposta in entrambe le domande:

Query OK, O rows affected (0.10 sec*)

NB: Ho creato un database (db_name) in precedenza e stavo creando una credenziale utente con tutti i privilegi concessi a tutte le tabelle nel DB al posto di utilizzare l'utente root predefinito che ho letto da qualche parte è una best practice.


3

L'utente specificato semplicemente non esiste sul tuo MySQL (quindi, MySQL sta cercando di crearlo con GRANT come faceva prima della versione 8, ma fallisce con le limitazioni, introdotte in questa versione).

MySQL è piuttosto stupido a questo punto, quindi se hai 'root' @ 'localhost' e provi a concedere privilegi a 'root' @ '%' li tratta come utenti diversi, piuttosto che come nozione generalizzata per l'utente root su qualsiasi host, incluso localhost.

Anche il messaggio di errore è fuorviante.

Quindi, se ricevi il messaggio di errore, controlla i tuoi utenti esistenti con qualcosa di simile

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

e quindi creare l'utente mancante (come consigliato da Mike) o adattare il comando GRANT alle specifiche dell'utente esistenti.


Questa è stata per me una valida soluzione! Semplicemente non avevo digitato con precisione la riga user @. Assicurati di controllare questo prima di provare le altre soluzioni suggerite. Per me era: CREATE USER 'user'@'%domain.com' e poi quando ho emesso l'istruzione GRANT non riuscita, la mia sintassi era sbagliata di uno '.'. Sembrava questo GRANT .... TO 'user'@'%.domain.com'. Ho dimenticato di mettere "." nella mia dichiarazione di creazione e ha fatto la differenza nel risolvere questo problema.
wallisds

2

Solo i miei 2 centesimi sull'argomento. Stavo avendo lo stesso identico problema con il tentativo di connettermi da MySQL Workbench. Sto eseguendo una macchina virtuale bitnami-mysql per configurare una sandbox locale per lo sviluppo.

Il tutorial di Bitnami diceva di eseguire il comando "Concedi tutti i privilegi":

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

Questo chiaramente non funzionava, finalmente l'ho fatto funzionare usando la risposta di Mike Lischke.

Quello che penso sia successo è che l'utente root @% aveva le credenziali sbagliate associate. Quindi, se hai provato a modificare i privilegi dell'utente e senza fortuna prova:

  1. Eliminazione dell'utente.
  2. Crea di nuovo l'utente.
  3. Assicurati di avere il binding corretto sul tuo file di configurazione my.cnf. Nel mio caso ho commentato la riga poiché è solo per un ambiente sandbox.

Dalla console Mysql:

Elenca utenti (utile per vedere tutti i tuoi utenti):

select user, host from mysql.user;

Elimina utente desiderato:

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

Crea utente e concedi autorizzazioni:

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

Esegui questo comando:

FLUSH PRIVILEGES;

Individua il tuo file di configurazione mysql "my.cnf" e cerca una riga simile a questa:

bind-address=127.0.0.1

e commentalo usando un '#':

#bind-address=127.0.0.1

Quindi riavvia il tuo servizio mysql.

Spero che questo aiuti qualcuno che ha lo stesso problema!


1

Questo ha funzionato per me:

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

1

Controlla che il tuo nome utente e il tuo dominio siano gli stessi creati in precedenza. Mysql seleziona l'account dalle due colonne nella tabella utente. Se è diverso, mysql potrebbe pensare di voler creare un nuovo account tramite concessione, che non è supportato dopo la versione 8.0.


1

Le mie specifiche:

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

Cosa ha funzionato per me:

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

Anche se funzionerebbe nella tua situazione specifica. Questi pezzi di sintassi SQL aggiorna un utente e non imposta un account utente. Inoltre non concede privilegi.
Nebulastic

0

Beh, ho appena avuto lo stesso problema. Anche se il percorso avesse "%" non potrebbe connettersi da remoto. Ora, dando un'occhiata al my.inifile (file di configurazione in Windows), il filebind-address istruzione è stata persa.

Quindi ... l'ho inserito bind-address = *dopo [mysqld]e ho riavviato il servizio. Ora funziona!


Questa è in realtà la più vicina alla risposta corretta.
Joseph 8

0

1. concedere privilegi

mysql> GARANTIRE TUTTI I PRIVILEGI. A 'root' @ '%' CON OPZIONE DI GRANT;

mysql> FLUSH PRIVILEGI

2. controlla la tabella utenti:

mysql> usa mysql

mysql> seleziona host, utente da utente inserisci qui la descrizione dell'immagine

3.Modificare il file di configurazione

mysql default bind ip : 127.0.0.1, se vogliamo servizi di visita remota, elimina semplicemente 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.finalmente riavviare i servizi

i servizi di brew riavviano mysql


Anche se questo funzionerebbe, non riavvierei mai un'istanza mysql in produzione quando concedevo determinati privilegi. Prova invece a scaricare i privilegi.
Nebulastic

-1

Questo potrebbe funzionare:

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

1
Piuttosto che buttare via il codice, spiega anche perché è la soluzione appropriata. L'obiettivo è istruire in modo che l'OP sappia cosa fare la prossima volta, non semplicemente risolvere il problema immediato.
Tin Man

-1

Ho avuto lo stesso problema, che mi ha portato qui. In particolare, per lo sviluppo locale, volevo poterne fare a mysql -u root -pmeno sudo. Non voglio creare un nuovo utente. Voglio usareroot da un'app Web PHP locale.

Il messaggio di errore è fuorviante, poiché non c'era nulla di sbagliato nell'impostazione predefinita'root'@'%' privilegi utente .

Invece, come diverse persone hanno menzionato nelle altre risposte, la soluzione era semplicemente quella di impostare bind-address=0.0.0.0invece che bind-address=127.0.0.1nella mia /etc/mysql/mysql.conf.d/mysqld.cnfconfigurazione. Non sono state altrimenti richieste modifiche.


Questo non risponde nemmeno completamente alla domanda.
Nebulastic

-2

Ho avuto lo stesso problema su CentOS e questo ha funzionato per me (versione: 8.0.11):

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

ERRORE 1064 (42000): hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a '. TO 'root' @ '%' 'alla riga 1
GDefender

mysql> GARANTIRE TUTTI I PRIVILEGI. Radicare'@'%'; ERRORE 1064 (42000): hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a '. TO 'root' @ '%' 'alla riga 1 mysql>
PGOEL
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.