2010-01-11 194 views
72

愚蠢的問題 - 在我想用生產服務器實例刷新開發服務器的環境中複製實例的最佳方法是什麼?複製數據庫的最佳方法(SQL Server 2008)

我已經做了備份恢復,但我聽說裝卸複製連接和一個人甚至告訴我,他將剛纔複製的文件系統之間的數據文件....

這些是三(或兩個,最後一個聽起來有點可疑)接受方法?

我的理解是,第二種方法更快,但由於分離方面的原因,需要在源上停機。

此外,在這種情況下(想要在開發服務器上生產的確切副本)什麼是傳輸登錄等公認的做法?我應該只備份和恢復用戶數據庫+ master + msdb?

回答

32

複製數據庫的最快方法是detach-copy-attach方法,但生產用戶在prod數據庫分離時不會訪問數據庫。如果您的生產數據庫是例如在夜間沒有人使用的銷售點系統,那麼您可以這樣做。

如果你不能分離生產數據庫你應該使用備份和恢復。

如果它們不在新實例中,您將不得不創建登錄。我不建議你複製系統數據庫。

您可以使用SQL Server Management Studio創建創建所需登錄名的腳本。右鍵單擊您需要創建的登錄名並選擇腳本登錄爲/創建。

這將列出孤立用戶:

EXEC sp_change_users_login 'Report' 

如果你已經有這個用戶登錄ID和密碼,這樣做解決它:如果你想創建一個新的

EXEC sp_change_users_login 'Auto_Fix', 'user' 

登錄ID和密碼,該用戶,這樣做解決它:

EXEC sp_change_users_login 'Auto_Fix', 'user', 'login', 'password' 
+2

另請參見[this question](http://stackoverflow.com/questions/1360529/how-do-you-backup-and-restore-a-database-as-a-copy-on-the-同一服務器)如​​何恢復到不同的名稱。 – John 2014-03-07 13:25:54

+0

@MGOwen,嘗試用多個文件組備份和恢復500Gb數據庫,然後分離並附加。哪一個更快? – 2014-06-19 17:51:13

+2

@Jose您說得對,這比大型數據庫的僅複製備份花費的時間少。但是僅複製備份**不會將生產數據庫關閉**,而這通常會以高於速度的速度運行。 – MGOwen 2014-07-18 12:04:32

6

它很難分開你的生產dB或其他運行dB並處理這個停機時間,所以我幾乎總是使用備份/恢復方法。

如果您還想確保您的登錄信息保持同步,請使用存儲的proc sp_help_revlogin來檢查MS KB article

0

如果要取得活動數據庫的副本,請執行備份/恢復方法。

[在SQLS2000中,不確定2008年:]請記住,如果您在此數據庫中使用SQL Server帳戶,而不是Windows帳戶,並且主數據庫在開發服務器上不同步或不同步,執行還原時用戶帳戶不會進行翻譯。我聽說過一個SP重新映射它們,但我不記得它是哪一個。

1

我運行一個SP刪除表(S)然後使用DTS包將最新的生產表導入到我的開發箱中。 然後我回家,第二天早上回來。這不是優雅的;但它適用於我。

13

UPDATE:
低於我的建議告訴你如何編寫腳本一個數據庫使用SQL Server Management Studio中,但在SSMS的默認設置,錯過了一個數據庫的關鍵部分的各種(如索引和觸發器!)一些原因。所以,我創建了自己的程序來正確編寫一個數據庫腳本,其中包括您可能添加的所有類型的數據庫對象。我建議使用這個。這就是所謂的SQL服務器的編劇,它可以在這裏找到:
https://bitbucket.org/jez9999/sqlserverscripter


我很驚訝沒有人提到這一點,因爲它是非常有用的:你可以轉儲數據庫(它的模式數據)轉換爲使用SQL Server Management Studio的腳本。

用鼠標右鍵單擊數據庫,選擇「任務|生成腳本...」,然後選擇腳本特定的數據庫對象。選擇要複製到新數據庫的數據(您可能希望至少選擇表和模式)。然後,對於「設置腳本選項」屏幕,單擊「高級」,向下滾動到「腳本數據類型」並選擇「架構和數據」。單擊確定,並完成生成腳本。您會看到現在已經爲您創建了一個長腳本,用於創建數據庫的表將數據插入到它們中!然後,您可以創建一個新數據庫,並更改腳本頂部的USE [DbName]語句以反映要將舊數據庫複製到的新數據庫的名稱。運行該腳本,舊數據庫的模式和數據將被複制到新的!

這使您可以從SQL Server Management Studio中完成整個任務,並且不需要觸摸文件系統。

+0

Bitbucket - 您無權訪問此存儲庫。 使用頂部的鏈接找回。 – 2013-02-08 07:22:42

+2

@TomStickel糟糕 - 只是公開。 :-) – Jez 2013-02-08 09:28:01

