MySQL在安装时会创建一个管理员账号“root”,“root”只是管理员默认的名字,它拥有着全部的权限。不仅只有“root”,MySQL还可以创建很多其他账号,可以给这些账号分配权限。
大家有没有发现,MySQL自带一个名字为“mysql”的数据库
这是MySQL自带的存储一些系统参数的数据库。里面有一个“user”表:这里面存储的是MySQL所有账号。
字段很多,第一个字段“Host”代表主机名,第二个字段“User”代表用户名,第三个很明显是密码,后面的字段全部表示的能够操作的权限。
为什么会显示三个“root”呢,我们看下表的结构:
它用的是联合主键。
第一个字段“Host”作用蛮大的,MySQL有密码保护,“Host”还可以起到IP限制的作用。
%.%.%.% 基本上任何IP的终端MySQL都允许被请求,“%”是通配符,可以换成具体的IP数字,比如“192.168.%.%”,只有“192.168”开头的IP的终端MySQL允许被请求。
iz25lhu7gndz 这是一个主机名,只有主机名是“iz25lhu7gndz”的终端MySQL允许被请求
localhost、127.0.0.1、::1 这三个都代表本机的作用,只有本机上的终端MySQL才允许被请求
MySQL在安装时root账户会默认这三个host。以前楠神曾遇到过问题,不小心删掉了一个host,PHP脚本与MySQL在同一服务器上,可PHP脚本就是访问不了MySQL,因为请求MySQL的host正是被删掉的,后来加上就OK了。
这节我们主要就是学习怎么对mysql的账户做增删改操作。
我们知道了有关账户的数据都存在user表里,可不可以用cmd或者Navicat对user表直接增删改?
答案是完全可以的。
修改user表后,在终端需要输入flush privileges。
这是因为我们修改的账户数据只是在硬盘里做了改动,而MySQL此时还在内存里运行,内存里的账户数据与硬盘里的账户数据此时还不同步。
flush privileges的作用:
flush privileges 命令的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。MySQL用户数据和权限有修改后,希望在"不重启MySQL服务"的情况下直接生效,那么就需要执行这个命令。通常是在修改ROOT帐号的设置后,怕重启后无法再登录进来,那么直接flush之后就可以看权限设置是否生效,而不必冒太大风险。
以上是直接操作user表,MySQL也提供了一些可操作账户数据的SQL语句——数据控制语言(DCL)。
数据控制,其实就是“分配权限”——就涉及到用户。
则主要就是2个问题:
用户管理:
权限分配:
有哪些权限。
mysql中,权限是系统内定的一些“名词”(单词),大约30个,每个权限表示“可以做什么工作”。
则分配权限就是相当于让某个用户可以做哪些工作。
主要权限如下:
语法形式:
create user '用户名'@'允许其登录的地址' identified by '密码';
说明:
1,创建的用户需同时指定该用户可以在哪个地址进行登录。
其中“%”代表“任何地址”。
2,用户创建之后,自动在mysql的user表中添加了一条记录,但该用户还没有权限。
drop user '用户名'@'允许其登录的地址';
或者直接进入mysql数据库,从user表直接删除:
delete from user where user = '用户名';
修改自己密码:
set password = password('新密码');
修改他人密码(必须有修改权限):
set password for '用户名'@'允许其登录的地址' = password('新密码');
有些版本不支持上面的语句修改密码,可用这个:
ALTER USER '用户名'@'地址' IDENTIFIED BY '新密码'; #使用mysql_native_password加密规则 ALTER USER '用户名'@'地址' IDENTIFIED with mysql_native_password BY '新密码';
grant 权限名1,权限名2, .... on 数据库名.对象名 to ‘用户名’@’允许其登录的地址’ identified by ‘密码’;
说明:
1权限名就是:’select’, ‘update’, ‘delete’,等等。其中ALL 表示“所有权限”,或all privileges也一样
2对象名:就是一个数据库中“装”的东西,表是最常见的,也可以是视图,存储过程,存储函数等。
其中:*.*表示所有数据中的所有对象
某数据库名.*表示该数据库中的所有对象——这个商业上常用。
3,identified by ‘密码’用于给一个用户在此时修改密码,不写也可以,那就不修改密码。
4,但同时该语句也可以创建用户(如果不存在),但此时identified by ‘密码’必须写。
例如:
grant all on *.* to 'nanshen'@'%.%.%.%'; //给nanshen用户在任何地址上所有的权限。
注: 视图、存储过程、存储函数也是MySQL的东西,但不是我们学习的重点,后面会简单介绍。
revoke 权限名1,权限名2, .... on 数据库名.对象名 from ‘用户名’@’允许其登录的地址’ ;
表示从某个用户身上“取消”某些权限(也许还保留了其他权限)。
总结:
本节内容楠神感觉不需要刻意去学,所以我也都没有做演示。大部分项目数据库在创建之初都会分配好账户,以后用的时候可能都很少再去改这部分内容。也就是说用的少,不需要刻意记住。也没什么难度或者影响使用效率什么的,用到的时候再来边学边做都来得及。不影响MySQL的使用效率,但设置不好账户的IP限制和权限限制,还是会出安全问题的,需要注意。