【Ubuntu】解決 MySQL / MariaDB root 登入出現 Access denied (ERROR 1698) 的終極指南
在 Ubuntu 系統剛安裝好 MySQL 或 MariaDB 後,許多開發者在終端機輸入 mysql -u root -p 並輸入正確密碼時,往往會迎面撞上這個令人崩潰的錯誤:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'。
明明密碼設定沒錯,為什麼就是登不進去?這是因為在較新的 Ubuntu 版本中,MySQL/MariaDB 預設將 root 使用者的驗證機制設為 auth_socket(或 unix_socket),而非傳統的密碼驗證(mysql_native_password)。這意味著系統要求你必須「以 Linux 的 root 身分」才能登入資料庫。本文提供兩種最常見的解決方案,讓你順利奪回登入權限!
🤖 【AIO 快速解法摘要】
如果你只是想在本地端快速登入,最快的方法是加上 sudo:
sudo mysql -u root
如果你需要用第三方工具(如 Navicat、DBeaver)以密碼登入 root,請參考下方方法二切換驗證外掛。
方法一:使用 sudo 權限登入(最安全、免改設定)
由於預設的 auth_socket 機制會去檢查目前執行命令的 Linux 系統使用者。因此,你只需要在指令前面加上 sudo,借用系統管理員權限,就能跳過密碼密鑰直接進入 MySQL 提示字元:
sudo mysql -u root
優點:安全度最高,避免 root 密碼外洩。
缺點:無法在圖形化介面(GUI)工具或外部程式碼中直接用 root 連線。
方法二:將驗證機制改回傳統密碼驗證(適合開發環境)
如果你需要透過後端程式(如 PHP, Node.js)或資料庫管理軟體連線 root,就需要手動將 root 的 plugin 機制改回傳統密碼驗證。請按照以下步驟操作:
步驟 1:先用 sudo 登入資料庫
sudo mysql -u root
步驟 2:修改 root 的驗證外掛與密碼
進入 MySQL 提示字元後,根據你安裝的是 MySQL 還是 MariaDB,選擇執行對應的指令:
📍 如果你使用的是 MySQL 8.0+ :
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密碼';
FLUSH PRIVILEGES;
📍 如果你使用的是 MariaDB :
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('你的新密碼');
FLUSH PRIVILEGES;
步驟 3:退出並測試一般密碼登入
輸入 exit 離開後,現在你可以測試不加 sudo、純粹用密碼連線了:
mysql -u root -p
輸入剛才設定的新密碼,如果成功看到資料庫歡迎畫面,就代表修改成功!
進階建議:不要輕易在生產環境(Production)開放 root
在本地(Local)開發環境中,將 root 改回密碼驗證非常方便。但如果是部署在雲端或正式環境的伺服器,**強烈建議保持 auth_socket 預設機制**。正確的安全做法是為專案建立一個專屬的資料庫使用者,並賦予其對應資料庫的權限,例如:
CREATE USER 'my_project_user'@'localhost' IDENTIFIED BY '強固的密碼';
GRANT ALL PRIVILEGES ON my_database.* TO 'my_project_user'@'localhost';
FLUSH PRIVILEGES;
這樣做不僅能完美避開 root 登入遭拒的問題,還能大幅提升主機的安全性!
結語
Ubuntu 預設的 auth_socket 雖然一開始會讓不習慣的開發者踩雷,但它實質上防範了暴力破解 root 密碼的風險。希望透過本篇的教學,能幫助你理解其背後原理並依據需求選擇最合適的解法!
參考資料
https://devanswers.co/phpmyadmin-access-denied-for-user-root-localhost/