【问题标题】:How to keep a copy of the deleted rows as archive before deleting?如何在删除之前将已删除行的副本保留为存档?
【发布时间】:2021-07-01 13:21:22
【问题描述】:

我设计了一个用于日志目的的表。这是表结构,我将使用 MySQL(InnoDB 引擎),它将托管在 AWS RDS 中。

| id (primary_key auto_increment) | entity_id (foreign key) | previous_value | current_value | calculation_done_with_this_row (boolean) | created_time |

这个表也将用于一些关键的业务计算,一旦计算完成某一天,日志表的数据就不再需要了。所以到目前为止,我计划对此类行完成计算后,立即删除日志表中的数据。

但我担心的是,如果出现问题,我需要查看历史数据,那我该怎么办?当我删除记录时,在这种情况下我没有任何支持吗?另一方面,如果我不从日志表中删除数据,它将充满不必要的数据,对业务计算没有贡献;从而降低计算查询的性能。

我的要求是保持日志表的大小,同时保留不必要的日志作为历史数据以备将来参考,如果需要也将历史数据导入回主数据库。

【问题讨论】:

  • 可能性 1) 将行写入另一个表作为删除的一部分。 2)在删除之前备份表,给它一个反映数据日期的名称。如果您需要检查某些内容,请将其还原为另一个表名。
  • 我会保留一个表,其中只包含计算所需的数据,计算后我会将它们移到日志表中,以供参考。你所说的这个日志表永远不会(或几乎永远不会)被使用,所以你不必为性能而烦恼(即使它在需要时可以完全运行)。
  • 你检查partitioning了吗?这正是保持当前数据较小(使用分区修剪)并有效删除旧数据(删除分区)的概念。
  • @MarmiteBomber 我尝试进行分区。但是后来发现在InnoDB引擎中有外键限制的表中的分区还不支持。而我的日志表恰好有一个外键引用。

标签: mysql logging data-warehouse database-administration


【解决方案1】:

这是PARTITIONing 有用的少数情况之一。

将表格更改为PARTITION BY RANGE(TO_DAYS(...))。每晚添加一个新分区;当您觉得没有机会需要它们时,丢弃非常旧的分区。

更多详情:http://mysql.rjweb.org/doc.php/partitionmaint。此外,您可能对摘要技术感兴趣:http://mysql.rjweb.org/doc.php/summarytables

【讨论】:

  • 我正在使用 InnoDB 引擎 For Mysql。我的表有一个外键引用。可悲的是,InnoDB 不允许对具有外键约束的表进行分区。 :(
  • @T4puSD - 您实际上是否将 FK 用于它们生成的索引以外的任何内容?添加分区时索引可用(但应重新访问)。
  • 我不清楚你想说什么。但我的表确实有一个外键引用另一个表的 id。根据MySQL提供的文档,InnoDB 不支持这种表分区。
  • @T4puSD - 正确,PARTITIONing 不允许任何方向的 FK。没有FK可以吗?并且有一个合适的INDEX 来提供FK 提供的查找效率。您将失去完整性检查和拥有CASCADEing 操作的能力。
  • 我无法从表中删除外键约束。我不允许这样做。最初,我也想进行分区,但由于外键问题,我正在尝试寻找其他解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2019-12-24
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多