mysql中创建与管理用户账户的基本语法

来源:这里教程网 时间:2026-02-28 20:38:19 作者:

创建 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'
),这点常导致“明明授权了却连不上”的问题。

相关推荐