事情经过:
原表有两个字段的联合唯一索引unique key
,因业务变更这两个字段不再唯一,需要去掉唯一索引。考虑到其中一个字段不仅作为唯一索引,还当作查询索引使用,去掉这个唯一索引,要新加这个字段的普通索引。
于是提了ddl数据库变更,删除唯一索引,新增普通索引。事故因此发生,当删除唯一索引后,还没来得及执行新增普通索引,数据库连接池就被占满了,导致页面所有请求都发生异常!
表中有500W数据,理论删除和新增索引都很快10s内可以完成。问题就出在了删除唯一索引后,系统的MQ处理任务有大量的根据某个字段查询更新的任务在执行,导致没了索引后任务变得相当慢,大量任务堆积占满了数据库连接池,系统崩溃。。。要知道,在没了索引的情况下,500W数据量下根据某个字段查询那是相当的慢。。。还没来得及执行新增普通索引系统l就已经崩溃了。临时解决方法就是停止系统,杀掉数据库查询和更新的事务,把新增普通索引ddl执行后再重启系统应用,系统会恢复正常。至于丢失的数据再想办法补吧。
结论:
这件事,告诉我们,删除数据库索引一定要慎重。即使一定要做,先要明确删除索引后带来的影响性,更换索引一定要遵循先增加后删除的原则,才能避免类似的事故发生。
踩过的坑——MySQL删除索引要慎重
最新推荐文章于 2024-11-17 08:30:00 发布