mysql用户管理

688 阅读4分钟

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  是表示所有权限,你也可以使用selectupdate等权限。
# on 用来指定权限针对哪些库和表。
#  *.* 中前面的*号用来指定数据库名,后面的*号用来指定表名。
# to 表示将权限赋予某个用户。
#  xy@'10.0.0.%' 表示xy用户,@后面接允许的主机,可以是IP、IP段、域名以及%%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。
# identified  by指定用户的登录密码。
# with  grant option这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定with  grant option选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了selectinsert权限。

#使用这个命令使权限生效,尤其是你对那些权限表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-networking3)登录数据库并修改密码
#mysql
mysql> alter user  root@'localhost'  identified  by '123';  此时会报错,因为前面已经加了参数跳过验证授权了。
mysql>flush  privileges;   手动加载授权表到内存
mysql> alter user root@'localhost'  identified  by '123';
(4)重启数据库
serice mysqld restart