Sql-Server

使用 SSIS 優化 2 台伺服器之間的大型數據集同步

  • December 7, 2020

我在不同的伺服器上有兩個數據庫,伺服器 A 和伺服器 B。兩者都是 SQL Server。我需要使第二個數據庫與第一個數據庫保持同步。數據庫架構和表是相同的,但是伺服器 A 會定期創建伺服器 B 上缺少的新記錄。我決定使用 SSDT 工具中包含的 SQL Server 集成服務。

將伺服器 B 與伺服器 A 同步的最簡單方法是在 Visual Studio 中創建 SSIS 項目,該項目將生成Package.dtsx.

這是該軟體包目前的功能

  • 創建引用伺服器 A 的 OLE DB 源
  • 創建引用伺服器 B 的 OLE DB 目標
  • 選擇需要同步的特定表
  • 在伺服器 A 和伺服器 B 之間為該表創建列映射
  • Package.dtsx在 SSMS 中,添加每 15 分鐘執行一次的 SQL Server 作業

這個包似乎從伺服器 A 下載所有記錄並嘗試將它們插入伺服器 B。

問題

  • 伺服器 B 上可能已經存在一些記錄。有沒有辦法只插入伺服器 B 上缺少的記錄,以防止日誌中出現關於重複主鍵的一堆錯誤?
  • 伺服器 A 可能有很多記錄。有沒有辦法在同步開始之前獲取伺服器之間的差異,也許有一些動作可以通過 ID 比較記錄並只下載伺服器之間的差異?

你想在你的 SSIS 包中添加一個“查找”操作符。此包將“檢查”某些列(例如您的 PK),然後您將能夠僅對失去的行採取措施。

關於您下載密鑰的想法,您可以將 PK 從 ServerB 到 ServerA 的初始數據流設置為永久臨時表或臨時表。SSIS 中的臨時表使用需要一些努力,因為您需要在您將保存臨時表的 ServerA 的連接對像上啟用保留相同連接,最初使用全域臨時表(使用##)進行開發,以便它在您的開發工作期間可見並使用繞過驗證/延遲驗證,以便 SSIS 在臨時表不可見時不會引發錯誤(臨時表 BTW 應在初始數據流之前使用執行 SQL 任務創建) . 下載後,您可以在 ServerA 上本地比較密鑰,並且只將新密鑰發送到 ServerB。

引用自:https://dba.stackexchange.com/questions/281023