2009-09-17 61 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) 
相关问题