在数据库日常运维中,我们经常会遇到需要删除包含用户手机号、身份证号、银行卡号等敏感信息的数据记录的需求。如果直接执行删除语句,可能会因为操作失误、备份残留等问题导致敏感信息泄露,也不符合数据合规的相关要求。因此更稳妥的处理方式是先对目标数据完成脱敏处理,再执行删除操作,从流程上降低敏感信息泄露的风险。

数据脱敏的基本逻辑
数据脱敏是指对敏感信息进行变形处理,保留数据的格式特征但去除可识别的敏感内容。比如手机号可以保留前3位和后4位,中间替换为星号;身份证号保留前6位和后4位,中间替换为星号。在删除数据前执行脱敏,即使后续出现数据恢复、备份泄露等情况,也不会暴露原始敏感信息。
MySQL环境下的实现方式
MySQL中可以通过UPDATE语句结合字符串函数先完成脱敏,再执行DELETE操作。以下是处理用户表敏感信息的示例:
-- 假设用户表user_info包含id、phone、id_card字段,需要删除id小于100的记录 -- 第一步:先对目标记录的敏感字段脱敏 UPDATE user_info SET phone = CONCAT(SUBSTRING(phone, 1, 3), '****', SUBSTRING(phone, -4)), id_card = CONCAT(SUBSTRING(id_card, 1, 6), '********', SUBSTRING(id_card, -4)) WHERE id < 100; -- 第二步:执行删除操作 DELETE FROM user_info WHERE id < 100;
PostgreSQL环境下的实现方式
PostgreSQL的字符串处理函数和MySQL略有差异,脱敏时可以使用LEFT、RIGHT和REPEAT函数组合实现:
-- 同样处理用户表user_info的敏感数据删除场景 -- 第一步:脱敏目标记录 UPDATE user_info SET phone = LEFT(phone, 3) || '****' || RIGHT(phone, 4), id_card = LEFT(id_card, 6) || '********' || RIGHT(id_card, 4) WHERE id < 100; -- 第二步:删除数据 DELETE FROM user_info WHERE id < 100;
操作注意事项
- 执行脱敏和删除操作前,一定要先对目标数据做备份,避免误操作导致数据无法恢复。
- 脱敏规则需要和业务的合规要求匹配,不同敏感类型的脱敏规则可能不同,比如银行卡号的脱敏规则通常和手机号有区别。
- 如果删除的数据量较大,建议分批次执行脱敏和删除,避免单次操作占用过多数据库资源,影响线上业务正常运行。
- 操作完成后可以抽样查询备份数据,确认脱敏是否生效,避免脱敏逻辑错误导致敏感信息未被处理。
事务保障操作原子性
如果希望脱敏和删除操作要么同时成功要么同时失败,可以将两个操作放在同一个事务中执行,以MySQL为例:
-- 开启事务 START TRANSACTION; -- 脱敏操作 UPDATE user_info SET phone = CONCAT(SUBSTRING(phone, 1, 3), '****', SUBSTRING(phone, -4)), id_card = CONCAT(SUBSTRING(id_card, 1, 6), '********', SUBSTRING(id_card, -4)) WHERE id < 100; -- 删除操作 DELETE FROM user_info WHERE id < 100; -- 确认无误后提交事务,出错则执行ROLLBACK回滚 COMMIT;
通过先脱敏再删除的流程,可以在满足数据清理需求的同时,最大程度降低敏感信息泄露的风险,也更符合数据安全相关的规范要求。