首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

CentOS 7 RPM 安裝 MySQL 5.7 後 root 無法登錄?官方文檔揭秘跳過授權表重置密碼正確姿勢

     編輯:MySQL 綜合教學

CentOS 7 RPM 安裝 MySQL 5.7 後 root 無法登錄?官方文檔揭秘跳過授權表重置密碼正確姿勢

CentOS 7 通過官方 RPM 包(mysql57-community-release-el7-7.noarch.rpm)安裝 MySQL 5.7 後,首次啟動會生成隨機臨時密碼並寫入錯誤日志。許多開發者習慣性嘗試空密碼或 123456 登錄,導致 ERROR 1045 (28000): Access denied。本文給出官方標準解決流程,避開網上過時的 skip-grant-tables 手動修改 user 表大坑。

現象確認

$ mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost'

正確流程:利用 systemd 環境變量跳過授權表

  1. 停止服務:
    sudo systemctl stop mysqld.service
  2. 設置環境變量啟動參數(關鍵步驟,MySQL 5.7 systemd 單元支援):
    sudo systemctl set-environment MYSQLD_OPTS="--user=mysql --skip-grant-tables --skip-networking"
  3. 啟動服務(此時 mysqld 以 --skip-grant-tables 運行):
    sudo systemctl start mysqld.service
  4. 無密碼登錄並修改密碼:
    mysql -u root mysql
    mysql> UPDATE mysql.user SET authentication_string=PASSWORD('NewStrongPass#2024') WHERE user='root' AND host='localhost';
    mysql> FLUSH PRIVILEGES;
    mysql> QUIT;
  5. 清除環境變量並正常重啟:
    sudo systemctl unset-environment MYSQLD_OPTS
    sudo systemctl restart mysqld.service
  6. 驗證新密碼:
    mysql -u root -p'NewStrongPass#2024' -e "SELECT VERSION();"

為什麼不用傳統 mysqld_safe --skip-grant-tables &?

  • Systemd 管理的服務若直接後台運行 mysqld_safe,會導致雙進程衝突、PID 文件衝突、systemd 認為服務啟動失敗並嘗試重啟,陷入死循環。
  • systemctl set-environment 是 systemd 原生機制,參數會傳遞給 ExecStart,完美融合啟動流程。

補充:獲取臨時密碼的替代方案(不想改密碼時)

MySQL 5.7 首次啟動會在錯誤日志中輸出隨機密碼:

sudo grep 'temporary password' /var/log/mysqld.log
# 輸出示例:2024-01-15T08:30:00.123456Z 1 [Note] A temporary password is generated for root@localhost: xYz#Abc123

使用該隨機密碼登錄後,MySQL 強制要求修改密碼(SET PASSWORD = 'NewPass';)方可執行其他操作。

MySQL 8.0 差異提示

  • 密碼字段為 authentication_string(同 5.7)。
  • 默認加密插件為 caching_sha2_password,舊客戶端需指定 mysql_native_password。
  • 重置密碼 SQL 建議用 ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass';。

避坑清單

  1. ❌ 直接編輯 /etc/my.cnf 添加 skip-grant-tables → 需重啟兩次,且易忘記刪除導致安全隱患。
  2. ❌ 手動殺進程後用 mysqld_safe --skip-grant-tables & → systemd 會拉起新實例衝突。
  3. ✅ 使用 systemctl set-environment MYSQLD_OPTS="..." → 單次生效、自動清理、無殘留。
  4. ✅ 修改密碼後務必 FLUSH PRIVILEGES; 並 unset-environment 重啟。

遵循官方 systemd 機制,一分鐘搞定 root 密碼重置,安全又優雅。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved