MySQL 默認 root 權限過大,生產環境應遵循最小權限原則,為每個應用創建專用賬號。本文梳理用戶全生命周期管理命令與核心原理。
| 操作 | 命令 | 說明 |
|---|---|---|
| 創建用戶 | CREATE USER 'user'@'host' IDENTIFIED BY 'pwd'; | MySQL 5.7.6+ 推薦語法 |
| 授予所有庫所有權限 | GRANT ALL PRIVILEGES ON *.* TO 'user'@'host' IDENTIFIED BY 'pwd'; | 含 GRANT OPTION 需顯式 WITH GRANT OPTION |
| 授予特定庫所有權限 | GRANT ALL PRIVILEGES ON db.* TO 'user'@'host' IDENTIFIED BY 'pwd'; | 常用應用賬號模式 |
| 授予特定權限 | GRANT SELECT, UPDATE ON db.* TO 'user'@'host' IDENTIFIED BY 'pwd'; | 最小權限原則 |
| 回收權限 | REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'host'; | 需精確匹配原授權的庫.表與 host |
| 刷新權限生效 | FLUSH PRIVILEGES; | 修改 mysql 系統表後必執行 |
| 刪除用戶 | DROP USER 'user'@'host'; | MySQL 5.7.6+ 支持 |
| 查看用戶權限 | SHOW GRANTS FOR 'user'@'host'; | 含密碼哈希(5.7+ 隱藏) |
| 查看用戶列表 | SELECT User, Host FROM mysql.user; | host 區分 localhost/%/IP |
CREATE USER 'wp_app'@'10.0.1.%' IDENTIFIED BY 'Str0ngP@ssw0rd'; GRANT SELECT, INSERT, UPDATE, DELETE ON wordpress.* TO 'wp_app'@'10.0.1.%'; FLUSH PRIVILEGES;
結果:該賬號只能從 10.0.1.0/24 網段訪問,僅見 wordpress 庫,無 DDL/DCL 權限。
-- 1. 以 root 登錄 REVOKE ALL PRIVILEGES ON *.* FROM 'wp_app'@'10.0.1.%'; -- 2. 重新精確授權 GRANT SELECT, UPDATE ON wordpress.* TO 'wp_app'@'10.0.1.%' IDENTIFIED BY 'Str0ngP@ssw0rd'; FLUSH PRIVILEGES;
CREATE USER 'report_ro'@'%' IDENTIFIED BY 'ReadOnly2024!'; GRANT SELECT ON *.* TO 'report_ro'@'%'; -- 或限定特定庫 FLUSH PRIVILEGES;
'user'@'host' 組合唯一標識一個賬號。'user'@'localhost' 僅允許本機 Unix Socket 連接;'user'@'%' 允許任意 IP 連接;'user'@'10.0.1.%' 允許特定網段。**權限操作必須精確指定 Host**,否則會誤以為授權失敗(實則是另一條記錄)。
*.*(管理權限、超級權限)db.*db.tableGRANT SELECT (col1, col2) ON db.table TO ...mysql.user、mysql.db、mysql.tables_priv 等系統表。DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1'); FLUSH PRIVILEGES;validate_password 插件,強制長度、複雜度、過期輪換。%。SELECT User, Host FROM mysql.user WHERE User NOT IN ('mysql.sys','root'); 清理僵屍賬號。權限管理是數據庫安全的第一道防線,熟練掌握上述命令與原理,構建纵深防御體系。