背景
今天刷线上数据,需求很简单,DB中有一个字段,需要向缓存中添加。
具体的做法就是,将DB中updatetime字段加1更新一下,从而可以触发同步组件,从DB拉取数据向CKV同步。
过程
看似简单的一个操作,在测试环境实验了多遍之后,第一次在线上环境操作的时候还是踩坑了
看到的现象: 在刷完数据之后,用脚本对比数据发现最后三条数据没有从db向CKV更新。
解决方法: 还好数据量不大,就手动把这三条数据刷了一把。
但是还是要找原因: 原因是在我刷数据的过程中,有人向数据库新添加了三条数据(亏我还选在了晚上来刷)。按照同步组件的原理,这新添加的三条数据应该已经往CKV中同步了。
但是,因为我是先获取数据库中数据量,然后通过主键去遍历更新数据库中的每一条数据。而新添加的这三条数据,根据主键排序在数据库的中间位置,极小概率会出现在数据库的末尾,所以导致原来在数据库的末尾的三条数据超出了更新的范围(更新的范围在初始化时count一把数据库的值)。
根本的解决办法:
- 从第一次的刷新的结束点开始往末尾再刷一下数据
- 全量再刷一遍数据
刷数据的注意点
- 运行脚本的时候,
bash test.sh | tee run.log 2 &
一定要要全量保存日志,方便出错定位 - 一定要写个脚本在刷完数据之后,全量比较一下DB和缓存中的数据是否一致,确保全量更新成功