我工作的公司在不同的服务器上有一组数据库(最大的刚好低于 1Tb)——2 个在美国,2 个在欧洲。
我们在 4 个节点之间为每个数据库运行完整的对等复制 - 因此它们都可以进行事务(插入/更新/删除)并且都拥有其他节点收集的数据(在可变延迟内 - 最差连接开启平均约 30-40 秒)。
最大的数据库包含从 2008 年初到今天的数据。所有这些数据都进一步复制到保存所有数据的报告节点。
我需要删除事务节点上的数据,直到 2013 年,以消除事务节点上的驱动器空间不足,因此历史数据将仅在报告节点上可用。
做这个的最好方式是什么?数据相对易于管理,因为它被很好地分区(每月 - 按分区,然后每年分成单独的文件/文件组)。然而,当分区参与复制和读取分区切换时,存在无法删除分区的问题——这也是不允许的。(切换分区先决条件- 第 18 点)
作为一个完整的生产环境,我试图避免任何会影响复制的事情——包括重新同步(大量数据要重新同步,远距离)。
有没有人对如何执行此任务有任何好的建议?
所以,这里没有答案,但经过一定数量的讨论和思考,我在几个月前提出了一个计划。
我将使这个论坛的答案简明扼要(你可能不同意我有!),试图帮助将来需要执行类似任务的任何人,如果我遗漏任何内容,请随时提问 - 虽然方法是直截了当的。
因此,主要关注的是删除数据而不会对我们正在复制到/从中复制的节点的生产流量产生重大影响。最简单的方法是隔离您要处理的节点,从该节点中删除数据,同时不影响所有其他节点(包括报告节点)。
最好的方法(记住你不能删除分区,任何/大多数操作都会被复制,因此会产生大量的流量和大量的行更改),是创建一个新的 SP 并围绕这个设置一个 Publication SP。因此它应该在所有节点上可用。重要的一点是将复制设置为复制 SP 的执行 - 而不是结果(即复制 EXEC Sp_delete 调用而不是删除 WHERE ID = 1,删除 WHERE ID = 2 - 行级别更改)。这是在右键单击您的新出版物(在设置拓扑中的其他节点之前)>属性>文章>单击您设置的 SP_Delete >文章属性按钮>设置突出显示的存储过程文章的属性>复制行=执行存储过程。完成您的 P2P 拓扑。
但是 MHSQLDBA,您可能会说,这只是通过 SP 分别删除每个节点上的行。- 这就是将 SP 设置为仅进行删除的原因:
IF @@SERVERNAME='你要影响的当前服务器'
按照您的删除程序进行操作。
因此,当在您不想执行删除的服务器上接收到此 EXEC 调用时,它将被忽略,因为@@Servername 不等于您选择的服务器。
您可能会想——为什么不只在您感兴趣的服务器上创建一个 SP 并运行它呢?- 这是因为如果您这样做,复制会将更改分解为它们如何影响文章(表)行并复制实际更改 - 您必须复制 SP,以便您可以指定复制 SP 的 EXEC而不是由此产生的变化。
这是我认为/经验中建议的事件顺序:
注意事项:
可能有一种比使用删除更好的方法将数据从 SP 中移走 - 可能将其移动到另一个不涉及复制的表,然后删除“新”表 - 或者相反,如果你想保留数据小于要删除的数量,将要保留的数据移动到新表,删除旧表,然后重命名新表 - 从这些角度来看有很多建议 - 我在一个更容易的环境中工作争取删除而不是推广一些人员不会理解的概念,所以我正在描述痛苦但基本的方式。
免责声明:以上所有都是危险的。如果在没有适当的深思熟虑的情况下仓促完成,您可能会严重破坏复制拓扑、您公司的数据甚至您的工作。请采取上述方法并制定自己的作战计划——创建一个测试环境来证明概念、测试测试和重新测试,不要草率地完成这项任务。经过充分的考虑,你会完成你的任务——但在周五下午喝了几杯午餐啤酒后,这样做是不值得的。做对,做一次(尽可能多地进行真实测试),正确地做。
我希望这可以帮助别人。- 我添加了这一点,因为如果我想要这个答案,我会搜索它:
从对等复制拓扑中删除大量数据