很多人都知道MySQL忘記root密碼之後可以通過skip-grant-tables來暫時免密登錄MySQL,從而修改root密碼,但是這種方式一方面有安全隱患,另一方面也並不怎麼適用於Windows系統,今天在通過此方式修改MySQL8.0 on Windows的root密碼時遇到了這個問題,寫個 ...
很多人都知道MySQL忘記root密碼之後可以通過skip-grant-tables來暫時免密登錄MySQL,從而修改root密碼,但是這種方式一方面有安全隱患,另一方面也並不怎麼適用於Windows系統,今天在通過此方式修改MySQL8.0 on Windows的root密碼時遇到了這個問題,寫個小隨筆記一下。
參考:
https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html
https://bugs.mysql.com/bug.php?id=90554
首先看下修改MySQL密碼的兩種方式:
方法一:
在MySQL的啟動文件中添加skip-grant-tables參數後重啟MySQL,然後免密登錄MySQL後執行:
flush privileges; --必須先執行此命令 ALTER user root@'localhost' identified by 'newpasswd';
然後重啟MySQL即可。
方法二:
創建一個名為root_newpass.txt的文本文件,放入如下內容:
ALTER user root@'localhost' identified by 'newpasswd';
然後使用此文件啟動一次資料庫:
mysqld --defaults-file="C:\\ProgramData\\MySQL\\MySQL Server 8.0\\my.ini" --init-file=root_newpass.txt # --defaults-file必須寫在--init-file之前
如果是在Linux下則無需添加--defaults-file項。
之後再按正常方式啟動資料庫就可以了。
使用方法一無法在MySQL8.0 on Windows上修改root密碼的問題在哪兒?
在官方文檔關於--skip-grants-tables的描述中5.7和8.0版本里有一句明顯的差異,8.0里多瞭如下一句:
If the server is started with the --skip-grant-tables option to disable authentication checks,
the server enables --skip-networking automatically to prevent remote connections.
其意思是當你使用--skip-grant-tables跳過授權檢測啟動MySQL時,MySQL會自動啟用--skip-networking參數,這會阻止遠程訪問。
如果系統是windows那你需要開啟shared-memory/shared-memory-base-name或者enable-named-pipe/socket這兩對參數任意一對才能本地連接到mysql進行密碼重置(關於這倆名字熟悉sqlserver的應該不陌生),但Windows版本的mysql並不會預設設置這些參數,這導致MySQL8.0在Windows上通過--skip-grant-tables重置密碼是一件很麻煩的事,雖然這比5.7更安全。
推薦使用方法二在任意平臺上進行root密碼的重置。