impossibile accedere come root utente mysql dal normale account utente in Ubuntu 16.04


203

Ho appena installato Ubuntu 16.04 LTS con i pacchetti php, mariadbe nginx. Ho eseguito mysql_secure_installatione modificato la password di root.

Ora quando provo ad accedere mysqlusando l'account root mentre sono connesso Ubuntu come normale account utente ottengo l'accesso negato.

Quando accedo usando sudo mysql, mysql non mi chiede nemmeno la password. Se corro mysql_secure_installtionvedo che le vecchie impostazioni non sono mai state impostate in modo permanente.

Che cosa sto facendo di sbagliato?

Risposte:


359

Di recente ho aggiornato Ubuntu dal 15.04 al 16.04 e questo ha funzionato per me:

  1. Innanzitutto, connettiti a sudo mysql

    sudo mysql -u root
    
  2. Controlla i tuoi account presenti nel tuo db

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Elimina l'account root @ localhost corrente

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Ricrea il tuo utente

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Concedi le autorizzazioni al tuo utente (non dimenticare di svuotare i privilegi)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. Esci da MySQL e prova a riconnetterti senza sudo.

Spero che questo possa aiutare qualcuno :)


16
Questa è stata l'unica cosa che ha funzionato per me, qualcuno sa esattamente cosa è successo con l'utente root quando installi mysql-server su 16.04?
Ruggi,

32
Aspetta, non %significa che puoi connetterti da qualsiasi luogo ... da remoto?
Stevie G,

9
È possibile modificare la riga in: CREA UTENTE 'root' @ 'localhost' IDENTIFICATO DA '';
vladnev,

11
Per la sicurezza: il modello di connessione mysql root @ localhost non garantito è un elemento fondamentale dello sviluppo locale ma non dovrebbe apparire assolutamente da nessun'altra parte.
Charney Kaye,

5
La dichiarazione di concessione per il nuovo utente root qui non fornisce "con concessione" alla radice, quindi root non può concedere senza eseguirla in seguito: dba.stackexchange.com/a/62046/115679 Modifica la dichiarazione di concessione ingrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren

132

Se installi 5.7 e non fornisci una password rootall'utente, utilizzerà il auth_socketplugin. A quel plugin non importa e non ha bisogno di una password. Verifica solo se l'utente si sta connettendo utilizzando un socket UNIX e quindi confronta il nome utente.

Tratto da Cambia password utente in MySQL 5.7 Con "plugin: auth_socket"

Quindi, al fine di cambiare la pluginschiena a mysql_native_password:

  1. Accedi con sudo:

    sudo mysql -u root
    
  2. Modifica plugine imposta una password con un singolo comando:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
    

Ovviamente puoi anche usare il comando sopra per impostare una password vuota.

Solo per la cronaca, (e per gli MariaDB < 10.2utenti) esiste anche un altro modo per modificare la pluginsenza fornire una password (lasciandola vuota):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;

2
Grazie, per qualche motivo, questo è stato impostato automaticamente all'improvviso dopo un aggiornamento apt-get penso ...
Tominator

4
Inoltre, mi piace di più questa risposta - è molto meno distruttiva ;-)
benzkji

3
Per MariaDB <10.2, per cambiare il plugin insieme alla password, ecco la domanda: UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;Fonte: stackoverflow.com/a/41537019/1004587
pothi Kalimuthu

5
Questa dovrebbe essere la risposta accettata
Geo C.,

3
Vorrei poterlo votare due volte.
James Smith,

21

In breve, su MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

dove sostituisci NEWPASSWORD con la password che desideri e tutto il resto alla lettera.

Il problema qui è che quando MariaDB o MySQL sono installati / aggiornati (specialmente se ad un certo punto la radice è impostata senza una password) nella tabella Users la password è effettivamente vuota (o ignorata) e l'accesso dipende dall'utente di sistema corrispondente a un utente MySQL. È possibile verificare ciò come segue passando alla radice del sistema e quindi digitare:

mysql -uroot -p

