由于这本书的第二章后面部分和第三章讲的是理论部分,也只是翻看了一下,没有细作笔记。而第四章,则是MYSQL服务器管理中的一个重点。
mysql的相关权限信息主要存储在几个被称为 grant tables 的系统表中,即:mysql.User、mysql.db、mysql.Host、mysql.table_priv 和 mysql.column_priv。由于权限信息数据量比较小,访问有非常频繁,MYSQL在启动的时候,就会将所有的权限信息都加载到内存中,并保存在几个特定的结构里。
所以每次手工修改了相关权限表后,都需要执行 “FLUSH PRIVILEGES”,通知MYSQL重新加载MYSQL权限信息。
不过,如果是通过GRANT、REVOKE 或者DROP USER 命令来修改相关权限,则不需要手工执行 FLUSH PREVILEGES 命令,因为通过这几个命令所做的权限调整,在修改系统表的同事也会更新内存结构中的权限信息。
建议尽量使用GRANT、REVOKE、DROP USER、CREATE USER这几个命令来进行用户和权限的变更操作,尽量减少直接修改grant tables 来实现用户和权限的变更。
要为某个用户授权,可以使用GRANT命令,要去除某个用户的权限则使用REVOKE命令。
MYSQL的权限分为5个级别,分别如下。
1.Global Level
全局权限控制,如果一个权限是Global Level授予的,则会覆盖其他所以级别的相同权限设置,要授予Global Level 权限,只需在执行GRANT命令时,用“ *.* ”指定适用范围是Global Level即可。
2. Database Level
其作用域即为指定整个数据库中的所有对象,有两种方式授予Database Level权限。
(1)当执行GRANT命令时,通过“ database.* ”来限定权限作用域为database整个数据库。如:
GRANT ALTER ON test.* TO 'def'@'localhost';
(2)先通过USE命令选定要授权的数据库,然后通过“ * ”来限定作用域,这样授权的作用域实际上就是当前选定的整个数据库。如:
USE test;
GRANT DROP ON * TO 'def'@'localhost';
3.Table Level
作用范围是授权语句中指定数据库的指定表,如:
GRANT INDEX ON test.t1 TO 'abc'@'localhost';
4.Column Level
作用范围是指定数据库中具体列,授权方式如下:
GRANT SELECT(id, value) ON test.t1 TO 'abc'@'localhost';
其中id,value是指定的授权列名
5.Routine Level
目前只有EXCUTE和ALTER ROUTINE 两种,针对的对象主要是procedure 和 function,当授予权限时,必须指定数据库和相关对象。
在以上5个Level的权限当中,Table、Column、和Routine 三者在授权中所以来的对象必须是已经存在的,不想Database Level,可以再当前不存在改数据库的时候就完成授权。