我有一个包含数十亿条记录的庞大模式,我希望从中删除超过13个月的数据,并将其作为备份进行维护,以便在需要时可以再次恢复。
在SQL中执行此操作的最佳方法是 - 我们是否可以创建此架构的单独副本并在所有表上添加删除触发器,以便在触发器触发时,清除的数据会插入到此新架构中?
如果我们使用触发器,每个删除语句只会有一条记录吗?或者会插入所有记录? 我们可以以某种方式使用批量复制吗?
答案 0 :(得分:1)
我建议这是SQL Server 2016中Stretch Database功能的完美用例。
更多信息:https://msdn.microsoft.com/en-gb/library/dn935011.aspx
可以使用您给定的日期条件将冷数据移动到云中,而无需任何应用程序或用户在查询数据库时了解它。无需备份,非常容易设置。
答案 1 :(得分:0)
不需要触发器,您可以使用每天运行的作业,将过时的数据放入存档表中。
我猜的最好方法是创建当前架构的副本。在主要部分 - 删除所有旧的13个月,在存档部分 - 删除所有过去13个月。
创建将收集数据的SP(或任何SP) - 将其存档并从主表中删除。把它放到日常工作中。
答案 2 :(得分:0)
最干净,最快速的方法(数十亿行)是创建一个分区表,可能基于每月的日期列。在给定分区中移动数据是一个元操作并且非常快(如果正确设置了分区设置及其功能。)我已经使用分区管理了300GB表,并且它非常有效。请注意分区功能,以便正确处理每个边缘的日期。
其他一些提议的解决方案涉及删除数百万行,这些行可能需要很长很长时间才能执行。使用分析器和/或扩展事件对不同的解决方案建模,以查看哪个是最有效的。
答案 3 :(得分:0)
我同意上述内容不能创建触发器。每次插入/更新/删除都会触发触发器,使它们非常慢。
您最好使用数据存档存储过程。
考虑使用多个数据库。包含当前数据的当前数据库。然后是一个存档或多个存档数据库,您可以将记录从当前数据库中移出,以及某种说夜间或每月存储过程的过程来移动数据。
您可以使用与生产系统完全相同的架构。
如果数据已存在于数据库中,则无需批量复制。从那里你可以备份你的存档数据库,使它不在sql server上。如果需要,还原数据库以使数据再次可用。这比批量复制更快,更易于管理。
答案 4 :(得分:0)
根据Microsoft有关Stretch DB的文档(此处为https://docs.microsoft.com/en-us/azure/sql-server-stretch-database/),您无法更新或删除已迁移到冷存储的行或符合迁移条件的行。
因此,虽然Stretch DB看起来像一个功能强大的存档技术,但SQL 2016中的实现似乎不支持存档和清除。