如何使用备份和还原创建数据库副本

时间:2014-05-18 10:45:08

标签: sql sql-server database copy ms-query

使用SQL Server Management Studio 2012,我正在尝试创建本地数据库的副本。我发现了一些解决方案的变种。其中之一 - 备份和恢复数据库为新的 - HERE

目前创建名为Rewards2_bak的数据库备份。此文件副本放入系统目录C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\

enter image description here

下一步 - 创建查询以将数据库还原为现有数据库的副本

GO
use master
RESTORE FILELISTONLY
    FROM Rewards2_bak

RESTORE DATABASE Rewards2_Copy
    FROM Rewards2_bak
    WITH RECOVERY,
    MOVE 'Rewards2_data' TO 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\Rewards2_copy.mdf',
    MOVE 'Rewards2_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\Rewards2_log_copy.ldf'
GO

收到错误,我没有备用设备Rewads2_backup。我是正确的理解在这种情况下像设备我可以使用文件,还有文件位置?想想失踪的东西......

创建备份使用下一个查询(全部OK)

USE Rewards2;
GO
BACKUP DATABASE Rewards2
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\Rewards2_bak.bak'
   WITH FORMAT,
      MEDIANAME = 'SQLServerBackups',
      NAME = 'Full Backup of Rewards2';
GO

还尝试使用SQL Server 2012 Task --> BackupTask --> Restore中的工具,但出现错误 - 无法创建备份。 (启动了具有管理员权限的程序)

这是我配置如何恢复复制

的屏幕

enter image description here

但我有错误,我无法覆盖数据库文件Rewards2。这就是问题 - 如果我添加数据库Rewards2的新名称,为什么要覆盖Rewards2_copy。或者我理解错了什么?

enter image description here

舒尔,这是制作数据库副本的一些可能的变种,但真的很想找到这个解决方案的问题。我犯错误/忘记或不理解的地方。

3 个答案:

答案 0 :(得分:3)

从备份还原数据库时,它将使用与原始数据库相同的文件名。 您需要在还原期间更改这些文件名。

在还原窗口中,转到Files标签。在此窗口中,您有一个名为Restore As的列。 在您看到的每个文件的“还原为”列中更改路径末尾的文件名。

答案 1 :(得分:2)

我认为您正在尝试覆盖您要复制的数据库中的逻辑文件名...猜测一下但尝试一下 - 如果您不需要立即编写脚本,请在SSMS中尝试:

  1. 备份您要复制的数据库(Rewards2_bak.bak没问题)
  2. 创建新数据库(Rewards2_copy)
  3. 使用Rewards2_bak.bak
  4. 恢复到Rewards2_copy

    请记住在第三点中更改选项选项卡中的逻辑文件名 - 否则您将尝试覆盖Rewards2文件。

    周围有很多指南:

    通过SQL确定您可以使用的逻辑文件名:filelistonly

    restore filelistonly from disk='enter backup file path here'
    

    然后使用报告的文件名构建恢复查询,就像您已经尝试过的那样

答案 2 :(得分:0)

这是将备份和还原DB到另一台服务器的VBS脚本。它假定每个服务器都有" Backup"文件共享。该脚本可以从任何位置运行。

sFrom  = "\\server1\Backup"
sTo = "\\server2\Backup"
Set fso = CreateObject("Scripting.FileSystemObject")

CopyDb "Db1"
CopyDb "Db2"

MsgBox "Done!"

Sub CopyDb(sDB)

  If fso.FileExists(sFrom & "\" & sDB & ".bak") Then
     fso.DeleteFile sFrom & "\" & sDB & ".bak"
  End If

  ExecuteSql "server1", "BACKUP DATABASE " & sDB & " TO DISK = '" & sFrom & "\" & sDB & ".bak'"

  fso.CopyFile sFrom & "\" & sDB & ".bak",  sTo & "\" & sDB & ".bak"

  ExecuteSql "server2", "ALTER DATABASE " & sDB & " SET SINGLE_USER WITH ROLLBACK IMMEDIATE"
  ExecuteSql "server2", "RESTORE DATABASE " & sDB & " FROM  DISK = N'" & sTo & "\" & sDB & ".bak'"
  ExecuteSql "server2", "EXEC " & sDB & ".dbo.sp_change_users_login 'Update_One', 'user1', 'user1'"
End Sub

Sub ExecuteSql(sServer, sSql)
  Set cn = CreateObject("ADODB.Connection")
  cn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=" & sServer
  cn.Execute sSql
  cn.Close
End Sub