MySQL 權限系統基於「主機+用戶」二元組,權限分層:全局→庫→表→列→存儲程序。本文梳理 GRANT/REVOKE/SET PASSWORD/DROP USER 完整操作鏈路,涵蓋授權、改密、撤權、刪除用戶四大核心場景,附帶生產環境最佳實踐。
-- 超級管理員(含授權權限) GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'something' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'something' WITH GRANT OPTION; -- 運維帳號(僅管理權限) GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost'; -- 只連接無權限(佔位帳號) GRANT USAGE ON *.* TO 'dummy'@'localhost';
GRANT privileges ON db.tbl TO 'user'@'host' [IDENTIFIED BY 'pwd'] [WITH GRANT OPTION];
privileges:SELECT/INSERT/UPDATE/DELETE/CREATE/DROP/INDEX/ALTER 等,ALL 代表除 GRANT OPTION 外所有權限。db.tbl:*.* 全局,db.* 庫級,db.tbl 表級。host:% 任意主機,localhost 本地 Unix Socket,127.0.0.1 本地 TCP,192.168.1.% 網段。WITH GRANT OPTION:允許被授權用戶再授權,謹慎開啟。-- 開發讀寫權限 GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO 'dev'@'10.0.%' IDENTIFIED BY 'strong_pwd'; -- 唯讀分析權限 GRANT SELECT ON `app_db`.* TO 'analyst'@'%' IDENTIFIED BY 'strong_pwd'; -- 跨庫只讀 GRANT SELECT ON *.* TO 'readonly'@'%' IDENTIFIED BY 'strong_pwd';
SET PASSWORD FOR 'user'@'host' = PASSWORD('newpwd');
-- 5.7.6+ 推薦
ALTER USER 'user'@'host' IDENTIFIED BY 'newpwd';
SET PASSWORD = PASSWORD('newpwd');
-- 或
ALTER USER USER() IDENTIFIED BY 'newpwd';
REVOKE privileges ON db.tbl FROM 'user'@'host';
privileges 可為子集,不必與原 GRANT 完全一致。FLUSH PRIVILEGES。-- 5.7.6+ 標準語法 DROP USER 'user'@'host'; -- 舊版本兼容(直接操作 mysql.user 表) DELETE FROM mysql.user WHERE User='user' AND Host='host'; FLUSH PRIVILEGES;
CRUD,禁止 DROP/TRUNCATE/ALTER。'%',限定應用服務器 IP 段。validate_password 插件,強制長度/複雜度/過期輪換。admin(運維)、app_rw(業務讀寫)、app_ro(只讀)、repl(復制)、monitor(監控)。SELECT User,Host FROM mysql.user WHERE User NOT IN ('root','repl','monitor') 掃描殭屍賬號。