创建 MySQL 用户的正确写法
MySQL 8.0+ 默认使用
caching_sha2_password认证插件,直接用旧版
INSERT INTO mysql.user会失败或导致登录异常。必须用
CREATE USER语句,且需显式指定主机名(不能省略
'localhost'或
'%')。
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_pass123';若允许远程连接,用
'app_user'@'%',但生产环境建议限定具体 IP 段,如
'app_user'@'192.168.1.%'密码必须满足当前密码策略(可通过
SHOW VARIABLES LIKE 'validate_password%';查看),太短或无数字/大小写会报错
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
授权前先确认用户是否存在
重复执行
CREATE USER会报错
ERROR 1396 (HY000): Operation CREATE USER failed。安全做法是先查再建,或用
CREATE USER IF NOT EXISTS(MySQL 5.7.6+ 支持)。 检查用户:
SELECT User, Host FROM mysql.user WHERE User = 'app_user';安全创建:
CREATE USER IF NOT EXISTS 'app_user'@'localhost' IDENTIFIED BY 'strong_pass123';授权后必须执行
FLUSH PRIVILEGES;—— 但仅在直接修改
mysql.user表时才需要;用
GRANT授权会自动刷新权限缓存
GRANT 语句的权限范围与常见陷阱
GRANT不会自动创建用户,必须先
CREATE USER;权限作用域由
ON db_name.table_name明确限定,漏写或写错会导致授权无效。 只给某库读写:
GRANT SELECT, INSERT, UPDATE ON myapp_db.* TO 'app_user'@'localhost';禁止授予
GRANT OPTION给普通应用用户,否则可能越权授权 想授所有库所有表?用
ON *.*,但这是高危操作,DBA 权限才应如此 撤销权限用
REVOKE SELECT ON myapp_db.* FROM 'app_user'@'localhost';,不是
DROP
删除用户与清理残留权限
DROP USER会同时删用户记录和所有权限,比手动删
mysql.user行更安全。但注意:MySQL 8.0+ 删除用户后,其历史权限不会自动从内存中清除,需
FLUSH PRIVILEGES;确保立即生效。 删除用户:
DROP USER 'app_user'@'localhost';如果误删了 root 用户或锁死自己,需用
--skip-grant-tables启动 MySQL 并重置 删除后验证:
SELECT User, Host FROM mysql.user WHERE User = 'app_user';应返回空集
CREATE USER 'report_user'@'192.168.5.%' IDENTIFIED BY 'R3p0rt!2024'; GRANT SELECT ON sales_db.orders TO 'report_user'@'192.168.5.%'; FLUSH PRIVILEGES;
MySQL 的用户权限模型依赖精确匹配
User@Host对,同一个用户名在不同主机上是完全独立的账户。最容易忽略的是主机名通配符行为——
'user'@'%'不匹配 localhost 连接(Unix socket 默认走
'user'@'localhost'),这点常导致“明明授权了却连不上”的问题。
