昨天另一個項目的小伙伴打來電話,說是他們項目節后准備在MYSQL上做一次數據遷移,打算先在本地WINDOWS上MYSQL測試后,再將整個計划拿來與老外討論.目前遇到一個很奇葩的事情,原先MYSQL DBA 1個月前離職了,在離職交接中LINUX服務器上的MYSQL文檔都發給項目組了,但是一台本地WINDOWS上的MYSQL因為很少有人使用,所以該DBA可能遺忘了交接這個MYSQL的文檔.現在小伙伴急着用,所以讓我幫忙重置MYSQL ROOT用戶的密碼. 哥這種半吊子MYSQL DBA也只好趕鴨子上架,在網絡上查詢資料發現方法大同小異, 多數是通過先SKIP GRANT TABLE,然后在另一DOS下重新登錄MYSQL然后更改權限庫中的ROOT密碼;但是在該機器上測試時發現跳過權限檢查后在另一個DOS下登錄MYSQL總報錯,經過反復測試發現下面的處理流程可用:
1. 先用DOS命令' net stop mysql'關閉MYSQL服務,如果DOS命令不能使用則要先去環境變量中加入類似‘;%SystemRoot%\system32‘這類參數.
2. 在DOS下切換到MYSQL安裝文件的BIN文件夾下,輸入命令'mysqld --skip-grant-tables',注意,輸入此命令后,正常情況下應為光標停止於下一行,如果DOS界面有提示信息則按信息提示進行處理.我遇到的情況是MYSQL安裝文件夾下面DATA文件夾丟失,可能是因為誤操作或者MYSQL升級成5.7所導致,所以使用SKIP命令會遇到問題,導致后面登錄MYSQL失敗.第一次發現該問題時,我首先手動分配了一個data的文件夾(手動分配會導致其他問題,在后面會詳細描述).此時使用SKIP命令正常.
3. 這時我們需新打開一個DOS窗口,因為上一步輸入SKIP命令后光標停止了,我們新打開DOS窗口,然后切換到MYSQL安裝文件夾BIN目錄下,輸入MYSQL命令訪問MYSQL.此時無需輸入密碼.
4.登錄MYSQL成功后,我們輸入'USE MYSQL‘命令訪問系統權限數據庫.注意:在這里會遇到第二個問題,因為在第二步我第一次處理時選擇手動分配DATA文件夾,所以系統中並沒有權限數據庫'mysql',有考慮使用5.7之前版本的data文件但是覺得不靠譜,后來搜索資料后發現這種現象大多數是因為MYSQL升級導致的,使用以下命令,系統會自動創建data file及一些缺失的系統數據庫:
mysqld --initialize-insecure --user=mysql
按照資料說法,初始化之后其實系統會建好默認數據庫后默認將ROOT密碼設置為空,但是我們已經到這一步了,還是繼續嘗試正常的修改ROOT 密碼流程吧.
5. 用常規UPDATE語句去更新MYSQL USER表中ROOT的密碼即可:
update mysql.user set authentication_string=password('123456') where user='root' and Host ='localhost';
注意,MYSQL5.7之后USER 表中PASSWORD字段更改為authentication_string,所以這里我們使用authentication_string.
6.更新成功之后是第三個要注意的地方,在MYSQL命令行輸入 ' flush privileges',通知系統權限方面的改變.
7.最后退出,重啟,發現修改成功.