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.