[筆記] 無法重置 MariaDB 的 root 密碼該怎麼做?

enter image description here
忘記 MariaDB 的密碼想要重設,下了多個常見的指令

MariaDB [(none)]> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
MariaDB [(none)]> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';
MariaDB [(none)]> update mysql.user set password=password('MyNewPass') where user='root';

都失敗,出現的錯誤訊息大多如下

ERROR 1131 (42000): You are using MariaDB as an anonymous user and anonymous users are not allowed to change password

照著很多網路步驟做,都還是不能修改成功。
都是當下看起來成功,然後下 quit 重新登入又失敗。

這時只好換個關鍵字搜尋:"cant reset MariaDB password"
就被拯救了!


發生什麼事?

多篇文章都提到同一個現象
如果你的 mysql.user table 裡面的 plugin 欄位被 “unix_socket” 佔據,
就會修改失敗(這是什麼巫術…)

依據國外網友分析,
通常 MariaDB 更新後, plugin 欄位就會被補上這個值(這又是什麼巫術…)

大致看一下, Unix Socket 是一個認證外掛,
主要是讓使用者可以直接透過系統認證進入資料庫,不需輸入密碼。
(那為什麼我還要這麼折騰進不去RRRR)


所以解決方法?

解決方法很簡單,就是把 “unix_socket” 清掉…(這…)
其實我也不知道這個做法好不好,但總比進不去好
如果有更好的解決方案還請留言告訴我。

1. 先想辦法登進去

如果你之前有嘗試重設過,記得也要先 kill 所有 mysql/mariadb 的 processes,再開始以下步驟。

$ sudo systemctl stop mysql
$ sudo mysqld_safe --skip-grant-tables --skip-networking &
$ mysql -u root

2. 查看 plugin

我們看一下 mysql.user 是不是被 “unix_socket” 了

MariaDB [(none)]> SELECT user, plugin FROM mysql.user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
+------+-------------+
1 row in set (0.00 sec)

看起來是真的中了。

3. 把它清掉

這裡不下 WHERE 語法,直接把所有 plugin 清空

MariaDB [(none)]> UPDATE mysql.user SET plugin="";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

確認一下是不是清空了

MariaDB [(none)]> SELECT user, plugin FROM mysql.user;
+------+--------+
| user | plugin |
+------+--------+
| root |        |
+------+--------+
1 row in set (0.00 sec)

4. 重設密碼

終於來到重設密碼的步驟了

MariaDB [(none)]> UPDATE mysql.user SET password=PASSWORD("your_new_password") WHERE user="root";
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

離開前讓 MariaDB 重新讀取使用者權限

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> quit
Bye

5. 完成

先手動 kill 所有 mysql/mariadb 的 processes
然後重新啟動
試試看可不可以登入

$ sudo kill XXXXXX # kill 各種 mariadb processes
$ sudo systemctl start mysql

$ mysql -u root -p

終於進去了!
大吉大利,晚上吃雞!


延伸閱讀