Impossibile ripristinare la password di root di MySQL (MariaDB)


35

Oggi, volevo creare un database in PMA. Diceva: "Impossibile accedere al server MySQL". Ho provato tramite un terminale, stesso problema, ed è perché la mia password è sbagliata. E non riesco a capire il perché.

Ho provato il solito metodo per reimpostare la password di root (salta il montaggio delle tabelle delle sovvenzioni e reimposta la passord) ma sembra che non funzioni.

Guarda quello:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Risposte:


56

Ho trovato una soluzione strana quanto il problema stesso.

Riavvia MySQL / MariaDB usando --skip-grant-tables(cerca tutorial sul web). (non necessario, leggi le mie modifiche alla fine del post)

Guarda il plugincampo nella mysql.usertabella:

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

Ho dovuto ripristinare il campo del plugin di ogni voce su una stringa vuota.

UPDATE user SET plugin="";   // without WHERE clause

Inoltre, assicurati che sia definita una password, perché a volte sembra essere cancellata (seleziona sui user, passwordcampi). In caso contrario, aggiornalo con:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

I parametri dei privilegi devono essere salvati esplicitamente:

FLUSH PRIVILEGES;

Quindi, riavvia MySQL in modalità normale e dovresti essere in grado di connetterti all'account di root.

Ciò non disabiliterà necessariamente la connessione tramite socket Unix. Dopo che il mio MySQL è stato riparato, in PMA, posso vedere che la connessione viene stabilita tramite un socket Unix.

EDIT , alcuni mesi dopo: ora sono abituato a che questo problema ritorni frequentemente, penso ad ogni aggiornamento di MariaDB (o qualcosa del genere). Quindi ho una migliore comprensione del problema; c'è un plugin UNIX_SOCKET che può permetterti di accedere a un account MariaDB senza dover creare una password, perché usa le credenziali della shell per fidarti di te, senza dover inserire alcuna password. In realtà, questo plug-in è un plug-in di autenticazione e non un metodo di comunicazione con il server SQL. Quindi puoi disabilitarlo in sicurezza se non usi unix socket come metodo di accesso. L'unica cosa che non posso spiegare è perché il plug-in UNIX_SOCKET è regolarmente impostato su ogni account del database, senza alcuna azione da parte mia.

Questo ha il piacevole effetto collaterale che, quando accade, è possibile accedere al server SQL senza dover riavviare MariaDB con --skip-grant-tables: basta accedere all'account di root del sistema, quindi connettersi con mysql -u rootsenza password, quindi ripristinare il campo plugin nel come è spiegato sopra.

EDIT 2: confermato, succede ad ogni aggiornamento di MariaDB su Ubuntu.


1
Questo interrompe il processo cron di manutenzione su Ubuntu 16.04 (almeno) perché quello script si aspetta di accedere senza password usando il plug-in socket. Vedere superuser.com/questions/957708/… per i dettagli.
— colan,

Ok, interessante, ma questo non succede più (la mia configurazione di password legacy non si interrompe in modo casuale ora). Forse il plug-in del socket Unix è impostato solo sull'utente root, adesso? Impossibile controllarlo adesso. Ma non mi piace l'idea che il sistema operativo decida per me quale configurazione di autenticazione utilizzare.
— Morgan Touverey Quilling,

Questo problema fa schifo, è successo su Debian 9, non è stata chiesta la password di root quando ho installato MariaDB e non sono riuscito nemmeno a resettarlo. Spero che non accada più dopo un aggiornamento. Dovremmo sostituire MariaDB con MySQL per evitare tali problemi?
— Baptx,

Non sono sicuro che accada ancora, potrebbe essere stato corretto ora (posso modificare il post se qualcuno lo sa). Forse succede solo durante l'installazione, che sarebbe una buona configurazione predefinita.
— Morgan Touverey Quilling,

1
Ho appena notato che se non usiamo la presa plug-unix per l'utente root, si sarà in grado di installare il pacchetto phpmyadmin sull'ultima Debian: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Quindi la soluzione migliore è continuare a utilizzare l'autenticazione socket unix predefinita con comando sudo mysql -u root, che ritengo sia anche più sicura e performante.
— Baptx

5

Da questa risposta, http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql tenta di autenticare il root usando il plugin, non la password. Devi disabilitare l'utilizzo del plugin per root.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
Questo è esattamente ciò che ho pubblicato come risposta.
— Morgan Touverey Quilling, il

1
È un rollup leggermente più conciso con l'aggiornamento.
— pony,

Non riesco nemmeno a ottenere una shell mysql, quindi questo non funzionerà nel mio caso, anche se sto vedendo Could not open mysql.plugin table.nel registro degli errori.
— Dave Everitt,

0

Connetti come precedentemente descritto:

mysqld_safe --skip-grant-tables

Verrà mostrato il file di registro:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

Registro di ricerca elencato (in questo caso: /usr/local/mysql/data/ab123456.domain.com.err) per il socket corretto:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

e usalo nella connessione mysql:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server

Ho appena ricevuto $ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/varma sono appena restituito al prompt di bash.
— Dave Everitt,

0

Per impostazione predefinita, marriadb utilizza il plugin di autenticazione "unix_socket" per impostare le password, dovrebbe essere "mysql_native_password" quindi

cambia database ..

use mydatabase;

per prima cosa vedi che il plugin strega è impostato ..

SELECT user, plugin FROM user;

impostalo su "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

imposta nuova password ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
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.