2009-09-17 87 views
1

我有一個SQL數據庫,我目前正在從Access數據庫轉換。 Access數據庫的一個特點是「複製數據庫」,並在「開發」站點中使用 - 它通過將生產文件物理複製到開發站點來複制所有生產數據。通過這種方式,所有生產數據和結構以及查詢和所有內容都被複制到開發版本中。當我們測試爲什麼發生某些事情時,這隻需要偶爾進行,而我們不想在生產數據中播放;不是罕見的,但也不常發生 - 也許每月一次或兩次。我想知道在SQL中工作時,其他人做了什麼來完成此任務?什麼是創建SQL Server數據庫的工作副本的最佳方式?

我在想,我可以做一個數據庫備份,然後恢復到DEV版本,但我不希望這個備份干擾正常的備份過程。有沒有辦法從一個數據庫直接傳輸到另一個數據庫,而不是轉到文件系統,並且讓備份看起來從未發生過(即REAL備份仍會備份真正需要備份的所有項目)?

有沒有什麼其他選擇?我有來自Red Gate的SQL比較和SQL數據比較,但我需要將此功能公開給某些用戶(具有較高的權限和訪問DEV站點),並且他們沒有它。

回答

3

看了一下後,我得出結論,我必須通過文件系統,但有一種方法可以在不影響正常備份過程的情況下執行備份/恢復,方法是使用'僅複製「模式。這裏的腳本來做到這一點:

BACKUP DATABASE [ProductionDB] 
TO DISK = N'D:\ProductionDBToDevTransfer.bak' 
WITH 
    COPY_ONLY, 
    NOFORMAT, 
    INIT, 
    NAME = N'DB-Full Backup', 
    SKIP, 
    NOREWIND, 
    NOUNLOAD, 
    STATS = 10 

RESTORE DATABASE [DevDB] 
FROM DISK = N'D:\ProductionDBToDevTransfer.bak' 
WITH 
    FILE = 1, 
    MOVE N'ProductionDB' TO N'D:\Microsoft\SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DevDB.mdf', 
    MOVE N'ProductionDB_log' TO N'D:\Microsoft\SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DevDB_log.ldf', 
    NOUNLOAD, 
    REPLACE, 
    STATS = 10 

要特別注意在默認情況下,RESTORE命令的MOVE語句,恢復將文件恢復到原來備份的物理文件,而不是開發DB文件,儘管事實上你正在恢復到DEV數據庫...我幾乎發現了困難的方式,當我做了恢復,並且SSMS抱怨說這些文件正在被其他數據庫使用... OMG,這是多麼不直觀。

1

您可以直接從另一個數據庫恢復數據庫。

如果您使用的是SQL Management Studio,請在「恢復數據庫」對話框中選擇「從數據庫」而不是「從設備」。

+0

你碰巧知道SQL代碼做同樣的事嗎? – 2009-09-17 17:11:53

+0

嗯......此外,這似乎仍然從數據庫備份中恢復,而不是數據庫的「實時運行版本」......也就是說,選擇數據庫看起來只是列出執行備份的便捷方式在那個DB上。 – 2009-09-17 17:21:38

+0

哇,你說得對。我沒有注意到,因爲我有我所有數據庫的備份。我想你必須通過文件系統。 – 2009-09-17 17:38:17

0

我們對生產數據進行按需備份,然後在開發機器上恢復備份。

1

您通常希望從備份中恢復整個數據庫。嘗試直接從實時運行的prod數據庫執行此操作可能會導致用戶的鎖定問題。你可以使用SSIS來做到這一點,但它不是一個簡單而且快速的事情。

另一種可能性是,如果您可以暫時關閉prod(只有當用戶不在數據庫中時有一段時間)。然後分離數據庫。分離開發數據庫並刪除它。將文件複製到dev服務器並再次連接兩個數據庫。這可能比恢復速度快,但現在這是一種罕見的環境,它沒有24小時生產數據訪問權限。

