我有兴趣保留数据库中某些表发生的每个更改的运行历史记录,从而能够重建数据库的历史状态以进行分析。
我正在使用Postgres,这个MVCC似乎我应该能够为此目的利用它,但我找不到任何支持这个的文档。我可以做吗?还有更好的方法吗?
感谢任何输入!
UPD
我已将丹尼斯的回答标记为答案,因为他确实回答了MVCC是否是我想要的问题。但是,我已经确定的策略详述如下,以防有人发现它有用:
Postgres功能可以满足我的需求:在线备份/即时恢复。
http://www.postgresql.org/docs/8.1/static/backup-online.html解释了如何使用此功能,但实际上您可以将此“预写日志”设置为归档模式,拍摄数据库的快照(例如,在它上线之前),然后继续归档WAL。然后,您可以随时使用日志重放来调用数据库的状态,如果您选择(通过不断重播备用服务器上的新WAL),则可以获得热备用的附带好处。
也许这种方法并不像其他保存历史记录那样优雅,因为你需要为你想要查询的每个时间点实际构建数据库,但是它看起来非常容易设置并且丢失零信息。这意味着当我有时间改进对历史数据的处理时,我会拥有一切,因此能够将我笨重的系统转换为更优雅的系统。
使这个如此完美的一个关键事实是我的“有效时间”与特定应用程序的“交易时间”相同 - 如果不是这种情况我只会捕获“交易时间”。
在我发现WAL之前,我正在考虑每天拍摄快照或其他东西,但是大尺寸要求和数据丢失并不适合我。
要想在不影响我的数据保留的情况下快速启动和运行,这似乎是一个完美的解决方案。
答案 0 :(得分:8)
您可能希望查看spi contrib module中的某些功能。
我通常做的是使用触发器将更改以及时间戳记录到归档表,并查询这些变量。如果表结构不会改变,您可以使用类似:
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
);
您的版本控制触发器只能insert into sometable_history(TG_OP,NEW,current_timestamp)
(CASE
DELETE
,NEW
未定义{。}}。
如果架构更改为添加新的NOT NULL
列,那会很痛苦。如果您希望执行类似的操作,请考虑使用hstore
来存档列,而不是使用复合类型。我已经添加了an implementation of that on the PostgreSQL wiki already。
如果您想避免对主数据库(增长表等)产生影响,您可以选择使用continuous archiving and point-in-time recovery来记录WAL文件,这些文件可以使用recovery.conf
在任何时刻重播时间。请注意,WAL文件很大,它们不仅包括您更改的元组,还包括VACUUM
活动和其他详细信息。你想要通过clearxlogtail来运行它们,因为如果它们是存档超时的部分段,它们最终会有垃圾数据,那么你需要大量压缩它们以便长期存储。
答案 1 :(得分:3)
我正在使用Postgres,这个MVCC似乎我应该能够为此目的利用它,但我找不到任何支持这个的文档。我可以这样做吗?
不是真的。有工具可以查看死行,因为自动吸尘最终会被回收。
有更好的方法吗?
如果我的问题是正确的,那么您正在考虑记录slowly changing dimensions。
你可能会发现这个最近的相关主题很有趣:
答案 2 :(得分:1)
我不知道为此目的而构建的任何工具/产品。
虽然这可能不是您要求的,但您可以配置Postgresql来记录ddl更改。设置log_line_prefix参数(尝试包括%d,%m和%u)并将log_statement参数设置为ddl应该可以为您提供有关谁更改ddl以及何时更改的合理历史记录。
话虽如此,我不相信记录ddl是万无一失的。例如,考虑以下情况:
另一种选择可能是如上所述记录ddl,但是只要记录了ddl条目,观察程序就会执行数据库模式的pg_dump。您甚至可以将新转储与先前转储进行比较,并仅提取已更改的对象。
答案 3 :(得分:-1)
你必须尝试nextep。这个软件创建了数据库的历史。它使用修改过的eclipse IDE