0

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

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

在此处输入图像描述

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

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。我是对的,在这种情况下,我可以使用文件,也可以使用文件位置?想想少了点什么……

用于创建备份使用下一个查询(一切正常)

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 2012Task --> Backup和中的工具Task --> Restore,但出现错误 - 无法创建备份。(以管理员权限启动的程序)

这是我如何配置还原以复制的屏幕

在此处输入图像描述

但我有错误,我无法覆盖数据库文件Rewards2Rewards2这是一个问题 -如果我输入新的数据库名称,它为什么要覆盖Rewards2_copy。还是我理解错了?

在此处输入图像描述

舒尔,还有一些可能的变体来制作数据库的副本,但真的想为这个解决方案找到问题。我在哪里犯错/我忘记了什么或不明白什么。

4

4 回答 4

3

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

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

于 2014-05-18T11:03:48.630 回答
3

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

  1. 备份你要复制的数据库(Rewards2_bak.bak 就可以了)
  2. 创建一个新数据库(Rewards2_copy)
  3. 使用 Rewards2_bak.bak 恢复到 Rewards2_copy

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

周围有很多指南:

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

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

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

于 2014-05-18T11:07:20.317 回答
0

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

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
于 2018-03-07T22:31:03.067 回答
0

除了@JodyT 的回答:

在我的情况下,您不仅需要更改逻辑文件名,而且删除选项“在还原前进行尾日志备份”也很重要。如果选中此选项,那么如果 Rewards2 正在使用中,您将无法恢复到 Rewards2_copy!

于 2022-01-18T10:48:05.940 回答