其实 MySQL 中的用户,都存储在系统数据库 mysql 的 user 表中,我们通过 show databases; 查看 mysql 数据库:
然后 use mysql; 使用该数据库,再 show tables; 查看它的表结构,我们发现里面有一张表名为 user 的表,里面存放的就是用户的信息,我们可以使用指令 select * from user 查看该表,但是由于该表太大了,所以我们筛选出重要信息,如 user:用户名;host:表示这个用户可以从哪个主机登陆,如果是 localhost,表示只能从本机登陆;authentication_string:用户密码通过 password 函数加密后的密码,指令为:select user, host, authentication_string from user; 如下图:
其中 host 列中 localhost 表示该用户只能在本地登录,不能远程登录。
语法:create user '用户名'@'登陆主机/ip' identified by '密码';
例如我现在是以 root 用户登录的 mysql,现在要为自己创建一个普通用户,且只能在本地登录,登录密码为 123456;其指令为:create user 'lmy'@'localhost' identified by '123456';
注意,如果我们创建用户时出现以下错误:
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
我们可以刷新一下缓冲区:flush privileges; 即可,如下图:
下面我们查看表中的信息:
我们发现 user 表中插入了我们新建的用户 lmy 的信息,此时我们新建一个终端窗口,尝试使用普通用户 lmy 登录 mysql,如下图:
如图所示,我们也能成功登录 mysql 了,但是当我们查看数据库的时候,会发现与 root 相比,很多数据库在 lmy 用户看来是不可见的,这就涉及了权限问题,我们后面再介绍,如下图:
那么我们可以设置从本地登录,也就是说也可以设置从远端登录咯?答案是可以的,我们在上一篇 数据库基础 中有介绍过远端登录的语法,但是我们会发现登录不上,这是因为该普通用户设置了不可远端登录的缘故,那么接下来我们将设置该用户可以在远端登录,即可以在任意地方使用主机 ip 登录。
其实我们想要更改用户的权限或者其它东西,只需要在 user 表中修改即可,那么现在我们需要修改用户的登录方式,可以直接修改表中的 host 列,指令为:update user set host='%' where user='lmy'; 其中 % 表示该用户可以在任意地方使用主机 ip 登录,接下来查看结果:
如上,表中的 host 确实修改成功了,接下来我们就可以使用上一篇博客中的从远端登录 mysql 啦。
注意,修改表中的数据我们需要使用指令:flush privileges; 刷新一下缓冲区即可。
如果我们不想修改表中的数据,我们也可以在创建用户的时候给它设置成可以远端登录,指令为:create user 'lmy'@'%' identified by '123456' ,然后再刷新缓冲区即可,如下图:
语法:drop user '用户名'@'主机名';
如我们要删除上面用户中的 lmy 用户,可以使用指令:drop user 'lmy'@'%'; 如下图:
再查看表中的信息时,发现已经被删除了:
语法:set password=password('新的密码');
例如我们现在使用 lmy 登录 mysql,要修改自己的密码,如下所示修改成功:
语法:set password for '用户名'@'主机名'=password('新的密码');
例如我们现在是 root 用户,我们再将 lmy 的密码改回 123456,如下修改成功:
注意,此时我们已经为普通用户设置了密码,也要为 root 设置密码,同时也要给之前的配置文件 my.cnf 中的 skip-grant-tables 去掉。不然在登录时会出现问题。
刚创建的用户没有任何权限,需要给用户授权,例如上面我们创建了 lmy 用户,但是使用 lmy 登录 mysql 时查看到的数据库却只有一个,说明我们没有查看 root 创建的数据库的权限,因为其它数据库都是 root 创建的。
语法:grant 权限列表 on 库名.对象名 to '用户名'@'登陆位置'
说明:
权限列表,多个权限用逗号分开
grant select on ... grant select, delete, create on .... grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限
*. * 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
例如我们现在使用 root 用户创建一个 root_create 的数据库:
我们是 root 可以查看到该数据库,但是我们切换到普通用户 lmy 尝试查看一下却没有:
所以我们需要给 lmy 用户授权 root_create 数据库下所有文件的select 权限,指令为:grant select on root_create.* to 'lmy'@'localhost';
接下来我们在 lmy 查看数据库:
发现我们可以使用 lmy 用户查看该数据库了!注意我们上面给 lmy 用户授权的是只读权限!其它权限一律没有!
我们可以查看用户现有的权限,使用指令:show grants for 'lmy'@'localhost';
如果发现赋权限后,没有生效,执行指令:flush privileges;
接下来我们尝试给 lmy 用户授予全部权限:grant all on *.* to 'lmy'@'localhost';
接下来我们登录 lmy 查看数据库,发现所有的数据库都能查看了:
如果赋权限后,没有生效,执行指令:flush privileges;,再不行就重新登录一下。
语法:revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
假设我们需要回收 lmy 用户的只读 root_create 的权限:revoke select on root_create.* from 'lmy'@'localhost';
我们再回到 lmy 端查看就发现看不到 root_create 数据库了:
如果需要取消 lmy 的所有权限,指令为:revoke all on *.* from 'lmy'@'localhost';