1. mysql权限介绍
mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表,我当前的版本mysql 5.7.26 。
mysql权限表的验证过程为: 先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。
通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
2.权限管理
查看mysql的授权列表
show privileges;
授权sql语法:
语法:
8.0以前的版本:
grant 权限 on 对象 to 用户 identified by '密码';
8.0+的版本:
create user 用户 identified by '密码';
grant 权限 on 对象 to 用户;
grant 权限1,权限2,权限3,....... on 对象 to 用户 identified by '密码';
grant 权限1,权限2,权限3,....... on 对象 to 用户 identified by '密码' with grant option;
权限说明:
all :一般为管理员才拥有的权限
权限1,权限2,权限3,。。 :普通用户(业务用户,开发用户)
grant option :给别的用户授权
对象范围: 库,表
*.* : ----> 所有的库所有的表 管理员才拥有的权限
db.* -----> 指定的库所有的表 普通用户一般都授予这个权限
db.t1 : -----> 某个库的某个表
3. 授权的例子
例子1:创建并授权管理员用户xy,能够通过10.0.0.%网段登录并管理数据库
grant all on *.* to xy@'10.0.0.%' identified by '123' with grant option;
# aLL 是表示所有权限,你也可以使用select、update等权限。
# on 用来指定权限针对哪些库和表。
# *.* 中前面的*号用来指定数据库名,后面的*号用来指定表名。
# to 表示将权限赋予某个用户。
# xy@'10.0.0.%' 表示xy用户,@后面接允许的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。
# identified by指定用户的登录密码。
# with grant option这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定with grant option选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。
#使用这个命令使权限生效,尤其是你对那些权限表user、db、host等做了update或者delete更新的时候。以前遇到过使用grant后权限没有更新的情况,只要对权限做了更改就使用FLUSH PRIVILEGES命令来刷新权限。
flush privileges; #刷新权限表
查询用户 select user,host from mysql.user;
查询某个用户权限 show grants for xy@'10.0.0.%';
select * from mysql.user\G
例子2:创建并授权一个app@'10.0.0.%'业务用户,能够对app库下所有对象进行create,select,update,delete,insert操作
mysql> grant create,update,select,insert,delete on app.* to app@'10.0.0.%' identified by '123';
mysql> show grants for app@'10.0.0.%';
回收权限
注意:mysql 中不能通过重复授权,修改权限,只能通过回收权限方式进行修改
例子:
mysql>revoke create on app.* from 'app'@'10.0.0.%';
mysql>show grants for app@'10.0.0.%';
删除用户:
# drop user app@'10.0.0.%';
例子3:数据库超级管理员 密码忘记了,处理步骤;
--skip-grant-tables: 跳过授权表
--skip-networking : 跳过TCP/IP连接
(1.)关闭数据库
systemctl stop mysqld
(2)使用安全模式启动
mysqld_safe --skip-grant-tables --skip-networking &
或者:
service mysqld start --skip-grant-tables --skip-networking
(3)登录数据库并修改密码
#mysql
mysql> alter user root@'localhost' identified by '123'; 此时会报错,因为前面已经加了参数跳过验证授权了。
mysql>flush privileges; 手动加载授权表到内存
mysql> alter user root@'localhost' identified by '123';
(4)重启数据库
serice mysqld restart