當前位置:
首頁 > 最新 > MySQL root密碼忘記,原來還有更優雅的解法!

MySQL root密碼忘記,原來還有更優雅的解法!

一直以來,對於MySQL root密碼的忘記,以為只有一種解法-skip-grant-tables。

問了下群里的大咖,第一反應也是skip-grant-tables。通過搜索引擎簡單搜索了下,無論是百度,抑或Google,只要是用中文搜索,首頁都是這種解法。可見這種解法在某種程度上已經佔據了使用者的心智。下面具體來看看。

skip-grant-tables的解法

首先,關閉實例

這裡,只能通過kill mysqld進程的方式。

注意:不是mysqld_safe進程,也切忌使用kill -9。

使用--skip-grant-tables參數,重啟實例

設置了該參數,則實例在啟動過程中會跳過許可權表的載入,這就意味著任何用戶都能登錄進來,並進行任何操作,相當不安全。

建議同時添加--skip-networking參數。其會讓實例關閉監聽埠,自然也就無法建立TCP連接,而只能通過本地socket進行連接。

MySQL8.0就是這麼做的,在設置了--skip-grant-tables參數的同時會自動開啟--skip-networking。

修改密碼

注意:這裡的update語句針對的是MySQL 5.7,如果是5.6版本,修改的應該是password欄位,而不是authentication_string。

而在MySQL 8.0.11版本中,這種方式基本不可行,因為其已移除了PASSWORD()函數及不再支持SET PASSWORD ... = PASSWORD ("auth_string")語法。

不難發現,這種方式的可移植性實在太差,三個不同的版本,就先後經歷了列名的改變,及命令的不可用。

下面,介紹另外一種更通用的做法,還是在skip-grant-tables的基礎上。

與上面不同的是,其會先通過flush privileges操作觸發許可權表的載入,再使用alter user語句修改root用戶的密碼,如:

最後重啟實例

需要注意的是,如果在啟動的過程中沒有指定--skip-networking參數,無需重啟實例。但在網上看到的絕大多數方案,都是沒有指定該參數,但重啟了實例,實在沒有必要。

下面對這個方案做個總結:

如果只添加了--skip-grant-tables,修改完密碼後,其實無需重啟,執行flush privileges即可。

從安全形度出發,建議加上--skip-networking。但因其是靜態參數,將其剔除掉需要重啟實例。

加上--skip-networking,雖然可以屏蔽掉TCP連接,但對於本地其它用戶,只要有socket文件的可讀許可權,都能無密碼登錄。還是存在安全隱患。

不建議通過update的方式修改密碼,更通用的其實是alter user。

更優雅的解法

相對於skip-grant-tables方案,我們來看看另外一種更優雅的解法,其只會重啟一次,且基本上不存在安全隱患。

首先,依舊是關閉實例

其次,創建一個sql文件

寫上密碼修改語句

最後,使用--init-file參數,啟動實例

實例啟動成功後,密碼即修改完畢~

如果mysql實例是通過服務腳本來管理的,除了創建sql文件,整個操作可簡化為一步。

注意:該操作只適用於/etc/init.d/mysqld這種服務管理方式,不適用於RHEL 7新推出的systemd。

歡迎閱讀"MySQL 8 新特性"的其它文章

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 MySQL實戰 的精彩文章:

TAG:MySQL實戰 |