如何在sql server中恢复到不同的数据库?

Loc*_*rde 214 backup restore sql-server-2008

我从一周前开始备份Database1.备份在调度程序中每周完成,我得到一个.bak文件.现在我想摆弄一些数据,所以我需要将它恢复到另一个数据库 - Database2.

我已经看到了这个问题:在不同名称的同一台PC上恢复SQL Server数据库,建议的步骤是重命名原始数据库,但我没有那个选项,因为我在生产服务器中,我真的不能这样做.

有没有其他方法可以恢复它Database2,或者至少,我如何浏览该.bak文件的数据?

谢谢.

ps:来自上面链接的第二个答案看起来很有希望,但它一直以错误结束:

还原文件列表异常终止

Ale*_* K. 291

您可以创建一个新的数据库,然后使用"还原向导"启用"覆盖"选项或;

查看内容;

RESTORE FILELISTONLY FROM DISK='c:\your.bak'
Run Code Online (Sandbox Code Playgroud)

请注意结果中.mdf和.ldf的逻辑名称;

RESTORE DATABASE MyTempCopy FROM DISK='c:\your.bak'
WITH 
   MOVE 'LogicalNameForTheMDF' TO 'c:\MyTempCopy.mdf',
   MOVE 'LogicalNameForTheLDF' TO 'c:\MyTempCopy_log.ldf'
Run Code Online (Sandbox Code Playgroud)

MyTempCopy使用内容创建数据库your.bak.

