適用 MySQL 5.6 / 5.7 / 8.0,Linux 與 Windows 通用。
# Linux cat /root/.mysql_secret # 或 grep 'temporary password' /var/log/mysqld.log # Windows # 檢查安裝目錄下的 .mysql_secret 或錯誤日誌 mysql -u root -p'random_password'
# 1. 停止服務
systemctl stop mysqld # Linux systemd
service mysqld stop # Linux sysvinit
net stop mysql # Windows
# 2. 啟動跳過授權
mysqld_safe --skip-grant-tables --skip-networking & # Linux
# Windows: 在 my.ini [mysqld] 加入 skip-grant-tables 後 net start mysql
# 3. 免密登入
mysql -u root
# 4. 重置密碼(注意欄位差異)
USE mysql;
-- MySQL 5.6
UPDATE user SET password=PASSWORD('NewPass123!') WHERE user='root';
-- MySQL 5.7 / 8.0
UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE user='root';
-- 或 8.0.4+
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
FLUSH PRIVILEGES;
QUIT;
# 5. 正常重啟
systemctl start mysqld
# Windows: 移除 my.ini skip-grant-tables 後 net start mysql
# 1. 建立 SQL 腳本 echo "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';" > /tmp/reset_root.sql # 2. 啟動時載入 mysqld --init-file=/tmp/reset_root.sql --user=mysql & # 3. 正常登入驗證 mysql -u root -p'NewPass123!'
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
解決:
SET PASSWORD = PASSWORD('NewPass123!');
-- 或
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
| 版本 | 密碼欄位 | PASSWORD() 函數 | 推薦語法 |
|---|---|---|---|
| 5.6 | password | 支援 | UPDATE user SET password=PASSWORD(...) |
| 5.7 | authentication_string | 支援 | UPDATE user SET authentication_string=PASSWORD(...) |
| 8.0 | authentication_string | 8.0.11 移除 | ALTER USER ... IDENTIFIED BY ... |
skip-grant-tables 並重啟mysql_secure_installationDELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost','127.0.0.1','::1'); FLUSH PRIVILEGES;