MariaDB用户权限管理 #
一、用户管理概述 #
1.1 权限系统结构 #
text
MariaDB权限系统
├── 用户账户
│ ├── 用户名
│ └── 主机名
├── 权限类型
│ ├── 全局权限
│ ├── 数据库权限
│ ├── 表权限
│ └── 列权限
└── 角色系统
└── 权限集合
1.2 权限表 #
| 表名 | 说明 |
|---|---|
| user | 用户账户和全局权限 |
| db | 数据库级别权限 |
| tables_priv | 表级别权限 |
| columns_priv | 列级别权限 |
| procs_priv | 存储过程权限 |
二、创建用户 #
2.1 CREATE USER #
sql
-- 创建用户
CREATE USER 'user1'@'localhost';
-- 创建用户并设置密码
CREATE USER 'user2'@'localhost' IDENTIFIED BY 'password123';
-- 创建可远程访问的用户
CREATE USER 'user3'@'%' IDENTIFIED BY 'password123';
-- 创建特定IP访问的用户
CREATE USER 'user4'@'192.168.1.%' IDENTIFIED BY 'password123';
-- 使用密码插件
CREATE USER 'user5'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password123');
2.2 主机名模式 #
sql
-- 主机名模式说明
'user'@'localhost' -- 只能本地连接
'user'@'127.0.0.1' -- 只能通过127.0.0.1连接
'user'@'%' -- 任何主机
'user'@'192.168.1.%' -- 192.168.1网段
'user'@'%.example.com' -- example.com域名
2.3 查看用户 #
sql
-- 查看所有用户
SELECT user, host FROM mysql.user;
-- 查看当前用户
SELECT CURRENT_USER();
SELECT USER();
三、修改用户 #
3.1 修改密码 #
sql
-- 修改自己的密码
SET PASSWORD = PASSWORD('new_password');
-- 修改其他用户密码
SET PASSWORD FOR 'user1'@'localhost' = PASSWORD('new_password');
-- MariaDB 10.4+ 语法
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'new_password';
3.2 重命名用户 #
sql
-- 重命名用户
RENAME USER 'user1'@'localhost' TO 'newuser'@'localhost';
-- 同时修改主机
RENAME USER 'user1'@'localhost' TO 'user1'@'%';
3.3 锁定/解锁用户 #
sql
-- 锁定用户
ALTER USER 'user1'@'localhost' ACCOUNT LOCK;
-- 解锁用户
ALTER USER 'user1'@'localhost' ACCOUNT UNLOCK;
-- 查看用户状态
SELECT user, host, account_locked FROM mysql.user;
四、删除用户 #
4.1 DROP USER #
sql
-- 删除用户
DROP USER 'user1'@'localhost';
-- 删除多个用户
DROP USER 'user1'@'localhost', 'user2'@'localhost';
-- 如果存在则删除
DROP USER IF EXISTS 'user1'@'localhost';
五、授予权限 #
5.1 GRANT语法 #
sql
GRANT privilege_type ON object TO user;
5.2 全局权限 #
sql
-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
-- 授予特定全局权限
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'user'@'localhost';
-- 常用全局权限
-- ALL PRIVILEGES: 所有权限
-- CREATE USER: 创建用户
-- RELOAD: 重新加载权限
-- SHUTDOWN: 关闭服务器
-- SUPER: 超级权限
-- PROCESS: 查看进程
-- REPLICATION CLIENT: 复制客户端
-- REPLICATION SLAVE: 复制从库
5.3 数据库权限 #
sql
-- 授予数据库所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'localhost';
-- 授予数据库特定权限
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'user'@'localhost';
-- 授予多个数据库权限
GRANT ALL PRIVILEGES ON mydb1.* TO 'user'@'localhost';
GRANT ALL PRIVILEGES ON mydb2.* TO 'user'@'localhost';
5.4 表权限 #
sql
-- 授予表权限
GRANT SELECT, INSERT ON mydb.users TO 'user'@'localhost';
-- 授予所有表操作权限
GRANT ALL PRIVILEGES ON mydb.users TO 'user'@'localhost';
5.5 列权限 #
sql
-- 授予列权限
GRANT SELECT (id, name), UPDATE (name) ON mydb.users TO 'user'@'localhost';
5.6 存储过程权限 #
sql
-- 授予执行权限
GRANT EXECUTE ON PROCEDURE mydb.my_procedure TO 'user'@'localhost';
-- 授予函数执行权限
GRANT EXECUTE ON FUNCTION mydb.my_function TO 'user'@'localhost';
5.7 WITH GRANT OPTION #
sql
-- 允许用户授权给其他用户
GRANT SELECT ON mydb.* TO 'user'@'localhost' WITH GRANT OPTION;
六、撤销权限 #
6.1 REVOKE语法 #
sql
REVOKE privilege_type ON object FROM user;
6.2 撤销示例 #
sql
-- 撤销全局权限
REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'localhost';
-- 撤销数据库权限
REVOKE INSERT, UPDATE ON mydb.* FROM 'user'@'localhost';
-- 撤销表权限
REVOKE SELECT ON mydb.users FROM 'user'@'localhost';
-- 撤销GRANT OPTION
REVOKE GRANT OPTION ON mydb.* FROM 'user'@'localhost';
-- 撤销所有权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost';
七、查看权限 #
7.1 SHOW GRANTS #
sql
-- 查看当前用户权限
SHOW GRANTS;
-- 查看指定用户权限
SHOW GRANTS FOR 'user'@'localhost';
7.2 查询权限表 #
sql
-- 查看用户全局权限
SELECT * FROM mysql.user WHERE User = 'user1';
-- 查看数据库权限
SELECT * FROM mysql.db WHERE User = 'user1';
-- 查看表权限
SELECT * FROM mysql.tables_priv WHERE User = 'user1';
八、角色管理 #
8.1 创建角色 #
sql
-- MariaDB 10.0+ 支持角色
-- 创建角色
CREATE ROLE 'read_only';
CREATE ROLE 'read_write';
CREATE ROLE 'admin_role';
-- 创建角色时指定权限
CREATE ROLE 'app_role';
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_role';
8.2 授予角色权限 #
sql
-- 给角色授权
GRANT SELECT ON mydb.* TO 'read_only';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'read_write';
GRANT ALL PRIVILEGES ON mydb.* TO 'admin_role';
8.3 分配角色给用户 #
sql
-- 给用户分配角色
GRANT 'read_only' TO 'user1'@'localhost';
GRANT 'read_write' TO 'user2'@'localhost';
GRANT 'admin_role' TO 'admin'@'localhost';
-- 分配多个角色
GRANT 'read_only', 'read_write' TO 'user3'@'localhost';
8.4 激活角色 #
sql
-- 查看当前激活的角色
SELECT CURRENT_ROLE();
-- 激活角色
SET ROLE 'read_only';
SET ROLE 'read_write';
-- 激活所有角色
SET ROLE ALL;
-- 取消所有角色
SET ROLE NONE;
-- 设置默认角色
SET DEFAULT ROLE ALL TO 'user1'@'localhost';
8.5 撤销角色 #
sql
-- 撤销用户的角色
REVOKE 'read_only' FROM 'user1'@'localhost';
-- 撤销角色的权限
REVOKE SELECT ON mydb.* FROM 'read_only';
8.6 删除角色 #
sql
-- 删除角色
DROP ROLE 'read_only';
DROP ROLE IF EXISTS 'read_only';
九、权限刷新 #
9.1 FLUSH PRIVILEGES #
sql
-- 刷新权限(重新加载权限表)
FLUSH PRIVILEGES;
-- 注意:直接修改权限表后需要刷新
-- 使用GRANT/REVOKE会自动刷新
十、安全最佳实践 #
10.1 密码策略 #
sql
-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';
-- 设置密码策略
SET GLOBAL validate_password_length = 8;
SET GLOBAL validate_password_policy = 'MEDIUM';
-- 密码过期
ALTER USER 'user'@'localhost' PASSWORD EXPIRE;
-- 设置密码过期时间
ALTER USER 'user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
10.2 最小权限原则 #
sql
-- 只授予必要的权限
-- 应用用户:SELECT, INSERT, UPDATE, DELETE
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'localhost';
-- 只读用户:SELECT
GRANT SELECT ON mydb.* TO 'readonly'@'localhost';
-- 管理用户:特定数据库的所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'db_admin'@'localhost';
10.3 限制访问 #
sql
-- 限制主机访问
CREATE USER 'user'@'192.168.1.100' IDENTIFIED BY 'password';
-- 限制连接数
CREATE USER 'user'@'localhost'
IDENTIFIED BY 'password'
WITH MAX_QUERIES_PER_HOUR 100
MAX_UPDATES_PER_HOUR 50
MAX_CONNECTIONS_PER_HOUR 10
MAX_USER_CONNECTIONS 5;
10.4 审计日志 #
sql
-- 启用审计插件
INSTALL SONAME 'server_audit';
-- 配置审计
SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE';
SET GLOBAL server_audit_logging = 'ON';
-- 查看审计配置
SHOW VARIABLES LIKE 'server_audit%';
十一、常见场景 #
11.1 创建应用用户 #
sql
-- 创建应用专用用户
CREATE USER 'myapp'@'%' IDENTIFIED BY 'secure_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'myapp'@'%';
FLUSH PRIVILEGES;
11.2 创建只读用户 #
sql
-- 创建只读用户
CREATE USER 'readonly'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON mydb.* TO 'readonly'@'%';
FLUSH PRIVILEGES;
11.3 创建备份用户 #
sql
-- 创建备份用户
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, LOCK TABLES, SHOW VIEW, RELOAD ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;
11.4 创建复制用户 #
sql
-- 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
十二、总结 #
用户管理要点:
| 操作 | 语法 |
|---|---|
| 创建用户 | CREATE USER |
| 修改用户 | ALTER USER |
| 删除用户 | DROP USER |
| 授予权限 | GRANT |
| 撤销权限 | REVOKE |
| 查看权限 | SHOW GRANTS |
| 刷新权限 | FLUSH PRIVILEGES |
最佳实践:
- 遵循最小权限原则
- 使用强密码
- 限制主机访问
- 定期审计用户权限
- 使用角色简化权限管理
下一步,让我们学习备份与恢复!
最后更新:2026-03-27