示例(将名为'creditline'的数据库备份恢复为'MyTempCopy';

RESTORE FILELISTONLY FROM DISK='e:\mssql\backup\creditline.bak'

>LogicalName
>--------------
>CreditLine
>CreditLine_log

RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak'
WITH 
   MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf',
   MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'

>RESTORE DATABASE successfully processed 186 pages in 0.010 seconds (144.970 MB/sec).
Run Code Online (Sandbox Code Playgroud)

  • 对于其他尝试此操作的人,请不要创建MyTempCopy,它是在还原期间创建的. (47认同)
  • 应该使用REPLACE,RECOVERY来解决这个问题.所以这将是:`RESTORE DATABASE MyTempCopy FROM DISK ='e:\ mssql\backup\creditline.bak'WITH REPLACE,RECOVERY,MOVE'CreditLine'to'e:\ mssql\MyTempCopy.mdf',MOVE'FreditLine_log'TO "E:\ MSSQL\MyTempCopy_log.ldf'` (6认同)
  • 嗨,我似乎丢失了一些东西,它不断抛出错误``backkup set保存除现有"tmp"数据库​​`之外的数据库的备份,我明白了.``to``短语应该是``MyTempCopy``的实际物理路径? (3认同)
  • 仅适用于我的案例中的REPLACE,RECOVERY选项(SQL2012)cr.https://dba.stackexchange.com/questions/51489/sql-server-2012-restore-backup-to-new-db-name/51490#51490?newreg=d677fbcc1f01466f9ee3ccb9df85f2a8 (2认同)

Dan*_*rne 66

SQL Server 2008 R2:

对于您希望"还原的现有数据库:从不同数据库的备份中执行以下步骤:

  1. 从工具栏中,单击"活动监视器"按钮.
  2. 单击进程.按要还原的数据库筛选.通过右键单击每个进程并选择"kill process"来终止所有正在运行的进程.
  3. 右键单击要还原的数据库,然后选择"任务" - >"还原" - >"从数据库".
  4. 选择"从设备:"单选按钮.
  5. 选择...并选择要从中还原的其他数据库的备份文件.
  6. 通过选中备份集左侧的复选框,选择要还原的备份集.
  7. 选择"选项".
  8. 选择覆盖现有数据库(WITH REPLACE)重要说明:
  9. 将"还原为"行数据文件名更改为要覆盖的现有数据库的文件名,或者只是为其指定一个新名称.
  10. 对日志文件文件名执行相同操作.
  11. 从活动监视器屏幕验证没有生成新进程.如果他们是,杀了他们.
  12. 单击确定.

  • MS SQL Server 2010? (12认同)
  • 这里有一些截图http://stackoverflow.com/questions/3829271/how-can-i-clone-an-sql-server-database-on-the-same-server-in-sql-server-2008-exp/26265624#26265624 (3认同)
  • 对我来说,关键步骤是#8。谢谢丹尼尔。 (2认同)

Rot*_*ots 42

对于SQL Server 2012,使用Sql Server Management Studio,我发现Microsoft页面中的这些步骤可用于还原到其他数据库文件和名称:(ref:http://technet.microsoft.com/en-us/library/ms175510 .aspx)

注意 步骤4和7对于设置非常重要,以便不覆盖现有数据库.


将数据库还原到新位置,并可选择重命名数据库

  1. 连接到SQL Server数据库引擎的相应实例,然后在对象资源管理器中,单击服务器名称以展开服务器树.
  2. 右键单击" 数据库",然后单击"还原数据库".将打开" 还原数据库"对话框.
  3. 在" 常规"页面上,使用" 源"部分指定要还原的备份集的源和位置.选择以下选项之一:

    • 数据库

      • 从下拉列表中选择要还原的数据库.该列表仅包含根据msdb备份历史记录备份的数据库 .

        注意如果备份是从其他服务器获取的,则目标服务器将不具有指定数据库的备份历史记录信息.在这种情况下,请选择"设备"以手动指定要还原的文件或设备.

    • 设备

      • 单击浏览(...)按钮以打开" 选择备份设备"对话框.在" 备份媒体类型"框中,选择一种列出的设备类型.要为" 备份媒体"框选择一个或多个设备 ,请单击" 添加".将所需设备添加到" 备份媒体"列表框后,单击" 确定"返回" 常规"页面.在" 源:设备:数据库"列表框中,选择应还原的数据库的名称.

        注意 此列表仅在选择"设备"时可用.只有在所选设备上具有备份的数据库才可用.

  4. 在" 目标"部分中," 数据库"框将自动填充要还原的数据库的名称.要更改数据库的名称,请在" 数据库"框中输入新名称 .
  5. 在" 还原到"框中,保留默认设置为"上次备份"或单击" 时间线"以访问" 备份时间线"对话框,以手动选择停止恢复操作的时间点.
  6. 在"要还原的备份集"网格中,选择要还原的备份.此网格显示指定位置的可用备份.默认情况下,建议使用恢复计划.要覆盖建议的恢复计划,您可以更改网格中的选择.取消选择早期备份时,将自动取消选择依赖于恢复早期备份的备份.
  7. 若要指定数据库文件的新位置,请选择" 文件"页面,然后单击"将所有文件重新定位到文件夹".为数据文件文件夹日志文件文件夹提供新位置.或者,您可以保留相同的文件夹,只需重命名数据库和日志文件名.

  • 这个作品就像一种魅力。特别感谢步骤4和7 (2认同)
  • 确认如果您在步骤 4 中输入不存在的数据库的名称,它会按照描述的那样工作。确认如果您选择已经存在的其他数据库,您必须选中“覆盖现有数据库(WITH REPLACE)”选项选项卡。谢谢你的耐心! (2认同)

小智 34

实际上,没有必要用本机SQL Server术语恢复数据库,因为你"想要摆弄一些数据"和"浏览那个.bak文件的数据"

您可以使用ApexSQL Restore - 一种SQL Server工具,它将本机和本机压缩的SQL数据库备份和事务日志备份作为实时数据库附加,可通过SQL Server Management Studio,Visual Studio或任何其他第三方工具访问.它允许附加单个或多个完整,差异和事务日志备份

此外,我认为您可以在工具处于全功能试用模式(14天)时完成工作

免责声明:我在ApexSQL担任产品支持工程师


Nat*_*sen 8

这是我从各种帖子拼凑到一起使用备份和恢复来复制数据库,同时移动来修复物理位置和其他sql以修复逻辑名称.

/**
 * Creates (or resets) a Database to a copy of the template database using backup and restore.
 *
 * Usage: Update the @NewDatabase value to the database name to create or reset.
 */

DECLARE @NewDatabase SYSNAME = 'new_db';

-- Set up
USE tempdb;

DECLARE @TemplateBackups SYSNAME = 'TemplateBackups';
DECLARE @TemplateDatabase SYSNAME = 'template_db';
DECLARE @TemplateDatabaseLog SYSNAME = @TemplateDatabase + '_log';

-- Create a backup of the template database
BACKUP DATABASE @TemplateDatabase TO DISK = @TemplateBackups WITH CHECKSUM, COPY_ONLY, FORMAT, INIT, STATS = 100;

-- Get the backup file list as a table variable
DECLARE @BackupFiles TABLE(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileId tinyint,CreateLSN numeric(25,0),DropLSN numeric(25, 0),UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0),ReadWriteLSN numeric(25,0),BackupSizeInBytes bigint,SourceBlockSize int,FileGroupId int,LogGroupGUID uniqueidentifier,DifferentialBaseLSN numeric(25,0),DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit,TDEThumbprint varbinary(32));
INSERT @BackupFiles EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @TemplateBackups + '''');

-- Create  the backup file list as a table variable
DECLARE @NewDatabaseData VARCHAR(MAX);
DECLARE @NewDatabaseLog VARCHAR(MAX);

SELECT @NewDatabaseData = PhysicalName FROM @BackupFiles WHERE Type = 'D';
SELECT @NewDatabaseLog = PhysicalName FROM @BackupFiles WHERE Type = 'L';

SET @NewDatabaseData = REPLACE(@NewDatabaseData, @TemplateDatabase, @NewDatabase);
SET @NewDatabaseLog = REPLACE(@NewDatabaseLog, @TemplateDatabase, @NewDatabase);

RESTORE DATABASE @NewDatabase FROM DISK = @TemplateBackups WITH CHECKSUM, RECOVERY, REPLACE, STATS = 100,
   MOVE @TemplateDatabase TO @NewDatabaseData,
   MOVE @TemplateDatabaseLog TO @NewDatabaseLog;

-- Change Logical File Name
DECLARE @SQL_SCRIPT VARCHAR(MAX)='
    ALTER DATABASE [{NewDatabase}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}'', NEWNAME=N''{NewDatabase}'');
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}_log'', NEWNAME=N''{NewDatabase}_log'');
    ALTER DATABASE [{NewDatabase}] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
    SELECT name AS logical_name, physical_name FROM SYS.MASTER_FILES WHERE database_id = DB_ID(N''{NewDatabase}'');
';
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TemplateDatabase}', @TemplateDatabase);
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{NewDatabase}', @NewDatabase);
EXECUTE (@SQL_SCRIPT);
Run Code Online (Sandbox Code Playgroud)

  • 对于 sql2014 及更高版本,“DECLARE @BackupFiles...”行需要额外的列:“SnapshotURL nvarchar(360)” (2认同)