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'
sudo systemctl stop mysqld.service
sudo systemctl set-environment MYSQLD_OPTS="--user=mysql --skip-grant-tables --skip-networking"
sudo systemctl start mysqld.service
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;
sudo systemctl unset-environment MYSQLD_OPTS sudo systemctl restart mysqld.service
mysql -u root -p'NewStrongPass#2024' -e "SELECT VERSION();"
mysqld_safe --skip-grant-tables &?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';)方可執行其他操作。
authentication_string(同 5.7)。caching_sha2_password,舊客戶端需指定 mysql_native_password。ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass';。/etc/my.cnf 添加 skip-grant-tables → 需重啟兩次,且易忘記刪除導致安全隱患。mysqld_safe --skip-grant-tables & → systemd 會拉起新實例衝突。systemctl set-environment MYSQLD_OPTS="..." → 單次生效、自動清理、無殘留。FLUSH PRIVILEGES; 並 unset-environment 重啟。遵循官方 systemd 機制,一分鐘搞定 root 密碼重置,安全又優雅。