mysql权限管理白皮书
1:MySQL权限的工作原理
l 连接验证阶段----确定用户能否连接DB
l 请求验证阶段----确定用户是否有足够权限操作DB
工作过程:连接验证阶段--mysql权限系统检查用户能否允许连接到mysql服务器,根据连接的主机和mysql用户,查询 user表进行连接验证。
请求验证阶段--Mysql权限系统根据用户对DB的所有操作请求,查询可能用到的权限表user,db,host,tables_priv,columns_priv,确定该用户是否有操作权限。
2:权限级别
Mysql权限由如下:
* ALTER: 修改表和索引。
* CREATE: 创建数据库和表。
* DELETE: 删除表中已有的记录。
* DROP: 抛弃(删除)数据库和表。
* INDEX: 创建或抛弃索引。
* INSERT: 向表中插入新行。
* REFERENCE:未使用。
* SELECT: 检索表中的记录。
* UPDATE: 修改现存表记录。
* FILE: 读或写服务器上的文件。
* PROCESS: 查看服务器中执行的线程信息或杀死线程。
* RELOAD: 重载授权表或清空日志、主机缓存或表缓存。
* SHUTDOWN: 关闭服务器。
* ALL: 所有权限,ALL PRIVILEGES同义词。
* USAGE: 特殊的“无权限” 权限
Mysql权限级别:全局级别、数据库级别、表级别、列级别、routine级别
l Global Level :
GlobalLevel 的权限控制又称为全局权限控制,所有权限信息都保存在 mysql.user 表中。 Global Level 的所有权限都是针对整个mysql的,对所有的数据库下的所有表及所有字段都有效。(grant ... on *.* to '用户名'@'IP' [ identifiedby '密码' ] )
l Database Level
DatabaseLevel相比第一个级别,主要少了以下几个权限: CREATE USER,FILE,PROCESS,RELOAD, REPLICATION CLIENT,REPLI CATIONSLAVE,SHOW DATABASES,SHUTDOWN,SUPER和USAGE 这几个权限,没有增加任何权限。(grant ... on db1.* to '用户名'@'IP' [ identifiedby '密码' ] )
l Table Level
TableLevel 的权限作用范围是授权语句中所指定数据库的指定表。仅ALTER,CREATE, DELETE, DROP,INDEX,INSERT,SELECT ,UPDATE 这八种权限。(grant ... on db1.tb1 to '用户名'@'IP' [ identifiedby '密码' ] )
l Column Level
ColumnLevel 级别的权限仅有INSERT , SELECT 和 UPDATE 这三种。( grant select(id, se, rank) on test.yql8 to '用户名'@'IP' [ identified by '密码' ])
l Routine Level
RoutineLevel 的权限主要只有 EXECUTE 和 ALTER ROUTINE 两种,主要针对的对象是procedure 和 function 这两种对象,在授予 Routine Level 权限的时候,需要指定数据库和相关对象。
除了上面几类权限之外,还有一个非常特殊的权限 GRANT,拥有GRANT权限的用户可以将自身所拥有的任何权限全部授予其他任何用户, GRANT 权限的授予方式也和其他任何权限都不太一样,通常都是通过在执行 GRANT授权语句的时候在最后添加 WITH GRANT OPTION 子句达到授予 GRANT 权限的目的。
3:用户分类
根据权限级别,可将用户分类分为两大类:超级用户、普通用户。
超级用户:即拥有Globallevel权限。
普通用户:数据库级用户、表级用户、列级用户、子程序级用户。
4:权限分配
创建超级用户:
方式1:grant all [privileges] on *.* to '用户名'@'IP'[ identified by '密码' ]。
IP可为'host.domain.cn'或者%(匹配任何); '用户名'可为''空,任何用户访问;*.*的第一个*表示数据库,第二个*表示表。
方式2:insert intouser values("IP","name","password","Y","Y",........)
创建普通用户:
DB级用户:grant all [privileges] on test.* to '用户名'@'IP' [ identifiedby '密码' ]。相应修改的系统表有user表、db表。
Table级用户:grant all [privileges] on test.test to '用户名'@'IP' [ identifiedby '密码' ]。相应修改的系统表有user表、tables_priv表。
Column级用户:grant select(id, se, rank) on test.yql8 to '用户名'@'IP' [ identifiedby '密码' ]。相应修改的系统表有user表、tables_priv表、columns_priv表。
子程序级用户: grant execute on procedure/ functiontest.yql8 to '用户名'@'IP';
5:权限回收
l 使用REVOKE。 revokeprivileges on *.* from '用户名'@'IP'。 user表中的条目仍存在。
l 修改权限表。delete from mysql.db where user='*' andhost ='*' and db='*'
6:备有语句
n 查看当前用户权限:showgrants;
n 查看其他用户权限:showgrants for '*'@'*';
n 创建用户:createuser '用户名'@'IP'identified by '密码';
n 修改用户密码:SETPASSWORD FOR用户名@'IP' =PASSWORD('password2')
n 删除用户:dropuser '*'@'*';
n 创建表权限:grantcreate on *.* to '用户名'@'IP';
n 创建临时表权限:grant create temporary tables on *.* to '用户名'@'IP';
n 创建视图权限:grantcreate view on *.* to '用户名'@'IP';
n 创建用户权限:grantcreate user on *.* to '用户名'@'IP';
n 显示视图权限:grantshow view on *.* to '用户名'@'IP';
n 查看主从/服务器状态权限:grant replication client on *.* to '用户名'@'IP'identified by '密码'(show master status ; show slave status)。
n 从服务器读取二进制日志权限:grant replication slave on *.* to '用户名'@'IP'identified by '密码'。(show binlog events; show slave hosts;)
n 文件权限:grantfile on *.* to '用户名'@'IP'identified by '密码'。(可以执行select ..into outfile和load data infile...)
n super权限: grant super on *.* to '用户名'@'IP'identified by '密码'。这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。(清理三天之前的日志:purge master logs before date_sub(now(), interval 3 day); 清理到指定日期的前的日志:PURGEMASTER LOGS BEFORE '2003-04-02 22:46:26')
n 查看/关闭数据库连接:grantsuper on*.*to '用户名'@'IP'。(show processlist)
n 显示数据库列表。show databases
n 显示数据库结构:showtables;
n 显示表结构:describe表名
n 系统用户名:selectSYSTEM_USER()
n 用户名:selectUSER()
n 当前用户名:selectcurrent_user
n 连接用户名:selectsession_user()
n 数据库名:selectdatabase()
n 数据库版本:selectversion()
n 读取本地文件:selectload_file()
n 数据库路径:select@@datadir
n Mysql安装路径:select @@basedir
n 操作系统版本:select@@version_compile_os
n 查询时间: selectnow(); select curdate(); select curtime()