背景場景
在 Ubuntu 系統中使用 apt
或 deb
包方式安裝 MySQL 8 時:
- 初次安裝后會自動初始化數據庫;
- 但 沒有提示 root 初始密碼;
- 導致
mysql -u root -p
無法登錄。
為了解決該問題,通常我們使用 --skip-grant-tables
方式跳過權限認證進入 MySQL,然后手動修改 root 密碼,但這可能導致 權限表異常殘留,重啟后仍可免密登錄。
解決方案總覽
我們將通過三步徹底修復這個問題:
- 啟動 MySQL,跳過權限校驗,進入無密碼模式;
- 清空 root 用戶,重新創建 root 賬戶并配置密碼;
- 恢復配置文件,重啟驗證密碼登錄生效。
步驟一:跳過密碼驗證啟動 MySQL
1. 停止 MySQL 服務
sudo systemctl stop mysql
2. 啟動 MySQL 并跳過授權驗
sudo mysqld_safe --skip-grant-tables --skip-networking &
解釋:
--skip-grant-tables
: 跳過用戶認證;--skip-networking
: 禁止遠程連接(增強安全);&
: 后臺運行。
3. 無密碼登錄 MySQL
mysql -u root
進入后會看到 mysql>
提示符。
步驟二:清除舊 root 用戶并重新配置密碼
1. 刷新權限(激活權限表)
FLUSH PRIVILEGES;
2. 刪除所有舊 root 用戶
DELETE FROM mysql.user WHERE User = 'root';
3. 創建新的 root 用戶(本地登錄)
CREATE USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
4. (可選)允許遠程登錄
CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongPassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
5. 強制刷新權限
FLUSH PRIVILEGES;
6. 退出 MySQL
exit;
步驟三:恢復安全配置并驗證
1. 停止無密碼運行的 mysqld_safe
sudo pkill mysqld
2. 檢查并刪除 my.cnf
中跳過權限的配置項(如有)
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
確保 [mysqld]
部分中 沒有 skip-grant-tables
。
3. 重啟 MySQL
sudo systemctl restart mysql
4. 使用密碼登錄驗證
mysql -u root -p
# 輸入上面新設置的密碼
常見問題解答
為什么刪除了配置后還是免密?
mysql.user
表中舊的 root 用戶沒有密碼,權限系統仍然允許直接登錄。
為什么 CREATE USER 失敗?
--skip-grant-tables
模式下權限未激活,部分語句需要先執行 FLUSH PRIVILEGES
。
ALTER USER
或 UPDATE user
不生效?
可能是因為權限表沒刷新、字段錯誤(MySQL 8 使用 authentication_string
字段),或因為之前的 root 用戶已經損壞。
總結
步驟 | 關鍵操作 |
---|---|
跳過驗證 | --skip-grant-tables 模式啟動 |
修復 root | 刪除 + 重新創建 + 設置密碼 |
權限生效 | FLUSH PRIVILEGES 是關鍵命令 |
安全恢復 | 移除配置、重啟服務、驗證密碼 |
該方案適用于無法找到初始密碼、root 用戶權限損壞等問題,是 MySQL 密碼修復最穩妥的方式。
附加建議
- 修改密碼后建議立即執行:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
- 建議設置復雜密碼,并定期備份
mysql.user
表; - 如部署環境建議開啟
skip-name-resolve
提升性能。