一. 概述
MySQL 的权限系统主要用来对连接到数据库的用户进行权限验证, 以此来判断此用户是否属于合法用户, 以及合法用户给予的相应数据库权限. 下面将介绍权限系统的工作原理, 以及将要熟练掌握账号的管理和使用方法(MySQL 版本 5.7).
1.1 权限系统的工作原理
MySQL 权限系统通过两个阶段进行认证:(1) 对连接的用户进行身份认证, 合法的用户通过认证, 不合法的用户拒绝连接;(2) 对通过认证的合法用户赋予相应的权限, 用户可以在这些权限范围内对数据库做相应操作.
对于身份认证, MySQL 是通过 ip 地址和用户名联合进行确认的, 例如在 MySQL 安装后默认创建的用户 root@localhost 表示用户 root 只能从本地 (localhost) 进行连接才可以通过认证, 此用户从其它任何主机上对数据库进行的连接都将被拒绝. 可以说同样一个用户名, 如果来自不同的 ip 地址, 则 MySQL 将视为不同的用户.
如下图所示, MySQL.user 表中第一行的 host 列限定是 localhost 代表本地:
MySQL 权限表在数据库启动的时候就载入内存了, 当用户通过身份认证后, 就在内存中进行相应权限的存取, 这样, 此用户就可以在数据库中做权限范围内的各种操作了.
1.2 权限表的权限介绍
在权限表存取的两个过程中, 系统会用到 "mysql" 数据库 (安装 MySQL 时被创建, 数据库名称叫 "mysql") 中的 user,host,db 这 3 个最重要的权限表(在 MySQL 5.6.7 中删除了 MySQL.host 表).
表名
| user
| db
| 描述
|
用户列
| Host
| Host
| 允许用户登录所使用的 IP
|
| User(对应的用户名称) | Db(对应的库名称) |
|
| Password (5.7 版本 authentication_string)
| User
|
|
权限列
|
|
|
|
| Select_priv
| Select_priv
| 是否通过 SELECT 命令查询数据
|
| Insert_priv
| Insert_priv
| 是否通过 INSERT 命令插入数据;
|
| Update_priv
| Update_priv
| 是否通过 UPDATE 命令修改现有数据
|
| Delete_priv
| Delete_priv
| 是否通过 DELETE 命令删除现有数据 & nbsp;
|
| Create_priv
| Create_priv
| 是否可以创建新的数据库和表
|
| Drop_priv
| Drop_priv
| 是否可以删除现有数据库和表
|
| Reload_priv
|
| 是否可以执行刷新和重新加载 MySQL 所用各种内部缓存的特定命令, 包括日志、权限、主机、查询和表; 重新加载权限表
|
| Shutdown_priv
|
| 是否可以关闭 MySQL 服务器
|
| Process_priv
|
| 是否可以通过 SHOW PROCESSLIST 命令查看其他用户的进程; 服务器管理
|
| File_priv
|
| 是否可以执行 SELECT INTO OUTFILE 和 LOAD DATA INFILE 命令; 加载服务器上的文件
|
| Grant_priv
| Grant_priv
| 是否可以将自己的权限再授予其他用户
|
| References_priv
| References_priv
| 创建外键约束
|
| Index_priv
| Index_priv
| 是否可以创建和删除表索引; 用索引查询表
|
| Alter_priv
| Alter_priv
| 是否可以重命名和修改表结构
|
| Show_db_priv
|
| 是否可以查看服务器上所有数据库的名字, 包括用户拥有足够访问权限的数据库
|
| Super_priv
|
| 是否可以执行某些强大的管理功能, 例如通过 KILL 命令删除用户进程, 使用 SET GLOBAL 修改全局 MySQL 变量, 执行关于复制和日志的各种命令; 超级权限
|
| Create_tmp_table_priv
| Create_tmp_table_priv
| 是否可以创建临时表
|
| Lock_tables_priv
| Lock_tables_priv
| 是否可以使用 LOCK TABLES 命令阻止对表的访问 / 修改;
|
| Execute_priv
| Execute_priv
| 是否可以执行存储过程
|
| Repl_slave_priv
|
| 是否可以读取用于维护复制数据库环境的二进制日志文件; 此用户位于主系统中, 有利于主机和客户机之间的通信; 主服务器管理
|
| Repl_client_priv
|
| 是否可以确定复制从服务器和主服务器的位置; 从服务器管理
|
| Create_view_priv
| Create_view_priv
| 是否可以创建视图
|
Show_view_priv
| Show_view_priv
| 是否可以查看视图
| |
Create_routine_priv
| Create_routine_priv
| 是否可以更改或放弃存储过程和函数
| |
Alter_routine_priv
| Alter_routine_priv
| 是否可以修改或删除存储函数及函数
| |
Create_user_priv
| 是否可以执行 CREATE USER 命令, 这个命令用于创建新的 MySQL 账户
| ||
Event_priv
| Event_priv
| 是否能否创建、修改和删除事件
| |
Trigger_priv
| Trigger_priv
| 是否能否创建和删除触发器
| |
Create_tablespace_priv
| 是否可以创建表空间
| ||
安全列
| |||
ssl_type
| 支持 ssl 标准加密安全字段
| ||
ssl_cipher
| 支持 ssl 标准加密安全字段
| ||
x509_issuer
| 支持 x509 标准字段
| ||
x509_subject
| 支持 x509 标准字段 & nbsp;
| ||
资源控制列
| |||
max_questions
| 每小时允许执行多少次查询
| ||
max_updates
| 每小时可以执行多少次更新
| ||
max_connections
| 每小时可以建立的多少次连接
| ||
max_user_connections
| 单用户可以同时具有的连接数
| ||
安全列
| |||
plugin
| 引入 plugins 以进行用户连接时的密码验证, plugin 创建外部 / 代理用户
| ||
password_expired
| 密码是否过期 & nbsp;(y 已过期)
| ||
password_last_changed
| |||
password_lifetime
| |||
account_locked
|
在这二个表中, 最重要的是 user 表, 其次是 db 表, 在 user 表中通常使用最多的是用户列和权限列, 权限列分为普通权限和管理权限.
普通权限主要用于数据库操作, 如 seelct_priv,create_priv 等.
管理权限主要用来对数据库进行管理的操作包括: Create_tablespace_priv ,Create_user_priv ,process_priv,
Reload_priv, Repl_client_priv , Repl_slave_priv , Show_db_priv ,Shutdown_priv ,super_priv.
最后权限表中权限列, 对应的权限名 (privilege) 如下图所示(在下一章中有用 GRANT 赋予权限时会用到, 例如权限列 Delete_priv 对应的是 DELETE 权限):
详细的权限文档参考:
来源: https://www.cnblogs.com/MrHSR/p/9803629.html