用户权限管理
用户 增: mysql> create user 'nxr'@'10.0.0.%' identified by '123'; 查: mysql> desc mysql.user; ----> authentication_string mysql> select user ,host ,authentication_string from mysql.user 改: mysql> alter user 'nxr'@'10.0.0.%' identified by '456'; 删: mysql> drop user oldboy@'10.0.0.%'; 授予权限 mysql> grant all on wordpress.* to wordpress@'10.0.0.%' identified by '123'; all: SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE ALL : 以上所有权限,一般是普通管理员拥有的 with grant option:超级管理员才具备的,给别的用户授权的功能 权限作用范围: wordpress.* 数据库.表 用户名@'白名单' 超级管理员 grant all [privileges] on *.* to 'root'@'%' with grant option; 普通用户 grant select,update,insert,delete on *.* to app@'%' identified by '123'; 复制用户 grant REPLICATION SLAVE,REPLICATION CLIENT on *.* to 'replic'@'%' 授予复制账号REPLICATION CLIENT权限,复制用户可以使用 SHOW MASTER STATUS, SHOW SLAVE STATUS和 SHOW BINARY LOGS来确定复制状态。 授予复制账号REPLICATION SLAVE权限,复制才能真正地工作。 回收权限 revoke all privileges on *.* from 'ua'@'%'; 全局权限 全局权限,作用于整个 MySQL 实例,这些权限信息保存在 mysql 库的 user 表里 1. 磁盘上,将 mysql.user 表里,用户’ua’@’%'这一行的所有表示权限的字段的值都 修改为‘Y’; 2. 内存里,从数组 acl_users 中找到这个用户对应的对象,将 access 值(权限位)修改 为二进制的“全 1”。 在这个 grant 命令执行完成后,如果有新的客户端使用用户名 ua 登录成功,MySQL 会为 新连接维护一个线程对象,然后从 acl_users 数组里查到这个用户的权限,并将权限值拷 贝到这个线程对象中。之后在这个连接中执行的语句,所有关于全局权限的判断,都直接 使用线程对象内部保存的权限位。 db权限 基于库的权限记录保存在 mysql.db 表中,在内存里则保存在数组 acl_dbs 中。这条 grant 命令做了如下两个动作: 1. 磁盘上,往 mysql.db 表中插入了一行记录,所有权限位字段设置为“Y”; 2. 内存里,增加一个对象到数组 acl_dbs 中,这个对象的权限位为“全 1”。 每次需要判断一个用户对一个数据库读写权限的时候,都需要遍历一次 acl_dbs 数组,根 据 user、host 和 db 找到匹配的对象,然后根据对象的权限位来判断。 正常grant,或revoke后,没有必要使用flush privileges 因为flush privileges 命令会清空 acl_users 数组,然后从 mysql.user 表中读取数据重新加 载,重新构造一个 acl_users 数组。也就是说,以数据表中的数据为准,会将全局权限内 存数组重新加载一遍。如果内存的权限数据和磁盘数据表相同的话,不需要执行 flush privileges。会同时修改数据表和内存。 如果使用DML语句直接操作系统权限表会导致内存中的数据与数据表中数据不一致,就需要使用flush privileges 同步数据。