创建SQL Server数据库的工作副本的最佳方法是什么?

时间:2009-09-17 16:55:53

标签: sql-server backup

我有一个SQL数据库,我目前正从Access数据库转换。 Access数据库的一个功能是“复制数据库”,在“开发”站点中工作时使用 - 它通过将生产文件物理复制到开发站点来复制所有生产数据。通过这种方式,所有生产数据和结构以及查询和所有内容都会复制到开发版本中。当我们测试为什么发生某些事情并且我们不想参与生产数据时,这只需要偶尔进行;并不罕见,但也不常见 - 可能一个月一次或两次。我想知道在SQL中工作时还有其他人做了什么?

我认为我可以进行数据库备份,然后恢复到DEV版本,但我不希望此备份干扰正常的备份过程。有没有办法从一个数据库直接到另一个数据库,而不是去文件系统,并让备份看起来好像从未发生过(即REAL备份仍将备份所有真正需要备份的项目)?

还有哪些其他选择?我有来自Red Gate的SQL Compare和SQL Data Compare,但我需要向某些用户公开此功能(具有高权限和访问DEV站点),并且他们没有。

5 个答案:

答案 0 :(得分: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

特别注意命令中的MOVE语句 ...默认情况下,RESTORE会将文件还原到最初备份的物理文件,而不是Dev DB文件,尽管事实是你正在恢复到DEV数据库......我几乎找不到,当我进行恢复时,SSMS抱怨文件正在被另一个数据库使用...... OMG,这是多么不直观。

答案 1 :(得分: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)

答案 2 :(得分:1)

您可以直接从其他数据库还原数据库。

如果您使用的是SQL Management Studio,请在“还原数据库”对话框中选择“从数据库”而不是“从设备”。

答案 3 :(得分:1)

您通常希望从备份还原整个数据库。尝试直接从实时运行的prod数据库执行此操作可能会导致用户出现锁定问题。您可以使用SSIS执行此操作,但设置正确既不简单也不快捷。

另一种可能性是你可以暂时关闭产品(只有你有一个用户不在数据库中的时间段)。然后分离数据库。分离dev数据库并删除它。将文件复制到开发服务器并再次附加两个数据库。这可能比恢复更快,但现在这是一个罕见的环境,在生产中没有24小时数据访问。

顺便说一下,将dev和prod放在不同的服务器上是非常可取的。

如果要还原到dev,则需要确保尚未提交到prod的任何dev更改都是脚本化的,因此可以在还原后立即运行它们。最好是编写任何和所有数据库更改的脚本并将它们存储在源代码管理中。这样可以更容易地做到这一点。

答案 4 :(得分:0)

我们对生产数据进行按需备份,然后在开发计算机上恢复备份。

相关问题