以 --skip-grant-tables 啟動 mysqld,跳過權限驗證 → 免密登入 → 更新 mysql.user 表 authentication_string → 正常重啟。
systemctl stop mysqld
# 或舊版
service mysqld stop
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
mysqld --skip-grant-tables --skip-networking --user=mysql --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock &
# --skip-networking:防止外部連入此不安全實例
# 若啟動失敗,查看 error log:tail -f /var/log/mysqld.log
mysql -u root --socket=/var/run/mysqld/mysqld.sock
-- 進入 mysql client 後執行 (MySQL 5.7+ / 8.0)
FLUSH PRIVILEGES; -- skip-grant-tables 下必須先執行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongP@ssw0rd!';
-- 或 8.0.4+ 支援
-- SET PASSWORD FOR 'root'@'localhost' = 'NewStrongP@ssw0rd!';
EXIT;
# 找到 pid 並殺掉 (或用 mysqladmin shutdown --socket=...)
pkill -f "mysqld.*skip-grant-tables"
systemctl start mysqld
mysql -u root -p'NewStrongP@ssw0rd!' -e "SELECT VERSION();"
net stop mysql80 (服務名視版本而定)mysqld --skip-grant-tables --skip-networking (保持視窗開啟)mysql -u root (免密進入)FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass!';net start mysql80| 問題 | 原因 | 解決 |
|---|---|---|
| mysqld 無法啟動 (skip-grant-tables) | socket/pid 目錄權限、datadir 路徑錯誤、殘留進程 | 檢查 error log;mkdir /var/run/mysqld;pkill mysqld |
| ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement | 未先執行 FLUSH PRIVILEGES | 修改密碼前必須先 FLUSH PRIVILEGES |
| 密碼策略拒絕 | validate_password 元件強制複雜度 | 暫時降低等級:SET GLOBAL validate_password.policy=LOW; 或用符合策略的密碼 |
| Windows 服務名稱不知 | 版本不同 | sc query 列出含 MySQL 的服務名 |
mysql_secure_installationmysql 系統庫-- 修改密碼 (推薦)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';
-- 或 SET PASSWORD (8.0.4+)
SET PASSWORD FOR 'root'@'localhost' = 'newpass';
-- 建立用戶並指定認證插件 (相容舊客戶端)
CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'apppass';