我们使用Oracle 11g构建的应用程序需要保存历史数据。
历史化是法定的,主要用于手工查询、调查问题等。基本上我们需要节省一些10年的时间,每年都要挖掘几次旧的数据。历史数据也经常用于开发和测试,用于调试目的。
或者自制的解决方案是在主键中添加一个额外的序列号,当一个现有行被“修改”时,用一个新的seq-no插入一个副本。我们在所有查询中使用最新的seq-no作为实际的“活动”数据。实际上,每当我们访问一个表时,我们就会在max(seq_no) +其他主键上执行子选择或连接。
id varchar[8], --pk
seq_no number, --pk
omg_ponies varchar[42],性能是足够的...almost,但我们看到更大的数据量,许多查询变得难以置信的复杂,因为我们的应用程序增长。它也阻碍了我们在模型混乱时有效地使用JPA或Hibernate。我们正在用观点来解决这个问题,但它有它的复杂性。
那么如何处理历史化呢?甲骨文在推荐使用闪回看来是一件好事。
但是,我们如何迁徙,保持我们(10年)的历史?理想情况下,每个id只留下一行,在闪回日志中可以使用旧的变体(较低的seq_no:s)。最好有一个适当的“旧”时间戳。
此外,如何处理重构?我们看到了许多新的业务需求,有时我们需要做一些重大的更改,比如将一个表分成两个,或者其他由新的需求和特性引起的更大的修改。到目前为止,我们每年做一到两次更大的变化。在保留或重新填充历史记录的同时,我们如何处理更改,最好还是使用适当的“旧”日期。
注:我们不认为我们必须让历史条目“完好无损”。只要我们不丢失更改和某些事件的跟踪,就可以修改逻辑模型。
发布于 2011-11-18 15:14:30
听起来甲骨文全面召回可能适合您的需要:
萨班斯-奥克斯利(Sarbanes)、HIPAA和巴塞尔-II(Basel)等监管监管机构以及内部审计,都要求公司长期保存历史数据。Oracle全面召回是Oracle数据库安全解决方案综合组合的一部分,它与Oracle数据库11g企业版合作,帮助公司将数据存储在安全、防篡改的数据库中,同时使现有应用程序能够访问这些数据。
文档声明它可以支持重构:
在Oracle数据库11g第1版中,Flashback Database支持Add列DDL操作。使用Oracle Database 11g Release2,支持以下DDL操作,支持所有相关更改的Flashback查询:·Add、Drop、Rename、Modify列·Drop、Truncate、disable (用于更复杂的DDL --升级、拆分表等)--非关联和关联PL/SQL过程可用于临时禁用指定表上的Flashback数据存档。
发布于 2011-10-27 18:46:14
我不认为您将能够模拟假历史与闪回数据存档-如Tom在您提供的链接。除此之外,它确实是为你的数据建立的真正的目的。
也许您可以考虑将当前历史数据保存在冻结状态的迁移,并为您的历史数据(例如,通过一组返回函数)访问两个历史记录的“联合”?
-编辑
更进一步,如何处理重构?我们看到了许多新的业务需求,有时我们需要做一些重大的更改,比如将一个表分成两个,或者其他由新的需求和特性引起的更大的修改。到目前为止,我们每年做一到两次更大的变化。在保留或重新填充历史记录的同时,我们如何处理更改,最好还是使用适当的“旧”日期。
好的,这会改变一切--闪回数据存档不适合你。相反,可以考虑使用两个表的解决方案:一个用于当前数据,另一个用于历史数据。
11.2允许比11.1更多的DDL操作,比如drop column,但是AFAIK没有办法将表分割成两个副本,保留历史记录。
https://dba.stackexchange.com/questions/7331
复制相似问题