Quindi immettere nessuna password o password errata . Probabilmente verrai fatto entrare (potresti anche essere in grado di accedere dalla radice unix semplicemente # mysqlperché la password è irrilevante e l'utente è definito).

Quindi cosa sta succedendo? Bene, se accedi come root e fai quanto segue:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

noterai auth_socket(che potrebbe leggere unix_socketsu MariaDB). Questi socket ignorano le password e consentono all'utente Unix corrispondente di accedere senza un controllo della password. Questo è il motivo per cui è possibile accedere con root ma non con un altro utente.

Quindi la soluzione è aggiornare gli utenti per non utilizzare auth_socket/unix_sockete impostare correttamente una password.

Su MariaDB (<10.2, vedere i commenti sotto) che si trova sulla versione 16 di Ubuntu dal 2017 questo dovrebbe essere sufficiente. NEWPASSWORD è la tua password. mysql_native_passwordscrivi alla lettera.

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(È possibile che l'impostazione del plug-in su vuoto funzioni. YMMV. Non ho provato questo. Quindi questa è un'alternativa.)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

Altrimenti:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';

Poi

FLUSH PRIVILEGES;

Per la cronaca, la soluzione che consiste nell'eliminare l'utente e ricrearlo con '%' mi ha completamente bloccato fuori dal database e può causare altri problemi a meno che non si ottenga la grantdichiarazione esattamente corretta - più semplice aggiornare semplicemente il root che già si possiede.

Nella mia esperienza, il problema si verifica solo con l'utente root, poiché altri utenti verranno aggiunti manualmente non parte di un'installazione / aggiornamento iniziale.


2
Ho trovato questo per funzionare perfettamente. Mi chiedo però perché cambiare la password di root con mysql_secure_installationnon abbia avuto lo stesso effetto. Dove memorizza la nuova password?
Mausy5043,

Puoi modificare la tua risposta e dire di più su ciascuno dei comandi mentre procedi? Non sono chiaro su quali siano applicabili. Sono i due UPDATEche si applicano a MariaDB <10.2 e ALTERalle altre versioni? E la seconda è UPDATEun'alternativa alla prima o dobbiamo digitare entrambe? Infine, 'mysql_native_password' è qualcosa da scrivere alla lettera, o dovremmo sostituirlo con la nostra password di root prevista per MySQL?
Michael Scheper,

1
@MichaelScheper È passato un po 'di tempo quindi non voglio modificare troppo, ma ecco cosa ricordo. (1) Esegui solo il primo AGGIORNAMENTO (<10.2 potrebbe non essere un requisito). (2) Sì, digitare 'mysql_native_password' alla lettera. In sostanza, quello che stai facendo è dire a mariadb: "Non usare i privilegi di Unix, usa i privilegi di database". Questa mysql_native_passwordè l'opzione.
Gazzer,

Accidenti ho sbagliato a scrivere "privilegio"!
Gazzer,

1
Sembra che tu abbia perso il limite di modifica anche solo di 1½ minuti! Ne sono frustrato anche a volte. Comunque grazie!
Michael Scheper,

8

Se hai installato MySQL / MariaDB dal repository di base, gli utenti non possono accedere a MySQL come utente root MySQL dai loro accessi Unix (non applicabile se hanno accesso sudo )

  1. Accedi alla shell root di MySQL:

    $ sudo mysql -u root -p
    
  2. Eseguire le query seguenti:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Apri una nuova shell, quindi:

    $ mysql -u root -p
    

fonte


Quando l'ho fatto, non potevo più sudo mysql come root. Prima ho dovuto fare un tentativo, quindi ho potuto accedere a mysql come root. Quindi l'ho cambiato di nuovo in auth_socket.
fino al

Singolo comando:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczynski,

Se vuoi perdere l'accesso alla tua istanza MySQL, questa risposta è semplice.
Danila Vershinin,

2

Prova a creare un nuovo account mysql, per me ha funzionato (mysql 5.7.12):

  1. Accedi come sudo:

    sudo mysql -uroot
    
  2. Crea un nuovo utente e concedi i privilegi (senza password):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Accedi come nuovo utente:

    mysql -uadmin
    

2

Ho dovuto fare due cose (grazie a @Todor e @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

e poi:

FLUSH PRIVILEGES;

Non consiglierei di eliminare l'utente root.


1

Prova prima questo codice,

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

e poi,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

quindi premere Ctrl+Ze digitare: bgper eseguire il processo dal primo piano allo sfondo, quindi verificare l'accesso mediante:

mysql -u root -proot
mysql> show grants;

1

Se si esegue semplicemente il comando mysql sotto l'utente root, si otterrà l'accesso senza che sia richiesta la password, poiché l'autenticazione socket è abilitata per root @ localhost. .

L'unico modo per impostare la password è passare all'autenticazione nativa come:

$ sudo mysql

mysql> ALTER USER 'root' @ 'localhost' IDENTIFICATO CON mysql_native_password DA 'test';


0

Ho adattato alcuni script di provisioning che ho creato per utilizzare MariaDB e ho riscontrato questo problema esatto. Mettendo insieme un sacco di informazioni qui, la risposta di un Gazzer è davvero azzerata nel numero; tutto si riduce all'impostazione auth_socket/ unix_socket.

Quindi quando si utilizza MariaDB 5.5 (sotto Ubuntu 14.04) e MariaDB 10 sotto (Ubuntu 16.04), accedere a MySQL ed eseguire questo comando chiarisce subito le cose:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

Le altre risposte - inclusa la risposta più votata a partire da questo post di Loremhipsum - incoraggiano davvero le cattive pratiche raccomandando di far cadere un utente e poi ricrearle. Per me, questa è una soluzione abbastanza radicale. La soluzione migliore / più semplice per annullare il pluginvalore, scaricare i privilegi e andare avanti con la vita.


-1

Ho avuto lo stesso problema e in esecuzione il seguente risolto:

mysql_upgrade --force

Purtroppo non ha funzionato. Sto reinstallando Ubuntu.
codescope,

1
Ho appena eseguito una nuova installazione di Ubuntu 16.04 e installato mariad-server. Dopo l'installazione ho eseguito mysql_secure_installation e ho impostato la password. Dopo aver eseguito il resto dei passaggi in mysql_secure_installation, l'ho eseguito di nuovo e sembra che non stia salvando le modifiche. Non riesco ancora ad accedere dal mio normale account utente. Potrebbe essere un bug?
codescope,

Questo non aiuterà mai. Il problema non ha nulla a che vedere con l'installazione effettiva del binario MariaDB, ma piuttosto l'utente rootviene impostato con pluginimpostazioni non standard. L'unico caso limite in cui un aggiornamento del DB potrebbe aiutare in un caso come questo è se il mysql_upgradeprocesso stesso tiene conto plugindell'impostazione di cui dubito.
Jake Gould il
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.