MySQL Root 密碼遺失是資料庫管理常見情境。本文提供標準化、安全的重置流程,適用於 MySQL 5.7/8.0 及 MariaDB 10.x,並針對常見坑點給出解決方案。
datadir,通常為 /var/lib/mysql)systemctl stop mysqld
# 或
service mysql stop
以 root 身分直接啟動 mysqld 進程,繞過權限驗證:
mysqld_safe --skip-grant-tables --skip-networking --datadir=/var/lib/mysql &
關鍵參數說明:
--skip-grant-tables:不載入權限表,允許無密碼登入--skip-networking:禁用網路連線,防止外部入侵(極重要)--datadir:明確指定資料目錄,避免預設值錯誤&:放入背景執行,保留終端機操作mysql -u root
成功進入 mysql> 提示符即表示繞過驗證生效。
USE mysql;
UPDATE user SET authentication_string=PASSWORD('NewStrongPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
EXIT;
USE mysql;
-- MySQL 8.0 使用 authentication_string 欄位,採用 caching_sha2_password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 或若仍用 mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewStrongPass123!';
FLUSH PRIVILEGES;
EXIT;
# 先關閉 skip-grant-tables 的進程
mysqladmin -u root -p shutdown
# 輸入新設定的密碼
# 以系統服務正常啟動
systemctl start mysqld
# 或
service mysql start
mysql -u root -p'NewStrongPass123!' -e "SELECT VERSION();"
若正常顯示版本號,重置成功。建議同步更新應用程式設定檔中的密碼。
| 現象 | 原因 | 解決 |
|---|---|---|
| ERROR 1045 (28000): Access denied | 未加 --skip-grant-tables 或參數位置錯誤 | 檢查啟動指令順序,確保 --skip-grant-tables 在最前 |
| Can't connect to local MySQL server through socket | socket 路徑不匹配 | 指定 --socket=/var/run/mysqld/mysqld.sock 或用 -S 參數 |
| 密碼重置後應用連線失敗 | 應用使用舊密碼或不同 Host 權限 | 檢查 user 表 Host 欄位,必要時建立 '%' 主機權限 |
mysql_secure_installation 強化安裝