如何在SQL Server中恢复到不同的数据库?

我有一个备份的Database1从一个星期前。在调度程序中每周进行备份,我得到一个.bak文件。现在我想要摆弄一些数据,所以我需要将其恢复到不同的数据库- Database2

我已经看到这个问题:恢复同一pc上不同名称的SQL Server数据库和建议的步骤是重命名原来的db,但我不在这个选项,因为我在生产服务器,我不能真正做到这一点。

是否有其他方法将其恢复为Database2,或者至少,我如何浏览该.bak文件的数据?

谢谢。

Ps:上面链接的第二个答案看起来很有希望,但它总是以错误告终:

恢复文件列表异常终止

435298 次浏览

实际上,这比恢复到同一台服务器要简单一些。基本上,您只需浏览“恢复数据库”选项。这里有一个教程给你:

http://www.techrepublic.com/blog/window-on-windows/how-do-i-restore-a-sql-server-database-to-a-new-server/454

特别是因为这是一个非生产恢复,您可以放心地尝试它,而不必担心过多的细节。只需将SQL文件放在新服务器上您想要的位置,并给它起任何您想要的名称,就可以开始了。

您可以创建一个新的数据库,然后使用“恢复向导”。启用覆盖选项或:

查看备份文件内容:

RESTORE FILELISTONLY FROM DISK='c:\your.bak'

注意.mdf &.ldf从结果,那么:

RESTORE DATABASE MyTempCopy FROM DISK='c:\your.bak'
WITH
MOVE 'LogicalNameForTheMDF' TO 'c:\MyTempCopy.mdf',
MOVE 'LogicalNameForTheLDF' TO 'c:\MyTempCopy_log.ldf'

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

(不要创建MyTempCopy,它是在恢复过程中创建的)


示例(恢复名为'creditline'的db的备份到'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).

SQL Server 2008 R2:

对于您希望“从不同数据库的备份恢复:”的现有数据库,请执行以下步骤:

  1. 从工具栏中单击“活动监视器”按钮。
  2. 单击流程。根据要恢复的数据库进行筛选。通过右键单击每个进程并选择“Kill process”来杀死所有正在运行的进程。
  3. 右键单击要恢复的数据库,并选择Tasks—> restore—>From database。
  4. 选择“From Device:”单选按钮。
  5. 选择……然后选择要从中恢复的其他数据库的备份文件。
  6. 通过选择备份集左侧的复选框,选择要从中恢复的备份集。
  7. 选择“选项”。
  8. 选择覆盖现有数据库(WITH REPLACE)
  9. 重要的是:将“还原为”行数据文件名称更改为您希望覆盖的现有数据库的文件名或只是给它一个新名称。
  10. 对日志文件文件名执行同样的操作。
  11. 从活动监视器屏幕验证没有生成新的进程。如果是,就杀了他们。
  12. 单击OK。

对于SQL Server 2012,使用SQL Server Management Studio,我发现从微软页面恢复到不同的数据库文件和名称的这些步骤很有用:(ref: http://technet.microsoft.com/en-us/library/ms175510.aspx)

< >强注 < / >强步骤4和7的设置很重要,这样就不会覆盖现有的数据库。


将数据库恢复到新位置,并可选地重命名数据库

  1. 连接到SQL Server数据库引擎的适当实例,然后在对象资源管理器中单击服务器名称展开 服务器树。
  2. 右键单击数据库,然后单击恢复数据库。打开恢复数据库对话框。
  3. 一般页上,使用部分指定要恢复的备份集的源和位置。选择其中一个 以下选项:< / p >

    • < p > 数据库

      • 在下拉列表中选择要恢复的数据库。列表中仅包含已根据 Msdb backup history.日志含义

        请注意如果备份来自不同的服务器,目标服务器将没有备份历史信息 用于指定的数据库。此时,请手动选择“设备” 指定要恢复的文件或设备

      • . 李< / ul > < / >
      • < p > 设备

        • 单击browse(…)按钮打开选择备份设备对话框。在备份介质类型框中,选择其中之一 列出的设备类型。属性的一个或多个设备 “备份媒体”框,单击“添加”。将需要的设备添加到备份媒体列表框后,单击好吧返回到 一般< /强>页面。在来源:设备:数据库列表框中,选择要恢复的数据库的名称。

          请注意此列表仅当选择“Device”时可用。只有在所选设备上有备份的数据库才会被删除 可用。< / em > < / p > < /李> 李< / ul > < / > 李< / ul > < / >

        • 目的地部分中,数据库框将自动填充要恢复的数据库的名称。 若要更改数据库的名称,请在 < / >强盒数据库。
        • 恢复到框中,保留默认值为到最后一个备份或单击时间轴访问Backup 时间轴对话框手动选择停止的时间点 恢复行动。李< / >
        • 在“备份集要恢复”中 grid,选择要恢复的备份。此网格显示指定对象可用的备份 的位置。缺省情况下,系统建议创建恢复计划。要覆盖 建议的恢复计划,您可以更改网格中的选择。 依赖于以前备份的恢复的备份是
        • .取消选中前一个备份时自动取消选中
        • 要指定数据库文件的新位置,选择文件页,然后单击将所有文件重新定位到文件夹。为数据文件夹日志文件提供一个新位置 文件夹> < /强。或者,您也可以保留相同的文件夹,只是重命名数据库和日志文件的名称

实际上,在本地SQL Server术语中不需要恢复数据库,因为您“想要摆弄一些数据”和“浏览。bak文件中的数据”

你可以使用ApexSQL Restore -一个SQL Server工具,可以通过SQL Server Management Studio, Visual Studio或任何其他第三方工具访问。它允许附加单个或多个完整、差异和事务日志备份

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

免责声明:我是ApexSQL的产品支持工程师

以下是我从各种文章中拼凑出来的内容,使用备份和恢复来复制数据库,并使用move来修复物理位置,使用额外的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);
  • 当我使用旧数据库恢复新数据库时,遇到了与本主题相同的错误。(使用.bak也会出现同样的错误)

  • 我用新数据库的名称更改了旧数据库的名称(与此图相同)。它工作。

enter image description here

下面介绍如何将备份恢复为具有唯一db名称的附加db。

对于SQL 2005,这工作得非常快。我相信更新的版本也会有同样的效果。

首先,您不必让原始db脱机。但为了安全起见,我还是想。在我的例子中,我将挂载我的“账单”数据库的克隆,它将被命名为“billingclone”。

1)做好计费数据库的备份

