前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql。
公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂。。简单是因为网上关于mysql用户,权限管理的帖子很多,
按照上面的做,基本上能解决遇到的问题。复杂是因为如果考虑的特殊的场景,权限管理会让很多新手蛋疼的不要不要的。
mysql权限的基础我在这里就不讲了,大家一艘一大把,我这里主要就我的理解在前人基础上做一些解读。公司用的是mysql5.5,所以我的解读仅限于这个版本。其他版本大家自行实验。
1. %和localhost
grant all on *.* to watf@'%';
grant all on *.* to watf@'localhost';
按照我开始的理解,%是代表所有的主机;localhost本地主机,也就是安装mysql的主机。but,这个理解是有问题的。
用第一种授权方式并没有获得本地主机的权限。所以localhost并不是%的子集, 远程主机和本地主机请分别授权。
2. grant all on *. * to dbtest@'localhost' identified by 'dbtest';
解释:已有dbtest用户,这是在授权兼改密码 ,没有dbtest的情况下是创建带密码用户兼授权。所以还可以用grant命令建用户,改密码,尼玛又多了一项技能有没有。看见不少人授权时用的带密码的方式,我怀疑他们认为这个密码仅仅是用来验证的。假如这个密码输的和原来的不一致,尼玛后面登录不了恐怕他也不知道咋回事。
3. set password for root=password('root') 是否等同于 update mysql.user set password=password('root') where user='root';
看到不少帖子认为这两种改密码的方式是相同的。我想说No,
set password for root=password('root') 等同于 set password for root@'%'=password('root') ,
所以同样应该等同于 update mysql.user set password=password('root') where user='root' and host='%';如果root分别设置了'localhost'和'%'的密码,用第一种改密码方式只会修改远程登录root用户的密码,第二种方式远程和本地登录root用户的密码都会修改。
另外,第一种是系统定义的修改密码的方式,可能会牵扯到多张表或者其他操作,而第二种只是修改了用户表而已,除非有明确的官方说明,修改密码只需要修改用户表,和其他表无关,没有其他多余操作,否则,我真的不建议用第二种方式。
4. drop user aaa;
你以为这个会让aaa用户不能登录么?错,实际上这个只能让远程用户就不能登录,本地用户(如果有的话),照登不误。
原因其实和第一个问题一样,还是%和localhost的区别,因为drop user aaa; 等同于drop user aaa@'%';
另外,有人说可以用delete from mysql.user where user='aaa';这样做确实会让用户不能登录,可以简单的认为删除了用户,但是实际上用户的权限,数据库 都没有删除,这样只是自欺欺人。