背景
一次上线过程,搞了一个现网事故,
过程是这样子的,
部署之后,要做一些数据验证,于是对表做了一个备份,计划备份好后,测试一把,再把数据还原。
于是用的是
create table xx01 as select * from xx;
嗯,看到表和数据都被复制了,感觉很美好,
等测试完,
再把 xx drop 掉,把 xx01替换成 xx, 一切仿佛都没发生过,完美。(真是个大聪明)。
于是就这样,上线完了。
--------------------- 分割线 ---------------------
第二天早,现网炸了!
页面很慢,各种响应超时?
什么情况?昨晚的上线应该也不至于造成这么大的影响啊?
就只是改了一个小模块,怎么就整个系统都瘫了呢?
但很肯定的一件事就是昨天的更新部署引发的问题,
但为什么会引起这么大的事情呢。
分析
1、上线了一个导入功能,这个导入功能,导入的数据量动辄数十万一个文件,并且使用的用户比较多。
就是产生了一个相对高并发的一个场景。
2、create table xx01 as select * from xx; 这个语句,只复制了表结构和表数据,
它的主键,唯一键,索引等它是不复制的!!
导致这个表的数据量上来之后,因为索引丢失之后,它的查询性能急剧下降,
又因为是一个高频接口,导致接口积压,越来越慢,最后整个系统都拖垮了。
教训
1、表复制要注意,在现网也轻易不要做这种操作。。。
create table xx01 as select * from xx; 这个语句,只复制了表结构和表数据,不复制主键和索引!
有没有其它的办法可以复制主键和索引呢?
在达梦下面,试了好几种都不太行,等等看吧。。。现状就是记得不能用这种方式去做表复制就是了。
大意了。