2)为了安全起见,我将原件下线如下:

3)打开一个新的查询窗口

* *重要!保持这个查询窗口打开,直到全部完成!你需要从这个窗口恢复数据库!

现在输入以下代码:

-- 1) free up all USER databases
USE master;
GO
-- 2) kick all other users out:
ALTER DATABASE billing SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3) prevent sessions from re-establishing connection:
ALTER DATABASE billing SET OFFLINE;

3)接下来,在管理工作室,在对象资源管理器中单击数据库,选择“恢复数据库”

4)在“To Database”字段中输入新的名称。即billingclone

5)在“Source for Restore”中,点击“From Device”,点击…导航按钮

6)单击Add并导航到您的备份

7)在“恢复”旁打勾(选择要恢复的备份集)

8)接下来选择上方LH角的OPTIONS页面

9)现在在RESTORE AS中编辑数据库文件名。对db和日志都这样做。即billingclone。MDF和billingclone_log.ldf

10)现在点击OK,等待任务完成。

11)在对象资源管理器中点击刷新,你将看到你的新db

12)现在你可以把你的账单数据库重新上线了。使用脱机计费时使用的相同查询窗口。使用该命令:

-- 1) free up all USER databases
USE master; GO
-- 2) restore access to all users:
ALTER DATABASE billing SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO
-- 3) put the db back online:
ALTER DATABASE billing SET ONLINE;

完成了!

如果不存在数据库,我使用以下代码:

ALTER PROCEDURE [dbo].[RestoreBackupToNewDB]
@pathToBackup  varchar(500),--where to take backup from
@pathToRestoreFolder  varchar(500), -- where to put the restored db files
@newDBName varchar(100)
AS
BEGIN


SET NOCOUNT ON
DECLARE @fileListTable TABLE (
[LogicalName]           NVARCHAR(128),
[PhysicalName]          NVARCHAR(260),
[Type]                  CHAR(1),
[FileGroupName]         NVARCHAR(128),
[Size]                  NUMERIC(20,0),
[MaxSize]               NUMERIC(20,0),
[FileID]                BIGINT,
[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) -- remove this column if using SQL 2005
)
INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK ='''+ @pathToBackup+'''')
DECLARE @restoreDatabaseFilePath NVARCHAR(500)
DECLARE @restoreLogFilePath NVARCHAR(500)
DECLARE @databaseLogicName NVARCHAR(500)
DECLARE @logLogicName NVARCHAR(500)
DECLARE @pathSalt uniqueidentifier = NEWID()


SET @databaseLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='D')
SET @logLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='L')
SET @restoreDatabaseFilePath= @pathToRestoreFolder + @databaseLogicName + convert(nvarchar(50), @pathSalt) + '.mdf'
SET @restoreLogFilePath= @pathToRestoreFolder + @logLogicName + convert(nvarchar(50), @pathSalt) + '.ldf'


RESTORE DATABASE @newDBName FROM DISK=@pathToBackup
WITH
MOVE @databaseLogicName TO @restoreDatabaseFilePath,
MOVE @logLogicName TO @restoreLogFilePath


SET NOCOUNT OFF
END
  1. 用“复制数据库”选项从数据库中复制一个不同的名称
  2. 备份新复制的数据库
  3. 恢复它!