数据库内容版本控制

16 versioning postgresql mvcc

我感兴趣的是保持数据库中某些表发生的每个更改的运行历史记录,从而能够重建数据库的历史状态以进行分析.

我正在使用Postgres,这个MVCC似乎我应该能够为此目的利用它,但我找不到任何文档来支持这个.我可以做吗?有没有更好的办法?

任何输入都表示赞赏!

UPD

我已经将丹尼斯的回答标记为答案,因为他确实回答了MVCC是否是我想要的问题.但是,我已经确定的策略详述如下,以防有人发现它有用:

Postgres功能可以满足我的需求:在线备份/时间点恢复.

http://www.postgresql.org/docs/8.1/static/backup-online.html解释了如何使用此功能,但基本上您可以将此"预先写入日志"设置为存档模式,拍摄数据库的快照(比如说) ,在它上线之前),然后不断归档WAL.然后,您可以随时使用日志重播来调用数据库的状态,如果您选择(通过不断重播备用服务器上的新WAL),可以获得热备用的附带好处.

也许这种方法不像其他保存历史记录那样优雅,因为你需要为你想要查询的每个时间点实际构建数据库,但是它看起来非常容易设置并且丢失零信息.这意味着当我有时间改进对历史数据的处理时,我将拥有一切,因此能够将我笨重的系统转换为更优雅的系统.

使其如此完美的一个关键事实是,我的"有效时间"与特定应用程序的"交易时间"相同 - 如果不是这种情况,我只会捕获"交易时间".

在我发现WAL之前,我正在考虑每天拍摄快照或其他东西,但是大尺寸要求和数据丢失并不适合我.

为了快速启动和运行,从一开始就不影响我的数据保留,这似乎是一个完美的解决方案.

Cra*_*ger 9

时间旅行

PostgreSQL的使用刚才这个功能,并称之为"时间之旅".请参阅旧文档.

您可能想要查看spi contrib模块中的某些类似功能.

复合类型审计触发器

我通常做的是使用触发器将更改以及时间戳记录到归档表,并查询这些变量.如果表结构不会改变,您可以使用以下内容:

CREATE TABLE sometable_history(
    command_tag text not null check (command_tag IN ('INSERT','DELETE','UPDATE','TRUNCATE')),
    new_content sometable,
    change_time timestamp with time zone
);
Run Code Online (Sandbox Code Playgroud)

你的版本控制触发器可以只是insert into sometable_history(TG_OP,NEW,current_timestamp)(有一个不同CASEDELETE,NEW没有定义的地方).

hstore审计触发器

如果架构更改为添加新NOT NULL列,那会很痛苦.如果您希望执行类似的操作,请考虑使用a hstore来存档列,而不是复合类型.我已经在PostgreSQL wiki上添加了一个实现.

PITR

如果您想避免对主数据库(增长表等)产生影响,您可以使用连续归档和时间点恢复来记录WAL文件,这些文件可以使用a recovery.conf重播到任何时刻.请注意,WAL文件很大,它们不仅包括您更改的元组,还包括VACUUM活动和其他详细信息.你想要通过clearxlogtail来运行它们,因为如果它们是归档超时的部分段,它们最终会有垃圾数据,那么你需要大量压缩它们以便长期存储.


Den*_*rdy 5

我正在使用 Postgres,这个 MVCC 的东西似乎我应该能够为此目的利用它,但我找不到任何文档来支持这一点。我可以做吗?

并不真地。有一些工具可以查看死行,因为自动清空最终会被回收。

有没有更好的办法?

如果我的问题是正确的,那么您正在考虑记录缓慢变化的维度

您可能会发现这个最近的相关主题很有趣:

时态数据库设计,稍有不同(实时行与草稿行)