MySQL 密碼體系特點
- 用戶名長度 16 字符(Unix 通常 8 字符),與作業系統用戶名無關。
- 密碼加密演算法與 Unix `crypt()` 不同,雙體系獨立。
- 預設匿名用戶無密碼,極度不安全,必須全量設置密碼。
三種修改密碼方式
1. `mysqladmin` 命令列工具(需知舊密碼)
# 有舊密碼
mysqladmin -u user -p password "newpass"
# 初始無密碼 root
mysqladmin -u root password "newpass"
2. SQL `SET PASSWORD` 語句(靈活、不需舊密碼前提是有權限)
-- 修改當前用戶密碼
SET PASSWORD = PASSWORD('newpass');
-- 修改指定用戶(需 mysql 資料庫權限)
SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');
3. 直接更新 `mysql.user` 表(需 reload 權限)
UPDATE mysql.user SET Password = PASSWORD('newpass') WHERE User='bob' AND Host='%.loc.gov';
FLUSH PRIVILEGES;
緊急重置 Root 密碼(遺忘情況)
- 關閉服務:`kill \`cat /datadir/hostname.pid\``(非 `kill -9`),或 Windows `net stop MySQL`。
- 跳過授權表啟動:
# Unix
su - mysql
mysqld_safe --skip-grant-tables &
# Windows
mysqld --skip-grant-tables
- 無密碼登入修改:
mysql -h localhost mysql
UPDATE user SET Password = PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;
或用 `GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'newpass' WITH GRANT OPTION;`
- 重新載入權限/重啟正常服務:`mysqladmin flush-privileges` 或重啟 `mysqld`。
注意事項
- `mysqladmin password` 修改的是「客戶端連接的主機匹配用戶」,本機連線改 `root@localhost`,遠程改 `root@%`,需分別執行。
- MySQL 5.7+ `Password` 欄位更名為 `authentication_string`,語法微調,原理相同。