MySQL 透過 mysql 系統資料庫內的授權表實施存取控制,分兩階段:
user、host、password,決定是否允許連線。db、tables_priv、columns_priv、procs_priv)判斷是否具備對應權限(SELECT、INSERT、DROP 等)。| 表名 | 範圍欄位 | 權限欄位 |
|---|---|---|
user | Host, User, Password | Select_priv, Insert_priv, ..., Shutdown_priv, File_priv 等全域權限 |
db | Host, Db, User | 資料庫層級權限 |
host | Host, Db | 輔助 db 表,用於主機名通配 |
tables_priv | Host, Db, User, Table_name | Table_priv(表層級) |
columns_priv | Host, Db, User, Table_name, Column_name | Column_priv(欄位層級) |
procs_priv | Host, Db, User, Routine_name, Routine_type | Proc_priv(存儲程序權限) |
注意:mysql.user 表缺少「建立時間」欄位,無法直接查知帳號建立時間,排查連線問題時需結合日誌分析。
-- 一般帳號
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
-- 指定認證插件 (MySQL 5.5.7+)
CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH my_auth_plugin;
-- 使用密碼雜湊值避免明文寫入日誌
CREATE USER 'tom'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';

GRANT SELECT, UPDATE ON *.* TO 'testUser'@'localhost' IDENTIFIED BY 'testpwd';

INSERT INTO mysql.user (host, user, password) VALUES ('localhost', 'customer1', PASSWORD('customer1'));
若報錯 Field 'ssl_cipher' doesn't have a default value,需補齊所有 NOT NULL 無預設值欄位。
DROP USER 'testUser'@'localhost';
-- 或
DELETE FROM mysql.user WHERE Host='localhost' AND User='testUser';
FLUSH PRIVILEGES;
-- 方式 1: mysqladmin
mysqladmin -u root -p password 'newpwd'
-- 方式 2: UPDATE user 表
UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
-- 方式 3: SET PASSWORD
SET PASSWORD = PASSWORD('newpwd');
SET PASSWORD FOR 'user'@'host' = PASSWORD('newpwd');
-- 或
GRANT USAGE ON *.* TO 'user'@'host' IDENTIFIED BY 'newpwd';
SET PASSWORD = PASSWORD('newpwd');
以 --skip-grant-tables 啟動 MySQL,跳過權限檢查:
# Linux
mysqld_safe --skip-grant-tables --user=mysql &
# 或
/etc/init.d/mysql start --skip-grant-tables
# Windows: 在 my.ini [mysqld] 區段加入 skip-grant-tables,重啟服務
登入後執行 UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root'; FLUSH PRIVILEGES;,移除參數並重啟。
GRANT ALL ON *.* TO ... 寫入 user 表。GRANT ALL ON db_name.* TO ... 寫入 db, host 表。GRANT ALL ON db_name.tbl_name TO ... 寫入 tables_priv 表。GRANT SELECT (col1) ON db.tbl TO ... 寫入 columns_priv 表。-- 授予 GRANT OPTION 允許轉授權
GRANT SELECT, INSERT ON *.* TO 'grantUser'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
-- 回收特定權限
REVOKE INSERT ON *.* FROM 'grantUser'@'localhost';
-- 查看權限
SHOW GRANTS FOR 'grantUser'@'localhost';
SELECT * FROM mysql.user WHERE User='';
-- 若有資料,立即刪除
DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;

CREATE USER ... IDENTIFIED WITH auth_plugin 多因子認證。MySQL 使用者管理核心在於理解兩階段驗證與多層級授權表。生產環境建議:
SHOW GRANTS 審計權限。FLUSH PRIVILEGES 確保權限表持久化。更多細節可參考《MySQL 權限架構體系》兩張流程圖:客戶端連線認證階段、客戶端操作請求認證階段。
