细节

细节

数据库灾难只会发生在其他人,对吧?对吧?!?

我敢肯定,自计算机诞生以来,这种事从未发生过,但信不信由你,我在数据库还原时遇到了问题。也许你能帮忙。我希望这是一件非常简单的事情。

问题:如何恢复两天前做的备份?

GUI 似乎不起作用,我找不到正确的 TSQL 来手动执行此操作。

细节

我于 2009 年 11 月 9 日星期一上午 9:30 左右使用 SQL Server Management Studio 对 SQL Server 2005 数据库进行了备份,其选项如下:

恢复模型:简单
备份类型:完整
备份组件:数据库
过期时间:0 天
目标:磁盘

我想恢复此备份但遇到了一些问题。

尝试 #1:使用 GUI

在“恢复数据库”对话框中使用了以下选项:

到数据库:[MyDatabaseName] 到某个时间点:'11/9/2009 12:00:00 AM 0 毫秒 从数据库:[MyDatabaseName] 覆盖现有数据库:true。恢复状态:通过回滚使数据库保持可用状态...

错误消息:无法获取独占访问权限,因为数据库正在使用中。我尝试设置为 single_user、重新启动 SQL Server 服务等。始终无法弄清楚如何在“恢复数据库”GUI 中终止现有连接。

尝试 #2:使用 TSQL

更改数据库 [MyDatabaseName] 设置 SINGLE_USER 并立即回滚

更改数据库 [我的数据库名称] 设置恢复完全

从磁盘 = N'F:\DatabaseLocation\BackupName.bak' 恢复数据库 [MyDatabaseName],其中文件 = 1、NOUNLOAD、RECOVERY、REPLACE、STATS = 10、STOPAT = '2009 年 11 月 9 日'

消息:此备份集包含在指定时间点之前记录的记录。数据库处于恢复状态,以便可以执行更多前滚。

我尝试了上述不同版本,包括 REPLACE、NORECOVERY、RECOVERY 等。我需要知道备份时间的精确到毫秒吗?如果需要,我该如何找到它?

答案1

您无法将 SIMPLE 恢复数据库恢复到某个时间点。只有 FULL 或 BULK 恢复模式数据库才可以恢复到某个时间点。

恢复到特定时间点了解具体语法(该选项是在 RESTORE LOG 时指定的,而不是在 RESTORE DATABASE 时指定的)。另请参阅将数据库还原到备份中的某个时间点了解有关 STOP AT 用法的更多一般要点。

答案2

听起来你已经修复了它,但是我在 StackOverflow 上输入我的答案时发现问题已被关闭并移到这里,所以如果您需要的话,这是我在 T_SQL 中的正常数据库恢复命令序列

您需要使用

从磁盘恢复文件列表 = 'X:\path\MyBackupFilename.BAK'

获取逻辑设备的名称(如果恢复到与备份相同的数据库,则名称将保持不变,否则可能会有所不同)

使用 master —(数据库恢复时不能坐在数据库里!)

-- 修改数据库 MyDatabase 设置 SINGLE_USER 并立即回滚
更改数据库 MyDatabase 设置离线并立即回滚

恢复数据库 MyDatabase
    来自磁盘 = 'X:\path\MyBackupFilename.BAK'
        代替,
        NORECOVERY,--允许恢复更多DIFF/TLogs
        STATS = 10, -- 显示进度(每 10%)
    将“MyLogicalName_data”移动到“X:\MSSQL\path\MyDatabaseFile.mdf”,
    将“MyLogicalName_log”移动到“X:\MSSQL\path\MyDatabaseFile.ldf”

-- 如果需要恢复以后的 DIFF 备份(在此 FULL 备份之后制作):

恢复数据库 MyDatabase
    来自磁盘 = 'X:\path\MyDatabaseBackup_yyyymmdd_hhmm_Diff.BAK'
        STATS = 10, -- 显示进度(每 10%)
        NORECOVERY——允许恢复更多TLog


-- 可选恢复附加事务日志
-- 按顺序对每个事务日志重复以下步骤

恢复我的数据库日志
    来自磁盘 = 'X:\path\MyDatabaseBackup_yyyymmdd_hhmm_Trans.BAK'
        NORECOVERY——Allo 恢复更多 TLog

-- 恢复完所有备份文件后,“激活”数据库
使用恢复功能恢复数据库 MyDatabase

-- **如果** 数据库使用不同的逻辑名称,则“重命名”它们
更改数据库 MyDatabase 修改文件
(名称 = 'LogicalNameFromBackup_data',新名称 = 'NewLogicalName_data')
更改数据库 MyDatabase 修改文件
(名称 = 'LogicalNameFromBackup_log',新名称 = 'NewLogicalName_log')

-- 如果在数据库处于单一/受限用户状态时进行了备份
-- 将访问权改回“正常”
-- 修改数据库 MyDatabase 设置 MULTI_USER,READ_WRITE 并立即回滚

如果数据库已恢复到不同的服务器上,则还需要重新同步数据库用户和服务器登录。

答案3

您可以从 GUI 轻松终止现有连接。只需转到管理 -> 活动监视器。按数据库排序,右键单击并终止您希望恢复的数据库中的连接。

[编辑]

当然,这一切都假设您的帐户未使用与默认数据库相同的数据库!如果是这样,您需要先更改它并重新连接。

答案4

您正在从哪个数据库运行还原?确保它来自您正在还原的数据库之外的数据库,并且您在 Sql Management Studio 中没有任何活动查询。

相关内容