如何在SQL Server中还原到其他数据库?


224

我有一个星期前的Database1备份。备份每周在调度程序中完成,我得到一个.bak文件。现在,我想弄弄一些数据,因此需要将其还原到另一个数据库Database2中

我已经看到了这个问题:在同一台PC中使用不同的名称还原SQL Server数据库,建议的步骤是重命名原始db,但是由于我不在生产服务器中,因此无法使用该选项,并且我不能真正做到这一点。

还有其他方法可以还原它Database2,或者至少如何浏览该.bak文件的数据吗?

谢谢。

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

还原文件列表异常终止

Answers:


304

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

查看内容;

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'

要创建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).

5
嗨,我似乎缺少了一些东西,它不断抛出错误backkup set holds a backup of a database other than existing "tmp" database,据我所知。该to短语是否应为的实际物理路径MyTempCopy
LocustHorde 2011年

奇怪的to是,新数据库的数据库和日志位置,上面的更新示例
Alex K.11年

52
对于其他尝试此操作的人,请勿创建MyTempCopy,它是在还原期间创建的。
开拓者2012年

3
在我的情况下(SQL2012)cr仅使用REPLACE,RECOVERY和选项工作。dba.stackexchange.com/questions/51489/...
dc2009

7
应该使用REPLACE,RECOVERY来解决。因此,这将是: RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak' WITH REPLACE, RECOVERY, MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf', MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'
Raihan

67

SQL Server 2008 R2:

对于您要“还原的现有数据库:从其他数据库的备份中,请执行以下步骤:

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

12
MS SQL Server 2010?
2014年


尽管是程序员,但我还是愿意使用此向导。更轻松,更清洁。
v1n1akabozo

1
关键步骤对我来说是#8。谢谢丹尼尔。
jbooker

SQL 2014。。步骤6a:将“目标”数据库更改为要还原到的数据库。步骤9和10:应该通过更改目标数据库来为您解决。但是,请按照原始步骤9和10中的说明转到“文件”并检查文件名,以进行仔细检查
。– JzInqXc9Dg,

49

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

请注意,第 4步和第7步的设置很重要,以免覆盖现有数据库。


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

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

    • 数据库

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

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

    • 设备

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

        注意 仅当选择“设备”时,此列表才可用。只有在所选设备上具有备份的数据库才可用。

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

3
这个作品就像一种魅力。特别感谢步骤4,5及7
阿纳托利Yakimchuk

此外,我必须转到“选项”选项卡并选中“覆盖现有数据库(替换)”,然后它才能工作。
约翰·库兹

1
@JohnKurtz如果要还原到新数据库,则不需要这样做。
腐烂

我已经创建了一个空数据库来还原。那一定是区别。
约翰·库兹

1
确认如果您在步骤4中输入不存在的数据库的名称,它可以按描述的那样工作。确认是否选择了一个已经存在的数据库,则必须选中“选项标签。谢谢你的耐心!
约翰·库尔兹

34

实际上,由于您“想弄弄一些数据”并“浏览该.bak文件的数据”,因此无需使用本机SQL Server术语来还原数据库。

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

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

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


9

这是我从各种文章中收集来的内容,以使用备份和还原来移动数据库以修复物理位置,并使用其他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);

您好NateN,我想将我的.bak(存在于本地计算机d:驱动器路径中)文件还原到另一个DB。我尝试了此代码进行单元测试,但给出了错误提示。“由于数据库无法获得独占访问正在使用中。“无法还原数据库..您能帮我怎么做..吗?
维克多·阿索提

您要还原到的数据库不能被另一个进程使用。我不确定如何编写脚本来杀死所有访问数据库的进程。
内森·尼森

您好NateN,现在工作正常,我使用您的示例代码,然后对该代码进行了少量更改,然后工作正常...。再次感谢您提供示例代码...
Victor Athoti。

1
对于sql2014和超越,DECLARE @BackupFiles...行需要一个额外的列:SnapshotURL nvarchar(360)
菲亚特

3

实际上,这比恢复到同一服务器要简单一些。基本上,您只需要浏览“还原数据库”选项。这是为您准备的教程:

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

尤其是由于这是非生产性还原,因此您只需尝试一下就可以放心,而不必过多担心细节。只需将您的SQL文件放在新服务器上的所需位置,并为它提供所需的任何名称,就可以了。


嗨,我需要还原到同一台服务器,不同的数据库...(还原数据库具有不同的名称)
LocustHorde 2011年

抱歉,我看错了问题。应用相同的基本原理,只需确保新名称和文件名(mdf,ldf等)不同即可。
IAmTimCorey 2011年

3

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

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

3
  • 使用旧数据库还原新数据库时,出现与本主题相同的错误。(使用.bak会给出相同的错误)

  • 我通过新数据库的名称更改了旧数据库的名称(与这张图片相同)。有效。

在此处输入图片说明


2
下次,请删除银行的名称
-Danh,

1

这是如何将备份还原为具有唯一数据库名称的其他数据库。

对于SQL 2005,这非常快速。我敢肯定,较新的版本可以正常工作。

首先,您不必使原始数据库脱机。但是为了安全起见,我喜欢这样做。在我的示例中,我将装入“计费”数据库的克隆,并将其命名为“ 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)接下来,在Management Studio中,rt单击“对象资源管理器”中的“数据库”,选择“还原数据库”

4)在“到数据库”字段中输入新名称。IE billingclone

5)在还原源中,单击“来自设备”,然后单击...导航按钮

6)点击添加并导航到您的备份

7)在“还原”旁边打一个勾号(选择要还原的备份集)

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

9)现在,在RESTORE AS中编辑数据库文件名。对数据库和日志都执行此操作。IE billingclone.mdf和billingclone_log.ldf

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

11)在您的对象资源管理器中单击刷新,您将看到新的数据库

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;

完成!


1
  1. 使用不同名称的“复制数据库”选项从数据库复制
  2. 备份新复制的数据库
  3. 恢复它!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.