概述
租户退出涉及关系数据、文件、缓存、搜索索引和备份。先列出所有保存租户数据的存储,数据库通常是事实来源,但对象存储和搜索索引才是数据意外残留的地方。删除任务必须可重复执行,以便部分失败后继续。
步骤
- 先做只读统计,明确删除范围:
SELECT 'orders' AS table_name, count(*) FROM orders WHERE tenant_id = $1
UNION ALL
SELECT 'invoices', count(*) FROM invoices WHERE tenant_id = $1;
- 在一个事务内按子表到父表顺序删除,并限制语句超时:
BEGIN;
SET LOCAL statement_timeout = '10min';
DELETE FROM invoice_lines
WHERE invoice_id IN (SELECT id FROM invoices WHERE tenant_id = $1);
DELETE FROM invoices WHERE tenant_id = $1;
DELETE FROM orders WHERE tenant_id = $1;
DELETE FROM tenants WHERE id = $1;
COMMIT;
- 事务提交后删除对象存储前缀:
aws s3 rm s3://acme-tenant-data/tenants/42 --recursive。 - 写入删除回执,记录各表删除数量、对象数量、操作人、完成时间和备份到期日。
验证
预期删除后各表统计为 0,对象前缀下列表为空,其他租户数据未受影响。回执应保存在租户 schema 之外,并在客户回复中引用;备份到期后再执行一次检查,确认无法恢复。
注意事项
- 备份和只读副本中的数据会保留到保留期结束,回执中必须明确说明。
- 大租户应分批删除并按 id 记录进度,避免长事务造成 WAL 膨胀和 vacuum 阻塞。
- 外键冲突应通过调整删除顺序解决,不要禁用触发器强行删除。
- 对象存储版本控制会保留旧版本,需依赖生命周期规则过期。