繁体   English   中英

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

[英]How to create copy of database using backup and restore

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

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

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

在此处输入图像描述

但我有错误,我无法覆盖数据库文件Rewards2 这是一个问题 - 如果我输入数据库Rewards2_copy Rewards2 还是我理解错了?

在此处输入图像描述

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

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

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

我认为您正在尝试覆盖您要复制的数据库中的逻辑文件名...有点猜测,但请尝试执行此操作-如果现在不需要编写脚本,请在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'

然后,请使用已报告的文件名构建您的还原查询,

这是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

除了@JodyT 的回答:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM