首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.7/8.0 Root 密碼重置實戰:skip-grant-tables、authentication_string、臨時密碼、安全模式全方案

     編輯:MySQL 資料庫相關知識

MySQL 5.7 引入 authentication_string 替代 password 列,8.0 移除 PASSWORD() 函數、引入臨時密碼、強制密碼策略。本文匯總 4 種重置方案:skip-grant-tables、初始化臨時密碼、mysql_secure_installation、Docker 環境專用,並解決「修改後功能不全」的 FLUSH PRIVILEGES 與 ALTER USER 雙重驗證問題。

方案一:skip-grant-tables 免密進入 (通用、需重啟)

# 1. 停止服務
systemctl stop mysqld

# 2. 啟用跳過權限
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
systemctl start mysqld
# 或手動: mysqld_safe --skip-grant-tables --skip-networking &

# 3. 免密登入
mysql -uroot

# 4. 修改密碼 (5.7+ 用 authentication_string)
UPDATE mysql.user SET authentication_string = PASSWORD('NewStrongPass123!') 
WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

# 5. 關鍵步驟:重新載入授權表 (否則 ALTER USER 失效)
# 退出 mysql 客戶端,重啟正常模式
systemctl unset-environment MYSQLD_OPTS
systemctl restart mysqld

# 6. 正常登入並執行 ALTER USER (完成雙重驗證)
mysql -uroot -p'NewStrongPass123!'
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;

方案二:初始化臨時密碼 (全新安裝/數據目錄重建)

# 1. 獲取臨時密碼
grep 'temporary password' /var/log/mysqld.log
# 輸出: temporary password for root@localhost: XyZ#Abc123

# 2. 登入修改 (需 --connect-expired-password)
mysql -uroot -p'XyZ#Abc123' --connect-expired-password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;

方案三:mysql_secure_installation 交互式重置

mysql_secure_installation
# 流程:
# 1. 輸入當前密碼 (或臨時密碼)
# 2. 設置驗證插件? N (建議使用 caching_sha2_password 原生)
# 3. 修改 Root 密碼? Y -> 輸入新密碼
# 4. 移除匿名用戶? Y
# 5. 禁止 Root 遠程? Y
# 6. 移除 test 庫? Y
# 7. 重載權限? Y

方案四:Docker 容器環境重置

# 運行中的容器
docker exec -it mysql_container mysql -uroot -p
# 容器內執行 ALTER USER

# 或環境變量重置 (需重建容器)
docker run -d \
  -e MYSQL_ROOT_PASSWORD=NewStrongPass123! \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0

# 現有數據卷重置密碼
docker run --rm \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0 \
  mysqld --initialize-insecure --user=mysql
# 然後正常啟動容器,Root 無密碼,進入後 ALTER USER

版本差異關鍵點對比

項目5.65.78.0
密碼列passwordauthentication_stringauthentication_string
PASSWORD() 函數支援支援 (棄用)**移除**
默認認證插件mysql_native_passwordmysql_native_passwordcaching_sha2_password
密碼策略無validate_password (可選)內建 validate_password
臨時密碼無有 (初始化生成)有

常見錯誤與修正

錯誤 1:ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
原因:password_expired=Y。解決:執行 SET PASSWORD = 'newpass' 或 ALTER USER ... IDENTIFIED BY 'newpass'
錯誤 2:ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'
原因:用戶不存在或 Host 不匹配。解決:SELECT User, Host FROM mysql.user WHERE User='root'; 確認 Host 值
錯誤 3:修改密碼後應用連接失敗
原因:認證插件不匹配。解決:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass'; (兼容舊驅動)
錯誤 4:FLUSH PRIVILEGES 後仍無效
原因:skip-grant-tables 模式下授權表不生效。解決:必須退出該模式重啟正常服務

安全建議

  1. 生產環境**禁用 Root 遠程**,創建專用應用用戶
  2. 密碼存儲於密碼保險箱 (Vault/Sealed Secrets),不寫入代碼/配置文件
  3. 定期輪換 (90 天),自動化掃描過期用戶
  4. 啟用審計日誌 audit_log 記錄所有密碼修改操作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved