MySQL 用户与权限管理
MySQL 用户与权限管理 的完整教学讲解。
用户管理
单行写法:创建用户
CREATE USER '<用户名>'@'<主机>' IDENTIFIED BY '<密码>';
-- 创建本地用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPass123!';
单行写法:创建远程用户
CREATE USER '<用户名>'@'%' IDENTIFIED BY '<密码>';
-- 允许从任意主机连接
CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPass123!';
换行写法:指定认证插件(8.0+ 默认)
CREATE USER '<用户名>'@'<主机>' IDENTIFIED WITH caching_sha2_password BY '<密码>';
-- 使用默认 caching_sha2_password 认证插件
CREATE USER 'secure_user'@'%' IDENTIFIED WITH caching_sha2_password BY 'StrongPass123!';
换行写法:使用 mysql_native_password 认证
CREATE USER '<用户名>'@'<主机>' IDENTIFIED WITH mysql_native_password BY '<密码>';
-- 兼容旧客户端的认证方式
CREATE USER 'legacy_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';
单行写法:修改用户密码
ALTER USER '<用户名>'@'<主机>' IDENTIFIED BY '<新密码>';
-- 修改用户密码
ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'NewPass456!';
单行写法:修改当前用户密码
ALTER USER USER() IDENTIFIED BY '<新密码>';
-- 修改当前登录用户密码
ALTER USER USER() IDENTIFIED BY 'NewPass456!';
单行写法:锁定用户
ALTER USER '<用户名>'@'<主机>' ACCOUNT LOCK;
-- 锁定用户禁止登录
ALTER USER 'appuser'@'localhost' ACCOUNT LOCK;
单行写法:解锁用户
ALTER USER '<用户名>'@'<主机>' ACCOUNT UNLOCK;
-- 解锁用户
ALTER USER 'appuser'@'localhost' ACCOUNT UNLOCK;
单行写法:设置密码过期
ALTER USER '<用户名>'@'<主机>' PASSWORD EXPIRE;
-- 强制用户下次登录修改密码
ALTER USER 'appuser'@'localhost' PASSWORD EXPIRE;
单行写法:删除用户
DROP USER [IF EXISTS] '<用户名>'@'<主机>';
-- 删除用户
DROP USER IF EXISTS 'appuser'@'localhost';
单行写法:重命名用户
RENAME USER '<旧名>'@'<主机>' TO '<新名>'@'<主机>';
-- 重命名用户
RENAME USER 'appuser'@'localhost' TO 'webapp'@'localhost';
查看用户
单行写法:查看所有用户
SELECT User, Host FROM mysql.user;
-- 列出所有用户
SELECT User, Host FROM mysql.user;
单行写法:查看当前用户
SELECT CURRENT_USER();
-- 查看当前登录用户
SELECT CURRENT_USER();
换行写法:查看用户权限
SHOW GRANTS FOR '<用户名>'@'<主机>';
-- 查看指定用户权限
SHOW GRANTS FOR 'appuser'@'localhost';
单行写法:查看当前用户权限
SHOW GRANTS;
-- 查看当前登录用户权限
SHOW GRANTS;
权限授予与回收
单行写法:授予所有权限
GRANT ALL PRIVILEGES ON <库>.<表> TO '<用户名>'@'<主机>';
-- 授予某库所有表的所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'localhost';
单行写法:授予指定权限
GRANT SELECT, INSERT, UPDATE ON <库>.<表> TO '<用户名>'@'<主机>';
-- 授予增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.users TO 'appuser'@'localhost';
单行写法:授予全局权限
GRANT <权限> ON *.* TO '<用户名>'@'<主机>';
-- 授予全局 CREATE 权限
GRANT CREATE ON *.* TO 'appuser'@'localhost';
单行写法:授予并允许授权
GRANT <权限> ON <库>.<表> TO '<用户>'@'<主机>' WITH GRANT OPTION;
-- 授予权限并允许该用户授权给他人
GRANT SELECT ON mydb.* TO 'admin'@'localhost' WITH GRANT OPTION;
单行写法:回收权限
REVOKE <权限> ON <库>.<表> FROM '<用户名>'@'<主机>';
-- 回收删除权限
REVOKE DELETE ON mydb.users FROM 'appuser'@'localhost';
单行写法:回收所有权限
REVOKE ALL PRIVILEGES ON <库>.<表> FROM '<用户名>'@'<主机>';
-- 回收某库所有权限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'appuser'@'localhost';
单行写法:刷新权限
FLUSH PRIVILEGES;
-- 直接修改 user 表后刷新权限
FLUSH PRIVILEGES;
常用权限列表
单行写法:授予 DML 权限
GRANT SELECT, INSERT, UPDATE, DELETE ON <库>.* TO '<用户>'@'<主机>';
-- 授予数据操作权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'%';
单行写法:授予 DDL 权限
GRANT CREATE, ALTER, DROP, INDEX ON <库>.* TO '<用户>'@'<主机>';
-- 授予数据定义权限
GRANT CREATE, ALTER, DROP, INDEX ON mydb.* TO 'devuser'@'%';
单行写法:授予只读权限
GRANT SELECT ON <库>.* TO '<用户>'@'<主机>';
-- 授予只读权限
GRANT SELECT ON mydb.* TO 'readonly'@'%';
单行写法:授予备份权限
GRANT SELECT, LOCK TABLES, RELOAD, REPLICATION CLIENT ON *.* TO '<用户>'@'<主机>';
-- 授予 mysqldump 所需权限
GRANT SELECT, LOCK TABLES, RELOAD, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
角色管理(8.0+)
单行写法:创建角色
CREATE ROLE '<角色名>';
-- 创建角色
CREATE ROLE 'app_read';
单行写法:给角色授权
GRANT SELECT ON <库>.* TO '<角色名>';
-- 给角色授予只读权限
GRANT SELECT ON mydb.* TO 'app_read';
单行写法:将角色授予用户
GRANT '<角色名>' TO '<用户名>'@'<主机>';
-- 把角色分配给用户
GRANT 'app_read' TO 'appuser'@'localhost';
单行写法:设置默认角色
SET DEFAULT ROLE '<角色名>' TO '<用户名>'@'<主机>';
-- 设置用户登录后默认激活的角色
SET DEFAULT ROLE 'app_read' TO 'appuser'@'localhost';
单行写法:激活当前角色
SET ROLE '<角色名>';
-- 当前会话激活指定角色
SET ROLE 'app_read';
单行写法:查看当前角色
SELECT CURRENT_ROLE();
-- 查看当前激活的角色
SELECT CURRENT_ROLE();
单行写法:回收角色
REVOKE '<角色名>' FROM '<用户名>'@'<主机>';
-- 从用户回收角色
REVOKE 'app_read' FROM 'appuser'@'localhost';
单行写法:删除角色
DROP ROLE [IF EXISTS] '<角色名>';
-- 删除角色
DROP ROLE IF EXISTS 'app_read';
密码策略
单行写法:查看密码策略
SHOW VARIABLES LIKE 'validate_password%';
-- 查看密码验证插件配置
SHOW VARIABLES LIKE 'validate_password%';
单行写法:设置密码长度
SET GLOBAL validate_password.length = <数值>;
-- 设置最小密码长度
SET GLOBAL validate_password.length = 12;
单行写法:设置密码复杂度
SET GLOBAL validate_password.policy = <级别>;
-- 设置密码策略为中等
SET GLOBAL validate_password.policy = 'MEDIUM';