1、原理
通過配置參數“skip_grant_tables”在mysql啟動時跳過grant_tables(授權表),從而通過命令來充值root帳號的密碼
2、方式
首先需要停止mysql服務
(1)在my.ini文件的[mysqld]塊下增加“skip_grant_tables”,然后重啟mysql服務,再以管理員權限打開cmd執行一些列命令重置密碼
步驟如下:
A、找到my.ini文件(右擊mysql服務找到可執行文件路徑,從所在的目錄或其它層級目錄搜索),在[mysqld]塊下增加“skip_grant_tables”
B、重啟mysql服務
C、以管理員權限打開cmd命令窗口,執行mysql -uroot –p直接回車不用輸入密碼
D、選擇數據庫:use mysql
E、更新root的密碼:update user set authentication_string=password('新密碼') where user='root' and Host='localhost'
F、刷新權限:flush privileges
G、退出:quit
H、重新登錄:mysql -uroot -p提示輸入密碼,這時輸入密碼才能登錄
I、回到 my.ini 配置文件移除“skip_grant_tables”,再重啟mysql
(2)直接通過命令指定參數“skip_grant_tables”啟動mysql,再執行命令修改密碼(與1的步驟除了指定跳過授權表參數的方式不同以外,其它都一樣)
A、在第一個cmd窗口執行 mysqld --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --skip-grant-tables ---注意路徑(以你的實際情況為准)
其它步驟同上
參考:
Windows下MySQL5.7 root 密碼重置
https://blog.csdn.net/hey_yf/article/details/80024706
https://www.cnblogs.com/yuwentims/p/9172463.html
3、遇到的坑
同過修改my.ini的方式配置“skip_grant_tables”再保存千萬要注意編碼的格式“ANSI”
(1)用Notepad++將修改了my.ini的配置
(2)重啟mysql服務,就啟動不了(超時),通過命令去執行接下來的操作會報“ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)”的錯誤
(3)第一想到的是去百度,無果后從系統事件日志開始着手,發現了一些莫名其它的錯誤(其實部分是系統里其它程序的錯誤日志):
A、首先根據關鍵字看到的是“服務 MySQL57 意外停止。這發生了 7 次。”並沒卵用
B、然后就在這個錯誤的隔壁找其它錯誤 “應用程序-特定 權限設置並未向在應用程序容器 不可用 SID (不可用)中運行的地址 LocalHost (使用 LRPC) 中的用戶 NT AUTHORITY\LOCAL SERVICE SID (S-1-5-19)授予針對 CLSID ”像這種不明不白的錯誤頭腦一發熱並沒有多想,然后就是百度解決並沒有屁用
解決方式:
https://www.cnblogs.com/ibgo/p/3550674.html
解決了這個日志,但是對mysql並沒影響,現在才明白找錯了方向
(4)於是將所有的事件日志清除,重啟computer
(5)終於發現了一條這樣的錯誤 “mysql 啟動報錯--發現系統錯誤2,系統找不到指定的文件”
解決方式:
https://blog.csdn.net/Marvel__Dead/article/details/63262641?locationNum=4&fps=1
解決了報錯,mysql服務可以啟動了
接着執行重置的命令,終於報了一條有意義的錯“Found option without preceding group in config file:XXX; Fatal error in defaults handling.“,找到了原來是my.ini編碼惹得禍!
改成ANSI,一切就順利了…
參考:
MySQL報錯: Found option without preceding group in config file:XXX; Fatal error in defaults handling.
https://blog.csdn.net/life_android/article/details/56512606
4、注意
(1)確保服務里只有一個MySql