如何在 pg_dump 输出离开服务器之前对其进行匿名处理?

Fra*_*eil 5 postgresql heroku pg-dump

出于开发目的,我们将生产数据库转储到本地。这很好,因为数据库足够小。公司在成长,我们希望降低风险。为此,我们希望在数据离开数据库服务器之前对其进行匿名化处理。

我们想到的一种解决方案是在 pg_dump 之前运行语句,但在同一个事务中,如下所示:

BEGIN;
UPDATE users
SET email = 'dev+' || id || '@example.com'
  , password_hash = '/* hash of "password" */'
  , ...;
-- launch pg_dump as usual, ensuring a ROLLBACK at the end
-- pg_dump must run with the *same* connection, obviously

-- if not already done by pg_dump
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

是否有现成的解决方案?我们的数据库托管在 Heroku 上,我们在转储方式上没有 100% 的灵活性。

在下载和变体之前搜索了postgresql 匿名数据转储,但我没有看到任何高度相关的内容。

Bre*_*zar 2

尝试匿名化数据时有四个难题需要解决。我将总结我的一篇关于它的旧博客文章

1:匿名数据的大小可能会增加。例如,如果您有人名,您实际上并不希望所有匿名姓名的长度与原始数据完全相同。如果您在数据发出时更改数据,则意味着解决方案需要了解原始字段名称的长度,以避免数据增长到太大而无法容纳。

2:匿名数据具有不同的统计分布。假设您有一个出生日期字段 - 您可以完全随机化日期,但另一方面它的意义就会小得多,特别是当您尝试进行性能测试时。加...

3:匿名数据破坏了引用完整性。我知道这是一个坏主意,但有时应用程序会加入需要匿名的字段。我讨厌我看到过这种情况,但我看到人们在多个表中使用电子邮件地址,然后期望加入这些表,或找到相关订单。

4:匿名会减慢导出速度。您需要运行某种业务逻辑来确定哪些列需要匿名,然后在其位置生成新数据。

我曾经说过,如果你能解决这个问题,你就会变得富有——但随之而来的是一些竞争。Delphix为 DB2、Oracle、SQL Server 等提供数据屏蔽,但我认为他们还没有覆盖 Postgres 或 Heroku。