如何恢复到SQL Server中的不同数据库?
我有一个星期前的Database1的备份。 备份每周在调度程序中完成,我得到一个.bak
文件。 现在我想摆弄一些数据,所以我需要将其恢复到不同的数据库 – Database2 。
我已经看到了这个问题: 在不同名称的同一台电脑中恢复SQL Server数据库和build议的步骤是重命名原始数据库,但我没有这个选项,因为我在生产服务器,我真的不能这样做。
有没有其他的方法来恢复到Database2
,或者至less,如何浏览该.bak文件的数据?
谢谢。
ps:从上面的链接的第二个答案看起来很有希望,但它始终以错误终止:
恢复文件列表exception终止
您可以创build一个新的数据库,然后使用“恢复向导”启用覆盖选项或;
查看内容;
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
的内容创build数据库your.bak
。
示例(将名为“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:
对于希望“从其他数据库的备份中还原”的现有数据库,请执行以下步骤:
- 从工具栏中,单击“活动监视器”button。
- 点击进程。 按您想要恢复的数据库进行过滤。 通过右键单击每个进程并select“kill process”来杀死所有正在运行的进程。
- 右键单击要恢复的数据库,然后select“任务” – >“还原” – >“从数据库”。
- select“从设备:”单选button。
- select…,然后select要从中恢复的其他数据库的备份文件。
- 通过选中备份集左侧的checkbox,select要从中恢复的备份集。
- select“选项”。
- select覆盖现有数据库(WITH REPLACE)重要:
- 将“还原为”行数据文件名更改为您想要覆盖的现有数据库的文件名,或者给它一个新的名称。
- 对日志文件的文件名做同样的处理。
- 从活动监视器屏幕validation没有新的进程产生。 如果是的话,杀了他们。
- 点击OK。
对于SQL Server 2012,使用Sql Server Management Studio,我发现这些来自Microsoft页面的步骤对恢复到不同的数据库文件和名称很有用:(ref: http : //technet.microsoft.com/zh-cn/library/ms175510 .aspx )
注意 步骤4和7对设置很重要,以免覆盖现有的数据库。
将数据库还原到新位置,并可以select重命名数据库
- 连接到适当的SQL Server数据库引擎实例,然后在对象资源pipe理器中,单击服务器名称以展开服务器树。
- 用鼠标右键单击数据库 ,然后单击还原数据库 。 “ 还原数据库”对话框打开。
在“ 常规”页面上,使用“ 来源”部分指定要还原的备份集的来源和位置。 select以下选项之一:
数据库
从下拉列表中select要还原的数据库。 该列表仅包含根据msdb备份历史备份的数据库。
注意如果备份是从其他服务器获取的,则目标服务器将不具有指定数据库的备份历史logging信息。 在这种情况下,select设备手动指定要还原的文件或设备。
设备
单击浏览(…)button打开“ select备份设备”对话框。 在“ 备份媒体types”框中,select一个列出的设备types。 要为“ 备份媒体”框select一个或多个设备,请单击“ 添加” 。 将所需设备添加到“ 备份媒体”列表框后,单击“ 确定”返回到“ 常规”页面。 在“ 源:设备:数据库”列表框中,select应该恢复的数据库的名称。
注意此列表仅在select“设备”时可用。 只有在所选设备上具有备份的数据库才可用。
- 在“ 目标”部分中,“ 数据库”框将自动填充要恢复的数据库的名称。 要更改数据库的名称,请在“ 数据库”框中input新名称。
- 在“ 还原到”框中,保留默认设置为“最后一次备份”或单击“ 时间线”以访问“ 备份时间线”对话框,手动select一个时间点以停止恢复操作。
- 在“要还原网格的备份集”中 ,select要还原的备份。 此网格显示可用于指定位置的备份。 默认情况下,build议恢复计划。 要覆盖build议的恢复计划,可以更改网格中的select。 取消早期备份时,将自动取消select依赖于较早备份恢复的备份。
- 要指定数据库文件的新位置,请select文件页面,然后单击将所有文件重新定位到文件夹 。 为数据文件夹和日志文件夹提供一个新的位置。 或者,您可以保留相同的文件夹,只需重命名数据库和日志文件名称即可。
实际上,没有必要以本地SQL Server术语来恢复数据库,因为您“想要摆弄一些数据”和“浏览该.bak文件的数据”
您可以使用ApexSQL Restore – 一种SQL Server工具,该工具将本地和本地压缩的SQL数据库备份和事务日志备份作为实时数据库 ,可通过SQL Server Management Studio,Visual Studio或任何其他第三方工具访问。 它允许附加单个或多个完整,差异和事务日志备份
此外,我认为你可以在工具处于全function试用模式(14天)
免责声明:我在ApexSQL担任产品支持工程师
这里是我从各种post拼凑起来的复制数据库使用备份和恢复与移动修复的物理位置和额外的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);
这实际上比恢复到同一台服务器更简单一些。 基本上,你只需走“恢复数据库”选项。 这里是一个教程给你:
特别是由于这是一个非生产恢复,你可以放心地尝试一下,而不用担心细节太多。 只要把你的SQL文件放在新服务器上的任何地方,并给它任何你想要的名字,你就可以走了。
以下是如何使用唯一的数据库名称将备份恢复为额外的数据库。
对于SQL 2005,这个工作很快。 我相信更新的版本将工作相同。
首先,您不必将原始数据库脱机。 但为了安全起见,我喜欢。 在我的例子中,我将装载我的“结算”数据库的一个克隆,它将被命名为“billingclone”。
1)做好账单数据库的一个很好的备份
2)为了安全起见,我把原件离线如下:
3)打开一个新的查询窗口
**重要! 保持这个查询窗口打开,直到你全部完成! 你需要从这个窗口恢复数据库!
现在input下面的代码:
-- 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在对象资源pipe理器中单击数据库,select“还原数据库”
4)在“到数据库”字段中input新名称。 IE计费克隆
5)在“恢复源”中,单击“从设备”,然后单击…导航button
6)单击添加并导航到您的备份
7)勾选Restore(select要还原的备份集)旁边的复选标记
8)接下来select左上angular的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;
完成了!
如果没有数据库存在,我使用下面的代码:
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
-
当我通过旧数据库恢复一个新的数据库时,我也遇到了一些与此主题相同的错误。 (使用.bak得到相同的错误)
-
我通过新数据库的名称更改了旧数据库的名称(相同的图片)。 有效。