MySQL 用戶由 用戶名 + 宿主 唯一標識(如 'app'@'10.0.1.%'),支持通配符 %。權限分為 全局權限(實例級)、庫級、表級、列級、存儲程序級、代理用戶 六個層級,存儲於 mysql 系統庫的 user、db、tables_priv、columns_priv、procs_priv、proxies_priv 表中。
CREATE USER 'admin'@'10.0.1.%' IDENTIFIED BY 'SuperStrongPass!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.0.1.%' WITH GRANT OPTION;
CREATE USER 'app_rw'@'10.0.1.%' IDENTIFIED BY 'AppRwPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `biz_db`.* TO 'app_rw'@'10.0.1.%';
CREATE USER 'app_ro'@'10.0.1.%' IDENTIFIED BY 'AppRoPass123!';
GRANT SELECT ON `biz_db`.* TO 'app_ro'@'10.0.1.%';
CREATE USER 'dba_ops'@'10.0.1.%' IDENTIFIED BY 'DbaOpsPass123!';
GRANT RELOAD, PROCESS, SHOW DATABASES, SUPER, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'dba_ops'@'10.0.1.%';
CREATE USER 'placeholder'@'localhost' IDENTIFIED BY 'Pass123!';
GRANT USAGE ON *.* TO 'placeholder'@'localhost'; -- 僅允許連接
適用於批量導入、遷移、自動化腳本。注意:MySQL 8.0+ 授權表結構變化大(user 表無 Password 列,改為 authentication_string),建議優先用 GRANT。
INSERT INTO mysql.user (Host, User, authentication_string, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, ...)
VALUES ('10.0.1.%', 'batch_user', PASSWORD('BatchPass123!'), 'Y','Y','Y','Y','Y','Y', ...);
INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv)
VALUES ('10.0.1.%', 'biz_db', 'batch_user', 'Y','Y','Y','Y','Y','Y');
FLUSH PRIVILEGES;
-- 當前用戶
ALTER USER USER() IDENTIFIED BY 'NewPass123!';
-- 指定用戶(需 UPDATE 權限)
ALTER USER 'app_rw'@'10.0.1.%' IDENTIFIED BY 'NewPass123!';
my.cnf,[mysqld] 區添加 skip-grant-tables。systemctl restart mysqld。mysql -u root。FLUSH PRIVILEGES; -- skip-grant-tables 下必須先執行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPass123!';
skip-grant-tables,再次重啟。INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
SET GLOBAL validate_password.policy = 'STRONG';
| 角色 | 典型權限集 | 禁止權限 |
|---|---|---|
| 應用讀寫 | SELECT, INSERT, UPDATE, DELETE, EXECUTE (單庫) | DROP, ALTER, GRANT, FILE, SHUTDOWN, PROCESS |
| 應用只讀 | SELECT (單庫) | 所有寫權限、管理權限 |
| 開發/測試 | SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX (測試庫) | 生產庫任何權限、GRANT、SHUTDOWN |
| BI/報表 | SELECT (只讀庫/視圖) | 寫權限、PROCESS、FILE |
| 備份賬號 | SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, SHOW VIEW, EVENT, TRIGGER | DROP、ALTER、GRANT |
| 監控賬號 | PROCESS, REPLICATION CLIENT, SELECT ON performance_schema.* | 數據權限、管理權限 |
mysql.user 表:是否有無 Host 限制的 root(Host='%')、匿名用戶(User='')、弱密碼用戶。DROP USER 'old_dev'@'%';。REVOKE DROP ON *.* FROM 'app_rw'@'%';。權限管理的核心是「最小權限、來源可控、定期審計」。將 GRANT 納入基礎設施代碼,通過 Terraform/Ansible 管理,實現權限即代碼,才是現代運維的正確姿勢。