1. MariaDB 权限级别介绍
- 全局:可以管理整个MySQL
- 库:可以管理指定的数据库
- 表:可以管理指定数据库的指定表
- 字段:可以管理指定数据库的指定表的指定字段
权限存储在 mysql 库的 user, db, global_priv, tables_priv, columns_priv, procs_priv
几个系统表中,待 mariadb 实例启动后就加载到内存中。
2. User表
user表有39个字段。这些字段可以分为4类:
- 用户列:
用户列包括Host、User、Password,分别表示主机名、用户名和密码。登录用的就是这个用户名与密码; -
权限列:
user表的权限列包括 Select_priv、Insert_priv 等以priv
结尾的字段。
这些字段的值只有Y和N。Y表示该权限可以用到所有数据库上;N表示该权限不能用到所有数据库上;
通常,可以使用GRANT语句为用户赋予一些权限,也可以通过Update语句更新user表的方式来设置权限(但不推荐); -
安全列:
user表的安全列有4个字段:ssl_type、ssl_cipher、x509_issuer、x509_subject;
ssl用于加密;x509标准可以用来标识用户。普通的发行版都没有加密功能。可以使用SHOW VARIABLES LIKE 'have_openssl'
语句来查看是否具有ssl功能。如果取值为DISABLED,那么则没有ssl加密功能。 -
资源控制列:
user表的4个资源控制列是:
max_questions:每小时可以允许执行多少次查询;
max_updates:每小时可以允许执行多少次更新;
max_connections:每小时可以建立多少连接;
max_user_connections:单个用户可以同时具有的连接数;
默认值为0,表示无限制。
2.1 权限列的含义
权限 | 描述 |
---|---|
select_priv | 确定用户是否可以通过SELECT命令选择数据 |
insert_priv | 确定用户是否可以通过INSERT命令插入数据 |
update_priv | 确定用户是否可以通过UPDATE命令修改现有数据 |
delete_priv | 确定用户是否可以通过DELETE命令删除现有数据 |
create_priv | 确定用户是否可以创建新的数据库和表 |
drop_priv | 确定用户是否可以删除现有数据库和表 |
reload_priv | 确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表 |
shutdown_priv | 确定用户是否可以关闭MySQL服务器,将此权限提供给root账户之外的任何用户时,都应当非常谨慎 |
process_priv | 确定用户是否可以通过SHOW |
file_priv | 确定用户是否可以执行select into outfile和load data infile命令 |
grant_priv | 确定用户是否可以将已经授予给该用户自己的权限再授予其他用户,例如,如果用户可以插入、选择和删除foo数据库中的信息,并且授予了GRANT权限,则该用户就可以将其任何或全部权限授予系统中的任何其他用户 |
references_priv | 目前只是某些未来功能的占位符,现在没有作用 |
index_priv | 确定用户是否可以创建和删除表索引 |
alter_priv | 确定用户是否可以重命名和修改表结构 |
show_db_priv | 确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库,可以考虑对所有用户禁用这个权限,除非有特别不可抗拒的原因 |
super_priv | 确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SETGLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令 |
create_tmp_table_priv | 确定用户是否可以创建临时表 |
lock_tables_priv | 确定用户是否可以使用LOCK |
execute_priv | 确定用户是否可以执行存储过程,此权限只在MySQL5.0及更高版本中有意义 |
repl_slave_priv | 确定用户是否可以读取用于维护复制数据库环境的二进制日志文件,此用户位于主系统中,有利于主机和客户机之间的通信 |
repl_client_priv | 确定用户是否可以确定复制从服务器和主服务器的位置 |
create_view_priv | 确定用户是否可以创建视图,此权限只在MySQL5.0及更高版本中有意义 |
show_view_priv | 确定用户是否可以查看视图或了解视图如何执行,此权限只在MySQL5.0及更高版本中有意义Create_routine_priv|确定用户是否可以更改或放弃存储过程和函数,此权限是在MySQL5.0中引入的Alter_routine_priv|确定用户是否可以修改或删除存储函数及函数,此权限是在MySQL5.0中引入的create_user_priv|确定用户是否可以执行CREATE |
event_priv | 确定用户能否创建、修改和删除事件,这个权限是MySQL5.1.6新增的 |
trigger_priv | 确定用户能否创建和删除触发器,这个权限是MySQL5.1.6新增的 |
create_tablespace_priv | 创建表的空间 |
3. 权限管理
3.1. MySQL的各种权限
权限 | 权限级别 | 权限说明 |
---|---|---|
create | create_priv | 数据库、表或索引 |
drop | drop_priv | 数据库或表 |
grant option | grant_priv | 数据库、表、存储过程或函数 |
references | references_priv | 数据库或表 |
alter | alter_priv | 修改表 |
delete | delete_priv | 删除表 |
index | index_priv | 用索引查询表 |
insert | insert_priv | 插入表 |
select | select_priv | 查询表 |
update | update_priv | 更新表 |
create view | create_view_priv | 创建视图 |
show view | show_view_priv | 查看视图 |
alter routine | alter_routine | 修改存储过程或存储函数 |
create routine | create_routine_priv | 创建存储过程或存储函数 |
execute | execute_priv | 执行存储过程或存储函数 |
file | file_priv | 加载服务器主机上的文件 |
create temporary tables | create_temp_table_priv | 创建临时表 |
lock tables | lock_tables_priv | 锁定表 |
create user | create_user_priv | 创建用户 |
process | process_priv | 服务器管理 |
reload | reload_priv | 重新加载权限表 |
replication client | repl_client_priv | 服务器管理 |
replication slave | repl_slave_priv | 服务器管理 |
show databases | show_db_priv | 查看数据库 |
shutdown | shutdown_priv | 关闭服务器 |
super | super_priv | 超级权限 |
3.2. 授权
GRANT语法如下:
GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[,user [IDENTIFIED BY [PASSWORD] 'password']]...
WITH with_option[with_option]
- priv_type参数表示权限类型;
- column_list:参数表示权限作用于哪些列上,没设置则位于整个表上;
- user参数由用户名和主机名构成;形式是"'username'@'hostname'";
- IDENTIFIED BY 参数用于为用户设置密码;
- password:用户新密码;
WITH关键字后面带有一个或多个with_option参数。有5个选项:
- GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
- MAX_QUERIES_PER_HOUR count:设置没消失可以允许执行count次查询;
- MAX_UPDATES_PER_HOUR count:设置每个消失可以允许执行count次更新;
- MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立count个连接;
- MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的count个连接数;
示例:
- 授予
root@'%'
用户全部权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
- 授予
myuser@'%'
用户查询与更改的权限,同时允许其授权给其他用户
GRANT SELECT,UPDATE ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
3.3. 回收权限
收回权限,就是取消某个用户的某些权限。MySQL中使用REVOKE关键字来为用户设置权限。
语法如下:
REVOKE priv_type[(column_list)]
ON database.table
FROM user[,user]
收回全部权限的REVOKE语句的基本语法如下:
REVOKE ALL PRIVILEGES,GRANT OPTION FROM user[,user]...
示例:
- 回收用户myuser的SELECT权限
REVOKE SELECT ON *.* FROM 'myuser'@'%'
- 收回myuser的所有权限:
REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'myuser'@'%'
3.4. 查看权限
SHOW GRANTS 语句用于查看权限。同时mysql数据库下的user表中存储着用户的基本权限。
SELECT * FROM mysql.user;
SHOW GRANTS;