我已经将数据库以 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)
祝您恢复顺利。