+1

將sql轉儲到文件中很糟糕,特別是在處理大型數據庫時。爲什麼微軟不能提供一個好的工具來完成這個明顯而必要的任務? – 2013-09-16 11:36:08

5

分離/複製/附加方法將取消數據庫。這不是你想要的產品。

如果您對生產服務器擁有寫入權限,備份/恢復將僅適用。我與亞馬遜RDS合作,但我沒有。

導入/導出方法實際上並不是因爲外鍵而起作用 - 除非您按順序逐個按照它們相互引用的順序執行操作。您可以執行導入/導出到新的數據庫。這將複製所有的表和數據,但不是外鍵。

這聽起來像是數據庫需要處理的常見操作。爲什麼SQL Server不能正確處理這個問題?每次我必須這樣做,這都令人沮喪。

也就是說,唯一的無痛我遇到的解決方案是由社區維護的Sql Azure Migration Tool。它也適用於SQL Server。

37

最簡單的方法實際上是一個腳本。

運行此生產:

USE MASTER; 

BACKUP DATABASE [MyDatabase] 
TO DISK = 'C:\temp\MyDatabase1.bak' -- some writeable folder. 
WITH COPY_ONLY 

這一個命令使數據庫的完整備份到一個單一的文件,而與生產可用性或備份計劃等干擾

要恢復,只是你的開發或測試SQL服務器上運行此:

USE MASTER; 

RESTORE DATABASE [MyDatabase] 
FROM DISK = 'C:\temp\MyDatabase1.bak' 
WITH 
MOVE 'MyDatabase' TO 'C:\Sql\MyDatabase.mdf', -- or wherever these live on target 
MOVE 'MyDatabase_log' TO 'C:\Sql\MyDatabase_log.ldf', 
REPLACE, RECOVERY 

然後保存在每個服務器上運行這些腳本。一鍵式方便。

編輯:
如果恢復的邏輯名稱不匹配時出現錯誤,你可以讓他們像這樣:

RESTORE FILELISTONLY 
FROM disk = 'C:\temp\MyDatabaseName1.bak' 

如果使用SQL Server登錄(而不是Windows身份驗證)您可以在每個時間(恢復開發/測試機器上運行後,此):

use MyDatabaseName; 
sp_change_users_login 'Auto_Fix', 'userloginname', null, 'userpassword'; 
+3

加1爲COPY_ONLY標誌,不會干擾備份策略 – Muflix 2014-11-27 23:24:25

0

我用EMS SQL Backup,它有它可以很容易地將數據庫運輸任務調度。您必須指定共享網絡文件夾。複製也通過備份/複製/恢復來執行,但可以快速設置。 它看起來像沒有能力處理程序中的登錄,你將不得不手動執行它。

8

下面是我做的,從生產ENV數據庫複製到我的本地ENV:

  1. 在您的本地SQL Server
  2. 創建一個空數據庫右鍵單擊新的數據庫 - >任務 - >導入數據
  3. 在SQL Server導入和導出嚮導中,選擇產品env的servername作爲數據源。並選擇新的數據庫作爲目標數據。
+1

您真正的MVP。這是您無法訪問源(或目標)系統的文件系統的答案。就我而言,我可以通過管理工作室訪問,但完全無法訪問文件系統。這個答案即使沒有第三方工具也能解決問題。謝謝! – 2016-08-11 05:01:09

相關問題