SQL Sync数据库表到另一台服务器

时间:2015-09-18 00:23:39

标签: sql-server

我们有一个系统,可以在我们的生产服务器上为每天/班次在数据库中创建和表。我想以某种方式从该服务器获取数据并将其移动到我们的存档服务器,如果数据超过x天,则将其从生产服务器上删除。

在生产服务器上,数据库称为“转换”,表格名为“yyyy-mm-dd_shift_table”。我想将其移动到另一台运行SQL 2012的服务器上的数据库中,并将其移动到具有相同名称的数据库“Archive”中。每个表包含当天约30,000条记录。

我看待的方式如下:

  • 获取Production Server上的表列表
  • 如果存档服务器中存在表,请查找任何更改(仅与当前表真正相关)和同步更改
  • 如果存档服务器中不存在表,请创建表和同步更改。
  • 如果桌面上的日期更长且X天,则从存档服务器删除表格

理想情况下,我希望将此作为SQL中可以每天/每小时运行的过程。

关于如何攻击这个的建议会很棒。

编辑:很高兴对数据库中的所有匹配表执行选择,并将它们写入我的数据库中的单个表中。

2 个答案:

答案 0 :(得分:2)

今天进行了大量挖掘,我已经想出了流量,这将从远程服务器加载所有数据并将其插入本地服务器上的表中。这需要存档服务器上的链接服务器,您可以使用它来查询远程服务器。我确定你可以撤销这个并推送数据,但我不想在生产服务器上咀嚼循环。

-- Set up the variables
--Tracer for the loop
DECLARE @i int
--Variable to hold the SQL queries
DECLARE @SQLCode nvarchar(300) 
--Variable to hold the number of rows to process
DECLARE @numrows int 
--Table to hold the SQL queries with and index for looping
DECLARE @SQLQueries TABLE (
    idx smallint Primary Key IDENTITY(1,1)
    , SQLCode nvarchar(300)
)

--Set up a table with the SQL queries that will need to be run on the remote     server. This section creates an INSERT statment
--which is returning all the records in the remote table that do not exist in the local table.
INSERT INTO @SQLQueries 
select  'INSERT INTO Local_Table_Name 
    SELECT S.* FROM [Remote_ServerName].[Transformations].[dbo].[' + name + '] AS S
    LEFT JOIN Local_Table_Name AS T ON (T.Link_Field = S.Link_Field)
    WHERE T.Link_Field IS Null'+ 
    CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) 
from [Remote_ServerName].[Transformations].sys.sysobjects 
where type = 'U' AND name Like '%_Table_Suffix'

--Set up the loop to process all the tables
SET @i = 1
--Set up the number of rows in the resultant table
SET @numrows = (SELECT COUNT(*) FROM @SQLQueries)
--Only process if there are rows in the database
IF @numrows > 0
    --Loop while there are still records to go through
     WHILE (@i <= (SELECT MAX(idx) FROM @SQLQueries))
    BEGIN
        --Load the Code to run into a variable
        SET @SQLCode = (SELECT SQLCode FROM @SQLQueries WHERE idx = @i);
        --Execute the code
        EXEC (@SQLCode)
        --Increase the counter
        SET @i = @i + 1
    END

初始跑了超过45个表插入约120万条记录需要2.5分钟。之后每次运行大约需要1.5分钟,仅插入约50-100条记录

答案 1 :(得分:0)

我实际上为此创建了一个解决方案并将其发布在GitHub上。它使用一个名为EzAPI的库,并将所有表和列从一个服务器同步到另一个服务器。

欢迎您使用它,但基本过程首先检查数据库之间的元数据并生成任何更改的对象。在对目标服务器进行必要的修改之后,它将为每个对象生成一个SSIS包,然后执行该包。您可以选择在生成包之后删除或保留包。

https://github.com/thevinnie/SyncDatabases