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

Sql server 创建SQL Server数据库工作副本的最佳方法是什么?,sql-server,backup,Sql Server,Backup,我有一个SQL数据库,目前正在从Access数据库转换。Access数据库的一个功能是“复制DB”,在“开发”站点中工作时使用—它通过将生产文件物理复制到开发站点来复制所有生产数据。通过这种方式,所有生产数据、结构和查询以及所有内容都复制到开发版本中。这只需要在我们测试为什么会发生某些事情并且我们不想参与生产数据时偶尔进行;不罕见,但也不频繁——可能一个月一次或两次。我想知道其他人在使用SQL时做了什么来实现这一点 我想我可以先进行数据库备份,然后再恢复到开发版本,但我不希望此备份干扰正常的备份

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

我想我可以先进行数据库备份,然后再恢复到开发版本,但我不希望此备份干扰正常的备份过程。是否有任何方法可以直接从一个数据库备份到另一个数据库,而不是转到文件系统,并使备份看起来从未发生过,即真正的备份仍将备份所有真正需要备份的项目


还有什么其他选择?我有来自Red Gate的SQL Compare和SQL Data Compare,但我需要将此功能公开给某些具有高权限和访问开发站点权限的用户,而他们没有

您可以直接从另一个数据库还原数据库


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

您可以直接从另一个数据库还原数据库


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

我们按需备份生产数据,然后在开发人员计算机上还原备份。

我们按需备份生产数据,然后在开发人员的计算机上恢复备份。

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

另一种可能性是,只有当用户不在数据库中时,才可以暂时关闭prod。然后分离数据库。分离dev数据库并将其删除。将该文件复制到dev服务器,并再次连接两个数据库。这可能比恢复更快,但现在很少有环境在生产环境中没有24小时的数据访问

顺便说一句,最好在单独的服务器上安装dev和prod


如果要恢复到dev,则需要确保所有尚未提交到prod的dev更改都已编写脚本,以便在恢复后立即运行这些更改。最好编写任何和所有数据库更改的脚本,并将它们存储在源代码管理中。这样做会更容易。

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

另一种可能性是,只有当用户不在数据库中时,才可以暂时关闭prod。然后分离数据库。分离dev数据库并将其删除。将该文件复制到dev服务器,并再次连接两个数据库。这可能比恢复更快,但现在很少有环境在生产环境中没有24小时的数据访问

顺便说一句,最好在单独的服务器上安装dev和prod


如果要恢复到dev,则需要确保所有尚未提交到prod的dev更改都已编写脚本,以便在恢复后立即运行这些更改。最好编写任何和所有数据库更改的脚本,并将它们存储在源代码管理中。这样做就更容易了。

好吧,环顾四周后,我得出结论,我确实必须检查文件系统,但有一种方法可以通过使用“仅复制”模式在不影响正常备份过程的情况下执行备份/恢复。下面是执行此操作的脚本:

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语句。。。默认情况下,还原将文件还原到最初备份的物理文件,而不是Dev DB文件,尽管您正在还原到Dev DB。。。当我进行恢复时,我几乎发现了困难,SSMS抱怨文件被另一个db使用。。。天哪,这太不直观了。

好吧,环顾四周后,我得出结论,我确实必须检查文件系统,但有一种方法可以通过使用“仅复制”模式在不影响正常备份过程的情况下执行备份/恢复。下面是执行此操作的脚本:

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语句
命令默认情况下,还原将文件还原到最初备份的物理文件,而不是Dev DB文件,尽管您正在还原到Dev DB。。。当我进行恢复时,我几乎发现了困难,SSMS抱怨文件被另一个db使用。。。OMG,多么不直观。

上面的脚本可以工作,但不会更改复制的服务器的逻辑文件名。因此,如果您尝试再次运行它以反转进程,它将在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)

上面的脚本可以工作,但不会更改复制的服务器的逻辑文件名。因此,如果您尝试再次运行它以反转进程,它将在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)

隐马尔可夫模型。。。此外,这似乎仍然是从数据库备份恢复,而不是数据库的“实时运行版本”。。。也就是说,选择数据库似乎只是列出在该数据库上执行了哪些备份的方便方式。哇,你说得对。我没有注意到,因为我有我所有数据库的备份。我想你得检查一下文件系统。嗯。。。此外,这似乎仍然是从数据库备份恢复,而不是数据库的“实时运行版本”。。。也就是说,选择数据库似乎只是列出在该数据库上执行了哪些备份的方便方式。哇,你说得对。我没有注意到,因为我有我所有数据库的备份。我想你得检查一下文件系统。