一:mysql数据库中用户表查看。(环境:阿里云centos7.4,虚拟机centos7.8)


        


1.需要以root用户登入,在mysql数据库中有一张mysql.user表是存储MySQL中所有用户的信息表,所以可以直接操作这个表的数据就可增加和删除用户; 修改完关键数据后,要执行刷新权限:flush privileges;




2.先use选定mysql这个数据库,在查看user这张表,下图是Navicat查看user表的一部分记录


2.1    mysql> show databases;


        

查看mysql用户列表 mysql 查看用户表_数据库




2.2    mysql> use mysql;


        

查看mysql用户列表 mysql 查看用户表_查看mysql用户列表_02




2.3    查看用户信息表:(user表的字段很多,下面只查看 用户、密码 及用户可以登录的位置简单查看)


         mysql> select Host, User,Password from user;


         

查看mysql用户列表 mysql 查看用户表_阿里云_03


          


2.4    mysql.user表中Host为%的含义


        Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1。这里的意思就是说root用户只能通过192.168.1.1的客户端去访问。


        而%是个通配符,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连接。


        如果Host=%,表示所有IP都有连接权限。


        这也就是为什么在开启远程连接的时候,大部分人都直接把Host改成%的缘故,为了省事。  






二:mysql数据库添加用户(有两种形式):


1.只创建用户(也是以root权限操作)


1.1    语法:create user 用户名 identified by '密码';


        mysql> create user yongheng0852 identified by '111111';


         上面的命令创建了用户yongheng0852,密码是111111。在mysql.user表里可以查看到新增用户的信息:


        mysql> select Host, User,Password from user;


        

查看mysql用户列表 mysql 查看用户表_查看mysql用户列表_04


1.2    此时 yongheng0852 这个用户未被授权访问数据库的权限,所以我们使用这个账号登录时,只能看到默认公开的一个数据库(information_schema),(后面111111是密码)


        mysql -u yongheng0852 -p111111


        mysql> show databases;


        

查看mysql用户列表 mysql 查看用户表_查看mysql用户列表_05




1.3    如何授权,我们先看看user用户表的结构,下图字段中以priv为后缀的都是权限操作:


        

查看mysql用户列表 mysql 查看用户表_mysql_06


enum枚举类型的取值为:'N','Y' 默认为'N',这些就是设置权限的,只需要修改相应的属性为Y即可。




2.直接对mysql数据库的user表进行操作


        mysql> insert into mysql.user(Host,User,Password) values(“localhost”,”yongheng0852”,password(“111111″));


        mysql>flush privileges;


        说明:这样就创建了一个名为:yongheng0852 密码为:111111(密码是经过加密的 ) 的用户,


                  不过这样没有权限因为只添加了三个字段(也可根据上面的表格,指定更多字段的权限),也可删除原有用户,再通过grant添 加权限,这里只举例,实际操作参见第三章节的说明。


        mysql>grant all on *.* to yongheng0852@localhost identified by ’111111″;


        mysql>flush privileges;(刷新系统权限表)


       


3.删除用户 :删除用户yongheng0852。




        3.1    只删除用户,保留权限授权信息:


        mysql>delete from mysql.user where user ='yongheng0852’ ;




3.2    删除用户及相关的所以信息:


        mysql> drop user yongheng0852@'%';     删除登录方式为%的永恒0852的所有信息,假如有多个yongheng0852的用户信息,不能一次性删除,只能一条一条删除,必须指定登录方式才能删除(如果想用指令drop user yongheng0852,删除所有yongheng0852用户的信息,是不行的)。


                


