在 MariaDB / MySQL 中最常見的原因就是:這個帳號其實已經存在,只是你用 SELECT 或肉眼看的時候沒發現。
常見的幾種隱藏情況:

帳號真的存在(最常見)
之前手動刪除過,但只刪了 mysql.user 卻沒 FLUSH PRIVILEGES;
帳號在 mysql.db、mysql.tables_priv 等其他權限表有殘留紀錄,但 mysql.user 沒有(dump 還原或手動搞亂時會發生)
極少數情況是權限表損壞或 replication 不一致

 

建議一步一步處理(從最簡單開始)

請依序執行以下指令(要在有管理權限的帳號下,例如 root):

SQL
-- 步驟 1:先確認到底存不存在
SELECT User, Host, authentication_string 
FROM mysql.user 
WHERE User = 'roundcube' AND Host = 'localhost';
如果有任何一行 → 代表帳號存在 → 直接跳到步驟 3

如果完全沒資料 → 繼續往下

SQL
-- 步驟 2:再檢查其他權限表有沒有殘骸(常見於 roundcube 安裝失敗後)
SELECT * FROM mysql.db         WHERE User = 'roundcube';
SELECT * FROM mysql.tables_priv WHERE User = 'roundcube';
SELECT * FROM mysql.columns_priv WHERE User = 'roundcube';
如果上面有資料 → 代表有「殘留權限」 → 需要先清除
SQL
-- 步驟 3:強制刪除(最保險的做法)
DROP USER IF EXISTS 'roundcube'@'localhost';
FLUSH PRIVILEGES;
刪完後再馬上試一次建立:
如果還是失敗(比較少見)
再執行一次更徹底的清理:
SQL– 刪除所有相關殘留
DROP USER IF EXISTS ’roundcube’@’localhost’;
DELETE FROM mysql.user WHERE User = ’roundcube’ AND Host = ‘localhost’;
DELETE FROM mysql.db WHERE User = ’roundcube’;
DELETE FROM mysql.tables_priv WHERE User = ’roundcube’;
DELETE FROM mysql.columns_priv WHERE User = ’roundcube’;
FLUSH PRIVILEGES;

額外建議(尤其是 roundcube 安裝時)

Roundcube 官方安裝建議的語法通常是這樣寫的(比較安全):

SQL
CREATE USER 'roundcube'@'localhost' IDENTIFIED BY '??????????????????????????????';
GRANT ALL PRIVILEGES ON roundcubemail.* TO 'roundcube'@'localhost';
FLUSH PRIVILEGES;
或是用更現代的寫法(MariaDB 10.2+ / MySQL 8+ 相容):
SQL
CREATE USER IF NOT EXISTS 'roundcube'@'localhost' 
IDENTIFIED WITH mysql_native_password 
個人頭像照片

By 伍 芳左

MIS, ERP Pro...

發佈留言