1. 过程

商城在做促销活动的时候,由于用户数过大,部分表索引没建,导致数据库cpu使用率达到100%,订单表自增主键ID被不同的订单重复使用,旧数据被新数据覆盖。

2.原因背景

2.1 数据库表引擎

数据库使用innodb引擎。

InnoDB:InnoDB类型的数据表将表最后的ID存储在内存里面。当数据库重新启动服务器后,内存里面的数据清空,自增的ID将重新按照现有表的纪录计算

MyISAM:最大纪录ID保持在文件里,即使重启了服务器,下次插入新纪录的时候,自增ID通过读取文件获得

2.2 主备切换

数据库使用率爆满,导致数据库触发高可用机制,进行高可用(HA,High Availability)切换,理论上做HA切换的时候,两边数据一致才会进行切换

两个原因混合一起导致了这个问题。

3. 解决思路

不太可能还引擎,另外主备切换,从文件里面也读取不到。

另外这个是主备切换的时候触发的,主备之间同步延迟,好像没有办法。

原来设计表大多数是通过主键ID去关联,以后是否考虑新增一个字段去关联维护(这个不能解决主备切换,数据丢失的问题)。