mysql中创建与删除用户的命令与实践

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

创建 MySQL 用户的正确语法与权限控制

MySQL 8.0+ 默认使用

mysql_native_password
插件,且不支持直接在
CREATE USER
中指定密码过期策略或账户锁定状态(这些需后续
ALTER USER
设置)。最安全、兼容性最好的建用户方式是分两步:先创建空密码/随机密码用户,再授权。

CREATE USER 'dev_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass123!';
—— 指定 IP 段访问,避免用
'%' 
开放所有主机(尤其生产)
若需兼容旧客户端(如某些 PHP PDO 连接失败),显式指定认证插件:
CREATE USER 'dev_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Pass123';
创建后必须用
GRANT
显式赋权,MySQL 8.0 不再允许
CREATE USER ... GRANT
合并在一条语句中
最小权限原则:只给
SELECT, INSERT
而非
ALL PRIVILEGES
,例如:
GRANT SELECT, INSERT ON mydb.orders TO 'dev_user'@'192.168.1.%';

删除用户时常见的误操作与恢复风险

DROP USER
是唯一安全删除用户的命令,
DELETE FROM mysql.user
直接删表记录会导致权限系统不一致、缓存未刷新、甚至 mysqld 重启失败。

DROP USER 'old_user'@'localhost';
—— 必须带 host,
'old_user'
'old_user'@'localhost'
是两个不同账户
执行后该用户所有权限自动清除,无需手动
REVOKE
如果误删了 root 或高权限用户,且没有其他管理员账号,只能停库加
--skip-grant-tables
启动修复,非常麻烦
MySQL 8.0 删除用户后,其历史连接不会立即断开,但新连接会被拒绝;可配合
KILL
主动终止残留会话:
KILL 12345;
(ID 来自
SHOW PROCESSLIST;

验证用户是否存在及当前权限范围

别依赖

SELECT * FROM mysql.user
查看用户——字段含义复杂、加密密码不可读、host 匹配逻辑易误解。应使用系统视图和内置命令。

查用户是否存在:
SELECT User, Host FROM mysql.user WHERE User = 'test_user';
查某用户具体权限:
SHOW GRANTS FOR 'dev_user'@'192.168.1.%';
—— 输出的是可重放的授权语句,最直观
查当前登录用户实际生效权限:
SHOW GRANTS;
(不带
FOR
),这对调试连接后权限异常特别有用
注意:
Host
字段支持通配符(如
192.168.%
),但匹配优先级按“最长前缀”规则,
192.168.1.100
会优先匹配
192.168.1.%
而非
%
CREATE USER 'api_user'@'10.0.2.%' IDENTIFIED BY 'ApiToken$2024';
GRANT SELECT, UPDATE ON app_db.users TO 'api_user'@'10.0.2.%';
GRANT SELECT ON app_db.products TO 'api_user'@'10.0.2.%';
FLUSH PRIVILEGES;

最后一行

FLUSH PRIVILEGES
在绝大多数情况下不是必须的——只要用
CREATE USER
/
GRANT
/
DROP USER
等 DDL 命令操作,权限表已自动重载。仅当你手动修改了
mysql.user
表才需要它,而这种做法本身就不该发生。

相关推荐