删除铁律
禁止程序物理删除数据
特别是商业数据,SaaS 产品,都不能通过系统直接物理删除。
软删除
- 根据删除条件,查询数据 ID,通过 ID 批量软删除;
- 禁止通过子查询、联表查询来更新数据(会存在性能问题,且数据不好批量还原);
- 所有删除数据的操作,必须有 jira 留痕;
- 同批数据涉及多个 jira 时,必须在当前 jira 备注历史 jira 地址。
-- modified_by 例如:Jira008-20180808-01
UPDATE `table` SET `is_deleted` = 1, `modified_by` = 'jira 编号 + 版本号', `modified_on` = NOW() WHERE `is_deleted` = 0 AND `id` IN ('xxxxxxxxxxxx');
硬删除(物理删除)
避免数据库无效数据不断增长,定期清理软删除的历史数据。
除了物理删除历史数据,还有以下做法:
1. 分布式数据库(扩容)
2. 冷热数据存储(分离)
3. 增量备份,不停服处理
这里仅注重介绍物理删除的规范
- 提前通知交付、区域、客户;
- jira 留痕,备注执行流程;
- 提前发起停服公告(凌晨停服);
- 区分需要保留的历史数据;
- 凌晨停止对外服务并执行删除操作:
- nginx 跳转停服公告页面;
- 备份数据库;
- 导出被软删除 2 年以上的数据(历史备份),
- 物理删除被软删除 2 年以上的数据;
- 团队、区域及时验证数据。
- 验证通过恢复产品使用。
修改数据
- 必须通过 jira 留痕;
- 根据修改条件,备份原始数据(修改出错可马上还原);
- modified_by = 'jira 编号 + 版本号';
- 禁止通过子查询、联表查询来更新数据;
- 通过自定义脚本,生成更新 SQL;
- 如果需要还原,根据备份数据,生成还原 SQL。