忘記 MySQL root 密碼是資料庫管理常見困擾。重裝雖能解決但代價太大。核心原理是啟動時加入 --skip-grant-tables 參數,跳過權限表驗證,以免密碼登入修改密碼。本文提供 Linux 與 Windows 完整操作步驟。
MySQL 啟動時載入權限表 (mysql.user 等) 進行身分驗證。--skip-grant-tables 告訴伺服器略過這步驟,允許任意使用者無密碼連線,但僅限本地連線(除非同時加入 --skip-networking)。
# systemd 系統 systemctl stop mysqld # 或傳統 init.d service mysql stop # 或強制殺掉進程 pkill mysqld
# 方法一:修改設定檔 /etc/my.cnf [mysqld] 區段加入 skip-grant-tables,再啟動服務 # 方法二:命令列直接啟動(推薦,臨時生效) mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root -p # 直接按 Enter
# 在 mysql 客戶端內執行:
FLUSH PRIVILEGES; -- 重要:重新載入權限表,否則 UPDATE 無效
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
# 或舊版本:
UPDATE mysql.user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root';
FLUSH PRIVILEGES;
QUIT;
# 停止 skip-grant-tables 模式的進程 pkill mysqld # 移除 my.cnf 中的 skip-grant-tables(若有修改) # 正常啟動 systemctl start mysqld
net stop mysql 或「服務」管理工具中停止# 在 CMD 中切換至 bin 目錄 mysqld --skip-grant-tables --skip-networking
視窗會保持開啟,不要關閉。
mysql -u root -p # 直接按 Enter
Ctrl+C 關閉第一個視窗,再 net start mysql。FLUSH PRIVILEGES:在 --skip-grant-tables 模式下,權限表不會自動重載,UPDATE 後必須手動執行password 欄位改為 authentication_string--skip-networking 防止遠程無授權存取;操作完成後立即移除參數並重啟auth_socket 或 caching_sha2_password 插件,需同步更新 plugin 欄位mysql -u root -p'NewPass123!' -e "SELECT 'Connection OK';"
掌握此技巧,再也不用因忘記密碼而煩惱重裝資料庫。