事件的起因

前段时间因为公司上市后需要进行年度审计,需要做数据库安全合规这方面的IT管理审计。又因为此前有些同事离职的缘故,数据库的某些用户需要做删除处理。于是我也没多想,用root账户内网登录数据库后。直接做了删除操作。便有了这个两行泪的故事。

在做了删除用户的处理之后,群里立马收到了从库数据库2同步失败的消息通知。此时我感觉事情开始有点不对劲了。于是登录从库2的数据库服务器查看同步status,显示NO,报错信息如下:
告警信息

Last_SQL_Errno: 1396 
Last_SQL_Error: Error 'Operation DROP USER failed for '**'@'%'' on query. Default database: ''. Query: 'drop user **@'%''

我感觉到有些疑惑,为什么我在主库服务器上面删除用户,从库2会受到影响呢?而从库1却没有受到影响?(因为业务的增长,我采用了自建一主两从数据库的架构)

暂时的解决方案

因为线上业务还在运行,为了避免支付回调等场景受到影响,因此我将流量紧急切换到预发布环境,然后重新只上线一主一从两个正常的数据库。
由于同步失败的问题,此时采取忽略错误的方案已经不太建议了。因为从库2的数据已经和主库的数据不一致了。

问题排查

想着出问题的原因是在我进行了用户删除之后。那么我删除用户这个操作就是问题的主因。而我采用的语句如下:

DROP USER ***;

所以问题就来了,因为我删除用户的时候,并没有指定数据库。而是直接处理了线上数据库后直接进行操作。这样在进行DROP的时候,MySQL就会以为我是对线上数据库进行删除。当然从库2此时并没有这个数据。于是同步任务因此中断。

明明有从库1和从库2,为什么就从库2受到了影响呢?
因为从库1是在创建此用户之前就存在的,而从库2是创建此用户之后才加入进来的。

总结和避免

在用管理账户进行此类操作的时候,切记要先use dbname选择了数据库后进行操作。不要直接运行命令。切记,切记,切记。