当列设置为时,Postgres 采取的策略尚不清楚NULL
:
UPDATE tbl SET
col1 = NULL,
col2 = NULL
WHERE created < current_date - INTERVAL '1 year';
文档https://www.postgresql.org/docs/current/mvcc.html有点冗长和技术性,所以我不能可靠地推断:
如果设置为 NULL 或复制受影响的行/页?
看起来任何 UPDATE 都应该为 MVCC 语义创建新行,但如果设置为 NULL 是一种特殊情况怎么办?
对于 GDPR 合规性,我认为将所有个人历史数据都归零,并尝试理解大量周期性的含义UPDATE SET x = NULL
。之后我应该考虑VACUUM
吗?
PostgreSQL 从不
UPDATE
通过修改现有数据来执行。如果您将 columns 设置为NULL
,将像任何其他 一样创建新的行版本UPDATE
,并且之前的行版本将保留直到VACUUM
回收它们。但请注意
VACUUM
如果没有长时间运行的事务仍可能需要旧数据,则只会删除旧行版本。VACUUM
不会覆盖数据,因此旧值仍将保留在磁盘上,直到空间被重新使用。关于 GDPR,措辞是:
该法律没有对“擦除”一词进行定义,因此需要对其进行解释。我敢打赌,很少有人能够充分了解 PostgreSQL 的内部工作原理,从而对
DELETE
擦除进行质疑。并且需要具有高级 PostgreSQL 知识的数据取证专家来检索这些数据。一旦VACUUM
运行,几乎不可能做到这一点。如果我作为专家证人被传唤到法庭,我会说DELETE
在数据库中运行的任何人都已采取一切可能的步骤来删除数据。如果您感到偏执,
VACUUM
请在有问题的桌子上安排一个常规,并确保您没有长时间运行的事务。除此之外的任何担心都是愚蠢的。