亲,你有没有遇到过线上需要刷数据的需求,比如把xxx值给我升级xxx。下面我就讲一下mysql稳定的刷数据,保证数据库的平稳无波动
首先有两种方案
一:手撕程序执行修改数据,job执行修改,需要测试,上线,时间不等人要求让你异常的烦躁。
二:手写一个mysql函数跑一下完事。但是你还担心大批量数据下,造成数据库不稳定,造成整个应用抖动。整不好的话,整个数据库锁上了,这个你哭喊出"完犊子了,这下彻底完犊子了"。
来,我给你一个经过实战考验的mysql函数,oracle也可以参考
#一个有道德的函数定义描述
create procedure 一个有意义的函数名字()
BEGIN
#最小值
DECLARE minId int default 0;
#最大值
DECLARE maxId int default 0;
#每次处理的数据量大小,也可以参数传入
declare incrementNum int default 5000;
select
min(主键),
max(主键)
into minId, maxId
from 表名
where 约定条件1 = '约定条件值1' and 约定条件2 = '约定条件值2';
WHILE minId <= maxId DO
BEGIN
SET minId = minId + incrementNum;
UPDATE 表名
SET 需要修改的字段1 = '目标值1', 需要修改的字段2 = '目标值2'
where 主键 >= minId - incrementNum
and 主键 < minId
and 约定条件1 = '约定条件值1'
and 约定条件2 = '约定条件值2';
COMMIT;
END;
END WHILE;
END;
call 一个有意义的函数名字();
当然函数也可以有参数传入,自己处理。经过生产三千万级数据考验的脚本,请放心使用吧。建议在测试或者开发环境跑一下。
当然大家可以举一反三,可以物理/逻辑删除数据,可以插入数据,可以修改数据,当然了也可以在环境中初始化数据。
最后大家慎用数据库新建函数进行数据处理,一招不慎,满盘皆输。稳有稳的道理。如果非要使用函数处理,请测试清楚,然后请DBA做好备份吧,这是最后的一道防线了。让我们对生产充满敬畏。
提醒:
1:请务必要写好设计文档并切评审,来不及就紧急评审。务必谨记。
2:执行完成后,别忘了删除函数哦。做事要有闭环。