順便提一下,最好在不同的服務器上安裝dev和prod。

如果要恢復到開發,您需要確保任何尚未提交到prod的開發更改都是腳本化的,因此可以在還原後立即運行它們。如果您編寫任何和所有數據庫更改並將它們存儲在源代碼管理中,最好。這使得更容易做到這一點。

2

上述腳本正常工作,但不會更改複製服務器的邏輯文件名。因此,如果您嘗試再次運行它以反轉該過程,則它將在MOVE語句中失敗。

我稍微修改了腳本,想出了以下這些似乎適用於我的工作。我是新手,所以要小心!

DECLARE @SOURCEDB nvarchar(100) 
DECLARE @SOURCEDBLOG nvarchar(100) 
DECLARE @DESTINATIONDB nvarchar(100) 
DECLARE @DESTINATIONDBLOG nvarchar(100) 
DECLARE @BACKUPDIR nvarchar(100) 
DECLARE @BACKUPFILE nvarchar(100) 
DECLARE @BACKUPNAME nvarchar(100) 
DECLARE @SQLDATADIR nvarchar(100) 
DECLARE @SQLDATABACKUPFILE nvarchar(100) 
DECLARE @SQLDATABACKUPLOGFILE nvarchar(100) 

--CHANGE THESE VALUES TO MATCH YOUR SYSTEM 
SET @SOURCEDB = N'test' 
SET @DESTINATIONDB = N'test-backup' 
SET @BACKUPDIR = N'C:\SHARED\' 
SET @SQLDATADIR = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\' 

--CALCULATED VALUES 
SET @SOURCEDBLOG = @SOURCEDB + N'_log' 
SET @DESTINATIONDBLOG = @DESTINATIONDB + N'_log' 
SET @BACKUPFILE = @BACKUPDIR + @SOURCEDB + N'-to-' + @DESTINATIONDB + N'.bak' 
SET @BACKUPNAME = @SOURCEDB + N'-Full Backup' 
SET @SQLDATABACKUPFILE = @SQLDATADIR + @DESTINATIONDB + N'.mdf' 
SET @SQLDATABACKUPLOGFILE = @SQLDATADIR + @DESTINATIONDBLOG + N'.ldf' 

--BACKUP THE DATABASE 
BACKUP DATABASE @SOURCEDB 
TO DISK = @BACKUPFILE 
WITH 
     COPY_ONLY, 
     NOFORMAT, 
     INIT, 
     NAME = @BACKUPNAME, 
     SKIP, 
     NOREWIND, 
     NOUNLOAD, 
     STATS = 10 

--RESTORE THE BACKUP TO THE NEW DATABASE NAME 
RESTORE DATABASE @DESTINATIONDB 
FROM DISK = @BACKUPFILE 
WITH 
     FILE = 1, 
     MOVE @SOURCEDB TO @SQLDATABACKUPFILE, 
     MOVE @SOURCEDBLOG TO @SQLDATABACKUPLOGFILE, 
     NOUNLOAD, 
     REPLACE, 
     STATS = 10 

--UPDATE THE LOGICAL FILE NAMES 
DECLARE @TEMPLATE varchar(500) 
DECLARE @SCRIPT varchar(500) 
SET @TEMPLATE = N'ALTER DATABASE [{DBNAME}] MODIFY FILE (NAME = [{OLD}], NEWNAME = [{NEW}])' 
SET @SCRIPT = REPLACE(REPLACE(REPLACE(@TEMPLATE, '{DBNAME}', @DESTINATIONDB),'{OLD}',@SOURCEDB),'{NEW}',@DESTINATIONDB) 
EXEC(@SCRIPT) 
SET @SCRIPT = REPLACE(REPLACE(REPLACE(@TEMPLATE, '{DBNAME}', @DESTINATIONDB),'{OLD}',@SOURCEDBLOG),'{NEW}',@DESTINATIONDBLOG) 
EXEC(@SCRIPT) 
相關問題