我有一个一周前的 Database1 备份。备份每周在调度程序中完成,我得到一个 .bak
文件。现在我想摆弄一些数据,所以我需要将它恢复到不同的数据库 - Database2。
我已经看到了这个问题:Restore SQL Server database in same pc with different name,推荐的步骤是重命名原始数据库,但我没有那个选项,因为我在生产服务器中,我真的做不到。
有没有其他方法可以将其恢复到 Database2
,或者至少,我如何浏览该 .bak 文件的数据?
谢谢。
ps:来自上述链接的第二个答案看起来很有希望,但它一直以错误终止:
恢复文件列表异常终止
您可以创建一个新数据库,然后使用“恢复向导”启用覆盖选项,或者:
查看备份文件的内容:
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”的数据库的备份恢复到“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:
对于您希望“恢复的现有数据库:从不同数据库的备份中执行以下步骤:
在工具栏中,单击活动监视器按钮。单击进程。按要还原的数据库过滤。通过右键单击每个进程并选择“终止进程”来终止所有正在运行的进程。右键单击要恢复的数据库,然后选择任务-->恢复-->从数据库。选择“从设备:”单选按钮。选择 ... 并选择您要从中恢复的其他数据库的备份文件。通过选中备份集左侧的复选框来选择要从中还原的备份集。选择“选项”。选择覆盖现有数据库 (WITH REPLACE) 重要提示:将“恢复为”行数据文件名更改为您希望覆盖的现有数据库的文件名,或者只是给它一个新名称。对日志文件文件名执行相同操作。从活动监视器屏幕验证没有产生新进程。如果是的话,杀了他们。单击确定。
对于 SQL Server 2012,使用 Sql Server Management Studio,我发现 Microsoft 页面中的这些步骤对于还原到不同的数据库文件和名称很有用:(参考:http://technet.microsoft.com/en-us/library/ms175510.aspx)
注意步骤 4 和 7 的设置很重要,以免覆盖现有数据库。
将数据库还原到新位置,并可选择重命名数据库 连接到 SQL Server 数据库引擎的相应实例,然后在对象资源管理器中,单击服务器名称以展开服务器树。右键单击数据库,然后单击还原数据库。 “恢复数据库”对话框打开。在“常规”页面上,使用“源”部分指定要还原的备份集的源和位置。选择以下选项之一: 数据库 从下拉列表中选择要恢复的数据库。该列表仅包含根据 msdb 备份历史记录备份的数据库。注意 如果备份来自不同的服务器,则目标服务器将没有指定数据库的备份历史信息。在这种情况下,选择设备以手动指定要恢复的文件或设备。设备 单击浏览 (...) 按钮打开选择备份设备对话框。在备份媒体类型框中,选择列出的设备类型之一。要为备份媒体框选择一台或多台设备,请单击添加。将您想要的设备添加到备份媒体列表框后,单击确定返回到常规页面。在 Source: Device: Database 列表框中,选择要恢复的数据库的名称。注意 此列表仅在选择设备时可用。只有在所选设备上有备份的数据库才可用。在目标部分,数据库框会自动填充要恢复的数据库的名称。要更改数据库的名称,请在“数据库”框中输入新名称。在“恢复到”框中,将默认设置保留为到上次备份,或单击“时间线”访问“备份时间线”对话框,手动选择一个时间点以停止恢复操作。在“要还原的备份集”网格中,选择要还原的备份。此网格显示可用于指定位置的备份。默认情况下,建议使用恢复计划。要覆盖建议的恢复计划,您可以更改网格中的选择。取消选择早期备份时,将自动取消选择依赖于早期备份还原的备份。要指定数据库文件的新位置,请选择文件页面,然后单击将所有文件重新定位到文件夹。为 Data 文件夹和 Log 文件夹提供一个新位置。或者,您可以保留相同的文件夹,只需重命名数据库和日志文件名。
实际上,没有必要以原生 SQL Server 术语来恢复数据库,因为您“想摆弄一些数据”和“浏览该 .bak 文件的数据”
您可以使用 ApexSQL Restore - 一种 SQL Server 工具,将本地和本地压缩的 SQL 数据库备份和事务日志备份附加为实时数据库,可通过 SQL Server Management Studio 访问, Visual Studio 或任何其他第三方工具。它允许附加单个或多个完整、差异和事务日志备份
此外,我认为您可以在该工具处于全功能试用模式(14 天)时完成这项工作
免责声明:我在 ApexSQL 担任产品支持工程师
这是我从各种帖子中拼凑起来的内容,以使用备份和还原复制数据库,并使用移动来修复物理位置和额外的 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);
DECLARE @BackupFiles...
行需要一个额外的列:SnapshotURL nvarchar(360)
它实际上比恢复到同一台服务器要简单一些。基本上,您只需浏览“还原数据库”选项。这是给你的教程:
特别是因为这是一个非生产恢复,你可以放心地尝试一下,而不必过多担心细节。只需将您的 SQL 文件放在新服务器上您想要的位置,并为其命名您想要的任何名称,您就可以开始使用了。
如果不存在数据库,我使用以下代码:
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 给出相同的错误)
我用新数据库的名称更改了旧数据库的名称(与这张图片相同)。有效。
https://i.stack.imgur.com/Gm30q.jpg
以下是如何将备份还原为具有唯一数据库名称的附加数据库。
对于 SQL 2005,这非常快。我确信较新的版本也能正常工作。
首先,您不必使原始数据库脱机。但是为了安全起见,我喜欢。在我的示例中,我将挂载我的“计费”数据库的克隆,并将其命名为“计费克隆”。
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中,在对象资源管理器中点击数据库,选择“恢复数据库”
4) 在“To Database”字段中输入新名称。 IE计费克隆
5) 在 Source for Restore 中,单击“From Device”并单击 ... 导航按钮
6) 单击添加并导航到您的备份
7) 在还原旁边打勾(选择要还原的备份集)
8)接下来选择左上角的OPTIONS页面
9) 现在在 RESTORE AS 中编辑数据库文件名。对数据库和日志执行此操作。 IE billingclone.mdf 和 billingclone_log.ldf
10) 现在点击 OK 并等待任务完成。
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;
完毕!
使用“复制数据库”选项从您的数据库中制作副本,使用不同的名称备份新复制的数据库恢复它!
backkup set holds a backup of a database other than existing "tmp" database
,我理解。to
短语应该是MyTempCopy
的实际物理路径吗?to
是 db &新数据库的日志位置,上面的更新示例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'