[筆記] 無法重置 MariaDB 的 root 密碼該怎麼做?
忘記 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
終於進去了!
大吉大利,晚上吃雞!
延伸閱讀
- Can’t reset MySQL (MariaDB) root password - Super User