現象重現
yum install mysql-server 安裝完成。
systemctl start mysqld 啟動成功。
mysqladmin password '123' 設定密碼。
- 隨後
mysql -uroot -p 輸入 123 或空密碼均無法登入 (Access denied)。
原因分析
- MySQL 5.7+ 預設安裝會產生隨機臨時密碼 (寫在
/var/log/mysqld.log),mysqladmin password 可能修改的是不同 Host 的帳號 (如 root@localhost vs root@127.0.0.1),導致實際登入使用的帳號密碼不符。
password 欄位在 5.7 改為 authentication_string,舊指令相容性存疑。
標準修復流程 (適用 5.7 / 8.0)
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過權限表啟動 (背景、隔離網路)
mysqld_safe --skip-grant-tables --skip-networking &
# 3. 免密登入
mysql -u root
# 4. 重置密碼 (8.0 語法)
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass!23';
-- 若需開放遠端
CREATE USER 'root'@'%' IDENTIFIED BY 'NewStrongPass!23';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 5. 正常重啟
pkill mysqld
systemctl start mysqld
# 6. 驗證
mysql -uroot -p'NewStrongPass!23' -e "SELECT USER(), VERSION();"
一鍵安全初始化 (替代 mysql_secure_installation)
mysql -uroot -p'NewStrongPass!23' -e "
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;"
避坑提醒
- 新安裝 5.7/8.0 請直接看
/var/log/mysqld.log 臨時密碼,用 mysql --connect-expired-password 首次登入改密。
mysqladmin password 僅修改 root@localhost,若透過 127.0.0.1 連線會失效。
- 生產環境禁止 root 遠端登入,建立專用應用帳號並限制 Host。
- 密碼複雜度:
validate_password 元件預設啟用,需滿足長度、大小寫、數字、特殊字元。