问题描述
今天遇到一个需求:修改MySQL用户的权限,某用户账号之前的IP限定在A IP,后续调整到B IP,环境为MySQL 5.7.19. 如有其它版本与下面测试结果有出入,请以实际环境为准。
update mysql.user set `Host` = '192.168.5.201' where `user` = 'xxx' and `Host` = '192.168.5.67'
结果出现如下报错:
3098 - The table does not comply with the requirements by an external plugin.
在其他同版本实例上执行未出现该错误,查了下,发现是组复制的原因,当前报错实例因为使用MGR架构,不支持MyISAM表,自然也无法对MyISAM引擎的表进行DML操作。
知道原因之后就好解决了:
使用RENAME USER 进行变更(当然这也是更加推荐的方法..)
rename user 'xxx'@'192.168.5.67' to 'xxx'@'192.168.5.201';
一些补充: 修改完到底需不需要flush privileges?
- grant 命令对于全局权限,同时更新了磁盘和内存。命令完成后即时生效,接下来新创建的连接会使用新的权限。也就是说正常grant,revoke之类是不需要flush的..
- 对于一个已经存在的连接,它的全局权限不受 grant 命令的影响
- grant 修改 db 权限的时候,是同时对磁盘和内存生效的
- flush privileges 语句本身会用数据表的数据重建一份内存权限数据,所以在权限数据可能存在不一致的情况下再使用,而这种不一致往往是由于直接用 DML 语句操作系统权限表导致的..
- db权限立即生效的意思是,如果老的连接之前查询过 use database1,即使移除了查询权限,老连接只要不退,仍然可以查询,如show tables等;而如果只是连接到数据库,未使用该表,则权限立即生效,即无法查询;表,列不管之前有没有查询,去除权限后,连接立刻失效,无法查询