Sql-Server

SQL Server - 僅備份/恢復架構

  • September 8, 2015

我們在 100 多台伺服器上有一個數據庫,我們希望一次將其中 1 台伺服器的結構備份/恢復到特定的 UAT 數據庫。它們都被稱為相同的東西,但在架構方面有所不同 - 例如,可能有人將數據備份到另一列,更新了原始列而不刪除備份列。

還有不同的列大小(即,一台伺服器上表 b 上的列 a 可能是nvarchar(7500),但另一台伺服器上同一表上的同一列可能是nvarchar(max))。

此外,一些 sproc 最初創建時依賴於視圖(例如),但視圖已被刪除。

我們嘗試了以下方法:

  1. 備份/恢復整個數據庫,刪除不需要的數據
  • UAT 伺服器沒有足夠的空間容納某些數據庫,不能進行擴大
  1. 備份/恢復小型數據庫,截斷所有表並從其他伺服器插入
  • 不適合,因為架構因一台伺服器而異
  1. 循環遍歷表,select * into <tablename> from [ip].[db].[schema].[tablename] where ...
  • 可以很好地創建表結構,包括數據類型,但未創建主鍵、觸發器、sprocs 等 - 我們嘗試從各種 sys 表中編寫腳本,但由於某些視圖被刪除,一些 sprocs 失敗(如果它們使用已刪除的視圖,則與觸發器相同)

我們基本上只需要將一個客戶端的數據複製到 UAT 伺服器上,針對它執行一些測試,然後轉移到下一個客戶端。忘記數據庫之外的東西,這些不是我任務的一部分;我的任務只是將數據庫的結構從一台伺服器複製到另一台伺服器,包括儲存過程、觸發器和主鍵。我們可能會在 2 個 UAT 伺服器中的每一個上擁有多達 36 個 DB,因此存在空間限制(每個開發人員 6 個,允許每個開發人員在伺服器上最多 6 個客戶端)。我們也許可以增加伺服器的數量,例如,每台伺服器 12 個 DB,但為了鼓勵那些能夠獲得這些伺服器的人,我們必須首先有一個工作概念證明,如果你明白我的意思的話。

上面的方法 3 最接近,但 sproc 甚至可能不存在的事實並不令人滿意 - 如果任何程序檢測到錯誤的原因,它可能會根據 sproc 在執行期間是否失去或失敗而採取不同的行動。可能有一些程式碼在失敗之前執行,在這種情況下,每次 sproc 在 live 上執行時都會執行,但在 UAT 上根本不會執行。

最後,我正在執行 SSMS 2005,我相信伺服器在 SQL Server 2005 和 2008 之間會有所不同。

有沒有人對如何實現這一目標有任何想法?考慮到我們實際上無法進行完整備份/恢復並且由於不存在視圖而無法編寫所有儲存過程,是否有可能?

我以前沒有使用過它,但是 SSIS 中有一個名為 Transfer SQL Server Objects 的對象。它可以選擇是否複製數據,您可以選擇複製所有對像或僅複製特定類型的對象、權限等。

您還可以考慮進行複制但阻止它的數據部分。事實上,如果您設置一個快照複製,只為您的每台伺服器推送模式,您可能會有一個自動化的流程來進行推送。

我認為 SSIS 選項可能是您最好的選擇。

您可以使用 Powershell 將數據庫對像腳本化為 .sql 腳本,該腳本既可用作模式備份,也可用於您正在談論的傳輸。這是通過使用SQL Server SMO.Script()中的方法完成的。Edwin Sarmiento有一篇完整的部落格文章。例如,以下是如何使用選項編寫腳本(摘自連結的部落格文章):CREATE DATABASE

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 
$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') "LOCALHOST\SQL2005_1"  

$dbs=$s.Databases 

$dbs["Northwind"].Script() 

部落格文章應為您提供可用於支持架構副本的完整詳細資訊和程式碼。

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