1.登录mysql
mysql -uroot -p
2.查看root的grant_priv权限
select user,grant_priv from mysql.user;
+------------------+------------+
| user | grant_priv |
+------------------+------------+
| root | Y |
| stranger01 | N |
| mysql.infoschema | N |
| mysql.session | N |
| mysql.sys | N |
| user1 | N |
+------------------+------------+
3.如果root用户grant_priv的值为No,则需要将其设置为Yes
update mysql.user grant_priv='Y' where user='root';
注意:一定要加上where语句,否则有可能将grant_priv这一整个列的值都设置成Yes
4.如果root用户grant_priv的值是Yes,表明可以授权,接下来将root用户权限设置成真正意义上的超级管理员
update mysql.user set host='%' where user='root';
将root用户的host设置为'%',是为了保证root用户拥有在所有ip或host都能连上该数据库的权限.这样root用户在给其他创建的用户授权的时候,才可以赋予其他用户从任意host或ip访问该数据库的权限.这里就体现出了只能给其他用户赋予自己有的权限,如果自己没有的权限则无法给其他用户赋予.
5.给root用户赋予所有的权限
grant all privileges on *.* to 'root'@'%';
6.刷新一下权限
flush privileges;
为什么要刷新权限?
权限存储在mysql库的user, db, tables_priv, columns_priv, procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中.为了加快登录验证效率,权限信息一般会存储在内存中.我们刷新权限是为了将磁盘上mysql库里的权限信息刷新到内存中去,使我们的授权尽早生效.
7.完成以上步骤后就可以安心使用root用户创造和授权了.
7.1 创建用户'stranger02',可以在任意host或ip上凭借密码'123456'登录mysql
create user 'strange02'@'%' identified by '123456'
7.2 赋予用户'stranger02'对某个数据库中某张表查找和插入的权限
grant select,insert on database_name.table_name to 'stranger02'@'%';
2.权限的回收
0.权限信息一般什么时候会加载到内存?
1.server启动
2.flush privileges,将磁盘的mysql库里的权限信息刷新到内存
3.grant 语句操作后,新的权限信息直接加载到内存
1.查看当前用户的权限
show grants;
show grants for 'user_name'@'host';
2.回收用户的具体权限
revoke privilege_name on db_name.tb_name from 'user_name'@'host';
flush privileges;
#一般回收具体的权限前,先查看一下该用户当前拥有的权限,只有回收赋予过的权限才有效.
3.删除用户(也可以看做是对用户所有的权限进行回收)
delete from mysql.user where user='user_name' and host='host_name';
或者
drop user 'user_name'@'host';
Tips:
一、限管理基本原则是:满足需要的最小权限
二、判断用户是否能登录mysql服务的具体流程
1.查看mysql端口是否被被占用(默认是3306/3307)
netstat -ano|findstr '3307' (-ano : all number own)
2.检查用户名和密码是否正确
mysql -uusername -p
3.检查当前用户的权限
show grants;
4.验证权限
例如建表: create table tb_name (.....);