【问题标题】:MSSQL Automatic Merge DatabaseMSSQL 自动合并数据库
【发布时间】:2015-06-04 16:23:15
【问题描述】:

我有一台装有 MSSQL 数据库的 PC,每秒填充 800 个变量。我需要该数据库至少每 10 分钟合并/备份到另一台服务器 PC 上的第二个数据库。此外,第一个数据库需要每周清理一次,以节省本地驱动器空间,以便在任何给定时间在第一个数据库上只存储 1 周的数据;同时,第二个数据库保持一切完好无损,永远不会被清除,只会被每 10 分钟发生一次的合并添加。

据我所知,这意味着我不能依赖数据库镜像,因为每周都会擦除第一个镜像。因此,从我收集到的信息来看,这意味着我必须每 10 分钟安排一次合并。

我会欣然承认我对 SQL 几乎一无所知。所以我的两个问题是:

  1. 如何设置按 10 分钟的频率从一个数据库到另一个数据库的计划合并?
  2. 如何将数据库设置为计划/脚本化,以便每周清除它?

(注意:两个数据库都在MS SQL Server 2012 Standard上运行。)

【问题讨论】:

  • 问题是广泛的,到目前为止你尝试过什么?
  • 您能否更具体地说明合并对您意味着什么?这是一个有点负荷的术语。目的地将获得每个表的插入和更新的 upsert 吗?
  • 有多种方法可以实现这一点。我能想到的最简单的方法是将两台服务器设置为链接服务器,然后为服务器 A 上的每个表编写一个触发器,将插入/更新到这些表中的任何内容发送到服务器 B。如果您不能使用链接服务器,那么按计划执行 SSIS 包可能是您最好的选择。
  • 由于缺乏 SQL 经验,我还没有尝试过任何东西。也就是说,我正在寻找一种每 10 分钟将数据从第一个数据库复制到另一个数据库的方法。由于每个条目都带有时间戳,因此它只会添加到第二个数据库的现有数据库中。
  • 这些是复杂的任务,不能直接完成,为了可靠,需要专家来实施、测试和调试。我建议,如果您不知道如何做这些事情,那么您应该雇用/签约会做这些事情的人。

标签: sql sql-server sql-server-2012


【解决方案1】:

假设您可以在服务器 A 上创建一个连接到服务器 B 的链接服务器 (Here's a guide)

然后在你的表上创建一个触发器,例如 table1:

CREATE TRIGGER trigger1
ON table1
AFTER INSERT
AS
    INSERT INTO ServerB.databaseB.dbo.table1
    select *
    from inserted

更多关于触发器here

对于第 2 部分,您可以安排一个作业以按照您想要的任何时间表截断表格。 How to create a scheduled job.
触发器仅在插入时触发,因此删除行对服务器 B 上的表没有任何影响。

【讨论】:

  • 设置这样的东西以在生产环境中可靠运行存在许多问题。此外,此触发器不会执行任何操作,因为它只是复制而不执行请求的“合并”部分。
  • Karasu 的一个 cmets 阐明每个条目都带有时间戳,并且只会添加到第二个数据库中,因此不会有任何更新。如果有更新,另一个触发器。我同意你的观点,设置这种规模和复杂性的东西可能会遇到很多问题。例如,如果服务器 A 和服务器 B 之间的通信中断会发生什么?
  • 那么在 INSERT 上就足够了。
  • 仅供参考,每秒 800 次更改,在此基础上添加触发器会产生严重的性能影响。
  • 在创建上面的示例触发器并尝试执行简单的 INSERT 语句时,我收到以下错误:sp_cursor: the value of the parameter 'value' is invalid
【解决方案2】:

如何通过存储过程清除/删除数据?如果是这样,您还可以尝试事务复制,并复制该特定存储过程的执行,但在订阅者上虚拟化过程,因此当过程被复制并在订阅者上执行时,不会删除/清除任何内容。

【讨论】:

    猜你喜欢
    • 2012-10-02
    • 2012-02-12
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多