使用 SQL 查询从 BAK 文件恢复 SQL 数据库

使用 SQL 查询从 BAK 文件恢复 SQL 数据库

我已经将数据库以 BAK 文件格式备份到硬盘上。我试图恢复该备份,但无法恢复。

这是我的疑问:

ALTER DATABASE DBASE
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE

RESTORE DATABASE DBASE
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\Restore\DBASE.BAK'
WITH
MOVE 'DBASE' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\DATA\DBASE.MDF',
MOVE 'DBASE' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\DATA\DBASE_1.LDF',
MOVE 'DBASE' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\DATA\DBASE_2.LDF'

ALTER DATABASE DBASE SET MULTI_USER
GO

当我运行查询时出现以下错误:

以用户身份执行:NT AUTHORITY\SYSTEM。RESTORE 无法处理数据库“DBASE”,因为该会话正在使用它。建议在执行此操作时使用主数据库。[SQLSTATE 42000](错误 3102)RESTORE DATABASE 异常终止。[SQLSTATE 42000](错误 3013)。步骤失败。

我不想恢复主数据库。有人能告诉我如何使用 SQL 查询通过 BAK 文件恢复数据库吗?

答案1

它不是要求您恢复 master。它要求您在尝试恢复 DBASE 时不要位于 DBASE 中。

尝试:

USE MASTER
GO

ALTER DATABASE DBASE
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE    
GO

RESTORE DATABASE DBASE
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\Restore\DBASE.BAK'
WITH
MOVE 'DBASE' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\DATA\DBASE.MDF',
MOVE 'DBASE_LOG' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\DATA\DBASE_1.LDF', REPLACE    
GO

ALTER DATABASE DBASE SET MULTI_USER
GO

答案2

您可以通过执行以下命令恢复数据库备份:

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH REPLACE
GO

这会将现有数据库替换为较新的数据库。

答案3

我将首先使用以下语句验证备份文件:

restore headeronly from disk = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\Restore\DBASE.BAK'

...返回一个结果集,其中包含特定备份设备上所有备份集的所有备份头信息。

restore verifyonly from disk = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\Restore\DBASE.BAK'

...验证备份但不还原它,并检查备份集是否完整以及整个备份是否可读。但是,RESTORE VERIFYONLY 不会尝试验证备份卷中包含的数据的结构。在 Microsoft SQL Server 中,RESTORE VERIFYONLY 已得到增强,可以对数据进行额外检查,从而提高检测错误的概率。目标是尽可能接近实际的还原操作。

如果备份文件没有问题,那么您可以继续关闭数据库并确保没有其他人访问数据库:

USE MASTER
GO
ALTER DATABASE DBASE SET OFFLINE WITH ROLLBACK IMMEDIATE;
go
ALTER DATABASE DBASE SET ONLINE
go
ALTER DATABASE DBASE SET RESTRICTED_USER   
GO

(确保您的 SQL Server Management Studio 在查询窗口的下拉菜单中没有选择数据库 DBASE。)

之后,您可以开始使用恢复数据库。

USE MASTER
GO
RESTORE DATABASE DBASE 
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\Restore\DBASE.BAK'
WITH 
MOVE 'DBASE' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\DATA\DBASE.MDF',
MOVE 'DBASE_LOG' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.DBASE\MSSQL\DATA\DBASE_1.LDF', 
REPLACE, 
RECOVERY,
STATS = 10
GO

如果您不将备份恢复到新位置,则可以省略 MOVE 命令,因为它们仅在恢复到新位置时才需要。

这应该会使您的数据库恢复在线。

顺便说一句,除非您在发生事件时磁盘空间不足,否则拥有多个事务日志文件并没有多大好处。事务日志文件是连续写入的,从不并行写入。暂时拥有多个事务日志文件的唯一原因是:

响应完整事务日志的替代方案包括

  • 在不同的磁盘上添加日志文件。

...可以在这里找到:解决事务日志已满的问题(SQL Server 错误 9002)

祝您恢复顺利。

相关内容