| 類別 | 方法 | 適用場景 | 風險 |
|---|---|---|---|
| 圖形工具 | phpMyAdmin 編輯 mysql.user 表 | 已有 Web 管理介面、知舊密碼 | 低 |
| MySQL Workbench / Navicat 執行 SQL | 同前 | 低 | |
| 命令行工具 | mysqladmin -u root -p password 'new' | 知舊密碼、本地/遠程均可 | 低 |
mysql -u root -p 進入後 ALTER USER | 知舊密碼、需批量改多 host | 低 | |
SET PASSWORD FOR 'root'@'%' = PASSWORD('...') | 5.7.6 前版本 | 中 (舊語法) | |
| 特權操作 (需 root 系統權限) | skip-grant-tables 臨時啟動 + SQL 改密 | 忘記密碼、最通用標準姿勢 | 中 (短暫無認證) |
複製已知密碼實例的 user.* 文件覆蓋 | 遷移/克隆環境、擁有源文件 | 高 (權限/版本不匹配風險) | |
十六進制編輯 user.MYD 直接改密碼哈希 | 極端環境、無 SQL 入口 | 極高 (文件損壞、結構變更失效) | |
Windows: mysqld-nt --skip-grant-tables + mysqladmin flush-privileges password | Windows 服務模式忘記密碼 | 中 |
# 1. 停庫
systemctl stop mysqld
# 或 kill -TERM $(cat /var/run/mysqld/mysqld.pid)
# 2. 無認證啟動 (僅本地、臨時)
mysqld_safe --skip-grant-tables --skip-networking --socket=/tmp/mysql_recovery.sock &
# 3. 連線改密
mysql --socket=/tmp/mysql_recovery.sock -u root
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass2024!';
mysql> FLUSH PRIVILEGES;
mysql> \q
# 4. 重啟驗證
killall mysqld
systemctl start mysqld
mysql -u root -p'NewStrongPass2024!' -e "SELECT 1;"
net stop MySQL
cd C:\Program Files\MySQL\MySQL Server 5.7\bin
mysqld --skip-grant-tables --skip-networking &
# 新開 CMD
mysql -u root
> FLUSH PRIVILEGES;
> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass2024!';
> \q
# 關閉前台 mysqld (Ctrl+C)
net start MySQL
user.MYD 存儲加密哈希 (如 *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B 為 password 的 SHA1 兩次)。root 後的哈希段,覆蓋為已知哈希或清空。authentication_string 欄位) 導致偏移錯位、校驗和失效、InnoDB 表不適用。Password 改名 authentication_string,直接複製 user.MYD 跨版本必失效。chown mysql:mysql user.* && chmod 600 user.*,否則 MySQL 拒絕讀取。DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;。validate_password,新密碼需滿足長度/大小寫/數字/特殊字符要求。「知舊用 ALTER USER、忘舊用 skip-grant-tables、遷移用 mysqldump --all-databases 導出再導入」是正規三板斧。十六進制編輯、文件覆蓋屬「非常手段」,僅在極端受限環境最後手段使用,事後必須重建實例確保元數據一致性。