FORMA

用户与权限管理

MySQL 用户与权限管理(基础)

MySQL 通过用户名 + 主机名来唯一标识一个用户账户,并可以授予不同级别的权限(全局、数据库、表、列等)。下面是基础操作。

一、创建用户

sql
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  • username:登录用户名。
  • host:允许该用户从哪个主机连接。
    • 'localhost':仅允许本机连接。
    • '%':允许任意主机连接(注意安全风险)。
    • 也可指定具体 IP 或网段,如 '192.168.1.%'
  • IDENTIFIED BY 'password':设置密码。

示例

sql
-- 创建本地用户(仅本机可登录)
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'SecurePass123';

-- 创建可从任意主机连接的用户(谨慎使用)
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'RemotePass456';

注意:MySQL 8.0 默认使用 caching_sha2_password 插件,旧客户端可能需要调整。可指定插件:IDENTIFIED WITH mysql_native_password BY 'password'

二、授予权限(GRANT)

sql
GRANT privilege1, privilege2 ON database_name.table_name TO 'username'@'host';

权限级别

  • *.*:所有数据库的所有表(全局权限)。
  • database_name.*:指定数据库的所有表。
  • database_name.table_name:指定数据库的指定表。
  • 甚至可指定列(如 SELECT(col1),但较少用)。

常见权限

权限说明
ALL [PRIVILEGES]授予所有可用权限(除 WITH GRANT OPTION 外)
SELECT查询数据
INSERT插入数据
UPDATE更新数据
DELETE删除数据
CREATE创建数据库或表
DROP删除数据库或表
INDEX创建/删除索引
ALTER修改表结构
GRANT OPTION允许将自己的权限授予其他用户(需额外指定)

示例

sql
-- 授予 app_user 对 mydb 数据库所有表的 SELECT 和 INSERT 权限
GRANT SELECT, INSERT ON mydb.* TO 'app_user'@'localhost';

-- 授予管理员全局所有权限,且可授权给其他人
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

-- 授予对特定表的 UPDATE 权限
GRANT UPDATE ON mydb.orders TO 'app_user'@'localhost';

提示:WITH GRANT OPTION 允许该用户将自己拥有的权限转授给其他用户(谨慎授予)。

三、撤销权限(REVOKE)

sql
REVOKE privilege1, privilege2 ON database_name.table_name FROM 'username'@'host';

示例

sql
-- 撤销 app_user 对 mydb 数据库的 INSERT 权限
REVOKE INSERT ON mydb.* FROM 'app_user'@'localhost';

-- 撤销全局权限
REVOKE ALL PRIVILEGES ON *.* FROM 'temp_user'@'%';

注意:REVOKE 只能撤销已授予的权限,不能撤销 GRANT OPTION 本身(需单独指定 WITH GRANT OPTION 的撤销,语法同)。

四、删除用户(DROP USER)

sql
DROP USER 'username'@'host';

示例

sql
DROP USER 'old_user'@'localhost';

如果用户有打开的连接,可能会报错,可先 KILL 连接或强制删除。

五、刷新权限(FLUSH PRIVILEGES)

sql
FLUSH PRIVILEGES;
  • 作用:使之前通过 GRANTREVOKECREATE USER 等命令修改的权限立即生效**(其实这些 DCL 命令会自动刷新,但在某些情况下如果直接操作了权限表,就需要手动刷新)**。
  • 通常在使用 GRANTREVOKE 后不需要手动执行,但如果你手动修改了 mysql.user 表,则需要执行 FLUSH PRIVILEGES

六、查看权限

sql
-- 查看当前用户的权限
SHOW GRANTS;

-- 查看指定用户的权限
SHOW GRANTS FOR 'username'@'host';

示例

sql
SHOW GRANTS FOR 'app_user'@'localhost';

七、完整示例流程

sql
-- 1. 创建用户
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'dev123';

-- 2. 授予权限(开发数据库的所有表的所有权限)
GRANT ALL PRIVILEGES ON devdb.* TO 'dev'@'localhost';

-- 3. 查看权限
SHOW GRANTS FOR 'dev'@'localhost';

-- 4. 测试连接(另开终端)
-- mysql -u dev -p -h localhost

-- 5. 撤销部分权限(例如撤销删除权限)
REVOKE DELETE ON devdb.* FROM 'dev'@'localhost';

-- 6. 删除用户(不再需要)
DROP USER 'dev'@'localhost';

八、安全最佳实践

  • 最小权限原则:只授予用户必须的最小权限(例如只读用户仅 SELECT)。
  • 限制主机:尽量不要使用 '%',而是指定具体的 IP 或应用服务器地址。
  • 强密码:使用复杂密码,避免默认或弱密码。
  • 定期清理:删除不再使用的用户。
  • 避免使用 WITH GRANT OPTION:除非用户真正需要转授权限。
  • 权限分级:生产环境、测试环境、只读备份账号应分开。

通过以上基础命令,可以完成 MySQL 日常的用户管理和权限分配。更复杂的角色管理(MySQL 8.0 支持 CREATE ROLE)属于进阶内容。

参考文献

资料说明
MySQL 8.0 手册官方
数据存储导读学习路径

Series

mysql

1 / 11