最近业务方觉得业务表int字段精度不够,需要转为decimal。操作的数据库版本是2014,涉及30多张表,其中有9个千万级的大表,还不止改一个字段。这里总结下注意事项和遇到的问题:
- 隐式转换问题:代码对应变量类型要改,关联表字段类型要改,否则就是在制造性能炸弹
- 索引问题:字段上有索引需要先删除,改完类型一定要记得建回去
- 性能问题:删除索引前对应业务sql必须停掉,否则高并发全表扫描瞬间能将资源耗尽
- 阻塞对应表读写:alter过程锁表,对该表的读写操作均会被阻塞 -- 2016支持online修改
- 从库日志应用进程被阻塞:对于从库,如果之前有相应大查询,会阻塞日志应用进程,造成主从延迟
- 慢慢慢慢:alter过程中会有全量update,大表非常耗时
- 日志暴增:大量全量update会导致事务日志暴增,注意磁盘空间,生产库要注意备份截断。
- 日志频繁扩展:一旦使用率接近100%,事务日志只能每次按设置量自动增长(例如每次100M)。如果没有改过这个参数,默认是1M,那会陷入漫长的LATCH_EX(LOG_MANAGER) 等待中,性能更加低下。
- 阻塞系统表读写:大量alter操作期间,对系统表的读写也会被阻塞。如果你在alter过程中才发现事务日志自动增长设的是1M,会发现此时已经查看不了数据库选项,修改自动增长值了,所以最好是事先调整好。
- 主从延迟:大量生成的事务日志要在从库应用,如果主从库性能有差异、或者异地灾备,主从会出现明显延迟,并且可能短时间内难以追平
暂时只想到这么多,如果有不对的或者有更好的修改类型方法,欢迎指正补充。