3.3    两者区别


                drop user 删除掉的用户不仅将user表中的数据删除,还会删除诸如db和其他权限表的内容。


                而delete(方法1)只是删除了user表的内容,其他表不会被删除,后期如果命名一个和已删除用户相同的名字,权限就会被继承(yongheng0852这个用户,拥有对所有数据库的访问权限,那么我们通过delete方法删掉了yongheng0852这个用户,如果后面再创建一个yongheng0852用户,虽然没有为他分配权限,但是他也继承了,删除前yongheng0852对所有表格的操作权限)。






        3.4    mysql>flush privileges; (刷新系统权限表,在这里无论是添加或是删除操作后必须来个flush privileges;这样才能起作用特别是删除用户后,如果未执行,被删除的用户还可登入,以上都是在MySQL root用户下操作




三.创建新用户并授权数据库访问权限的方式,(也是以root权限操作)


1.    语法:grant 权限 on 数据库对象 to 用户


1.1    MySQL 赋予用户权限命令的简单格式可概括为:


                grant 权限 on 数据库.表 to 用户 


                grant 权限 on 数据库.表 to 用户 identified by "密码"




1.2    关键字说明:


        权限:privileges 表示授予的权限类型,常用的有以下几种类型:(更多权限,请参考上面的user表设计结构)


        a:数据操作:


        → all privileges:所有权限。


        → insert: 增加表的记录。


        → delete:删除权限。


        → update:更新权限。


        → select:读取权限。


        → create:创建权限。


        → drop:删除数据库、数据表权限。


        → index: 建立或删除索引。


        b:全局管理MySQL用户权限:


        →file: 在MySQL服务器上读写文件。


        → process : 显示或杀死属于其它用户的服务线程。


        → reload : 重载访问控制表,刷新日志等。


        → shutdown: 关闭MySQL服务。


        c:特别的权限:


        → ALL: 允许做任何事(和root一样)。


        → USAGE: 只允许登录--其它什么也不允许做,使用create创建普通用户时的权限。




        数据库.表:dbName.tableName表示授予权限的具体库或表,常用的有以下几种选项:


        → *.* :授予该数据库服务器所有数据库的权限。


        → dbName.*:授予dbName数据库所有表的权限。


        → dbName.dbTable:授予数据库dbName中dbTable表的权限。




        用户和主机:username@host表示授予的用户以及允许该用户登录的IP地址。其中Host有以下几种类型:


        → localhost:只允许该用户在本地登录,不能远程登录。


        → %:允许在除本机之外的任何一台机器远程登录。


        → 192.168.1.10:具体的IP表示只允许该用户从特定IP登录。


2.   案例1:开放管理MySQL数据库中所有的权限


2.1       grant的简单使用说明 (冒号左边是指令,冒号右边是说明,使用+连接语句)


            grant:授权 +  all:表示所有权限(包括增 删 改 查等权限)+ *.*:点左边为数据库右边为表名 + to + yhtest:为添加的用户名 + @ + "%”为匹配的所有主机(所有主机都可以连接)+ identified by + yh123:为密码,  (可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限)


2.2       功能1:增加yhtest用户,使用密码yh123登录,并且有所有数据库的所有权限。


        mysql> grant all on *.* to yhtest@'%' identified by 'yh123' ;


        

查看mysql用户列表 mysql 查看用户表_数据库_07


        flush privileges; (刷新系统权限表)


        (执行完会在mysql.user表插入一条记录,1


        查询用户表mysql> select Host, User,Password from user;


        

查看mysql用户列表 mysql 查看用户表_查看mysql用户列表_08


        使用yhtest登录数据库        


         登录情况:成功


         

查看mysql用户列表 mysql 查看用户表_查看mysql用户列表_09


        查看数据库信息:


        

查看mysql用户列表 mysql 查看用户表_数据库_10


        在创建一个数据库:(确认有没有权限),创建数据库成功,删除成功,权限。


        

查看mysql用户列表 mysql 查看用户表_mysql_11


2.3    功能2: 增加yh999用户,该用户只能操作mysql数据库的所有表,拥有所有所有权限,只能在主机IP为192.168.0.10的电脑,使用密码yh123登录。


        mysql> grant all privileges on mysql.* to yh999@'192.168.0.10' identified by "yh123";


        或


        mysql> grant all on mysql.* to yh999@'192.168.0.10' identified by "yh123";        


        (这里不做操作演示)




3.     案例2:开放管理MySQL中具体数据库的部分权限:


        功能1:增加yh888用户,只能操作mysql数据库的user表,只有查询的权限(不能插入,更新,删除,及其他操作),在任何主机上登录,使用密码yh111登录



        mysql> grant select on 数据库.表名 to 用户名@登录主机 identified by “密码”



        mysql>grant select on mysql.user to yh888@'%' identified by 'yh111';


        

查看mysql用户列表 mysql 查看用户表_数据库_12



        确认用户:


        

查看mysql用户列表 mysql 查看用户表_数据库_12



        



        测试:使用yh888 删除一条用户信息:yhtest。



            登录:mysql -u yh888 -pyh111    



            查看数据库信息:mysql> show databases;   这个时候就只能看到mysql(第一个是默认都能看到的),


            

查看mysql用户列表 mysql 查看用户表_数据库_14



            选择数据库:mysql> use mysql;



            查询当前数据库有哪些表:mysql> show tables;


            

查看mysql用户列表 mysql 查看用户表_数据库_15



            因为我们指定了,只能访问user表,所以只能看到这一张表,下面我们在意root用户查看mysql有多少张表:


            

查看mysql用户列表 mysql 查看用户表_数据库_16






            查询用户信息:select Host, User,Password from user;



删除yhtest用户:delete from user where User ='yhtest';


            

查看mysql用户列表 mysql 查看用户表_数据库_17



            错误信息,1142的错误代码就是没有权限:ERROR 1142 (42000): DELETE command denied to user 'yh888'@'localhost' for table 'user'



    






 功能2:用户yh666可以访问所有数据库,只能执行增删改查操作(没有除此之外的其他操作),可以在任何主机登录使用密码yh222登录



             mysql > grant select,insert,update,delete on 数据库.表名 to 用户名@登录主机 identified by “密码”



             mysql > grant select,insert,update,delete on *.* to yh666@"%”identified by “yh222″;



            



功能3:开放管理MySQL中具体数据库的表(testdb.table1)的部分列的权限



                        用户yh1010只能访问student数据库中person表,且只能对id、name、age 这三列进行查询操作(其他列无权限操作),可以在任何主机登录使用密码yh202登录



            mysql > grant select(id, name, age) on students.person to yh1010@'%'identified by "yh202";









四:回收与查看权限






1.回收权限



        revoke all on *.* from yongheng0852@localhost;






2.查看 MySQL 所以用户的权限



        show grants;



3.查看 用户yongheng0852的权限



        查看用户存不存在,mysql> select Host,User,Password from mysql.user;


        

查看mysql用户列表 mysql 查看用户表_mysql_18



        查看权限 mysql> show grants for yongheng0852@%;  (可以不加后面的%号)


        

查看mysql用户列表 mysql 查看用户表_数据库_19



        USAGE :只能登陆,没有对数据的操作权限



        






五:总结






    为了避免"删库跑路"的事情发生,为了MySQL的安全,应该给用户指定相应的权限,


    用于all权限和%的用户是十分危险的,如果知道了用户的密码,那么他就可以在网上的任何一台电脑上登录你的MySQL数据库并对你的数据为所欲为了,


    建议根据业务需要,指定用户访问指定的数据库和表,且限制登录位置,例如:yh用户,只有user表的那几列进行增删改查功能,且指定使用的ip。