`

SQLServer 2008以上误操作数据库恢复方法——日志尾部备份

 
阅读更多

问题:

         经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了。人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题。

        遇到这种情况,一般都是没有做备份,不然也不会来发问了。首先要冷静,否则会有更大的灾难。直到你放弃。

 

 

解决方法:

 

       对于这类问题,主要是找回误操作之前的数据,在2008之前,有个很出名的工具Log Exploer,听说还挺好用的,这个网上大把教程,这里就不多说了。但是唯一遗憾的是,不支持2008及更高版本,这时除了其他第三方工具,那么最常用的就是本文提到的方法——日志尾部备份。本文实验环境2008R2,对于2008及其以上版本可以使用这个方法,其实2005也可以,2000很少用,没试过,只是2008之前可以使用Log Exploer,所以就没必要用这种方法。

      下面图文并茂讲解操作方法,至于原理,不属于本文范围,而且我相信真遇到误操作的时候,估计没人会看原理了。

步骤:

(1)、检查数据库的恢复模式,如图:

 

 

 

或者使用脚本检查:

[sql] view plain copy
 
 print?
  1. SELECT recovery_model,recovery_model_desc  
  2. FROM sys.databases  
  3. WHERE name ='AdventureWorks'  

 

结果如下:

 

 

        确保数据库的恢复模式最起码不能为【简单】。至于如何修改成完整模式,我觉得这些应该没必要多说了。

 

       切记,对于任何重要环境,不仅仅是客户正式环境(俗称生产环境),都强烈建议使用【完整恢复模式】,虽然对于另外两种(大容量日志(BULK_LOGGED)、简单(SIMPLE))来说,完整恢复模式产生的日志会大,但是在出现问题的时候,就会觉得这些都不算什么了。并且我也想不到任何理由对于正式环境不使用完整恢复模式。只要管理得当,完整恢复模式的日志也不会太变态。

 

(2)、这里其实隐含另外一步,曾经做过最少一次的完整备份。因为所有类型的备份都基于完整备份,如果没有最少一次完整备份,其他类型的备份都是多余的,所以在这里强调一下,在创建完一个新数据库之后,强烈建议甚至强制做一次完整备份。

 

[sql] view plain copy
 
 print?
  1. SELECT  database_name,recovery_model,name   
  2. FROM msdb.dbo.backupset  

 

 

使用上面的语句粗略可以看到有那些数据库做过备份,由于测试,所以做了几次备份,可以看到我这个时间点已经做了备份了。

 

 

(3)、确保别人不再连接数据库,然后做一次日志尾部备份:

首先先创建一点数据:

[sql] view plain copy
 
 print?
  1. /*  
  2. 由于tempdb永远为简单恢复模式,所以不适合做案例。  
  3. 这里使用微软的示例数据库AdventureWorks  
  4. */  
  5. USE AdventureWorks  
  6. GO  
  7. IF OBJECT_ID('testRestore'IS NOT NULL   
  8.     DROP TABLE testRestore  
  9. GO  
  10. CREATE TABLE testRestore  
  11.     (  
  12.       id INT IDENTITY(1, 1) ,  
  13.       NAME VARCHAR(50)  
  14.     );  
  15. --插入测试数据:     
  16. INSERT INTO testRestore(Name)  
  17. SELECT 'test1'  
  18. UNION ALL   
  19. SELECT 'test2'  
  20. UNION ALL   
  21. SELECT 'test3'  
  22. UNION ALL   
  23. SELECT 'test4'  
  24. UNION ALL   
  25. SELECT 'test5'  
  26. UNION ALL   
  27. SELECT 'test6'  
  28. UNION ALL   
  29. SELECT 'test7'  
  30. UNION ALL   
  31. SELECT 'test8'  
  32. SELECT * FROM testRestore  

检查一下结果:



 

然后来做个删除操作,为了定位是啥时候发生的,我加了一个waitfor命令,让它在某个时间发生,这样恢复的时候就有准确性:

[sql] view plain copy
 
 print?
  1. USE AdventureWorks  
  2. GO  
  3. WAITFOR TIME '21:45'  
  4. DELETE FROM dbo.testRestore  

 

现在来看看数据:

[sql] view plain copy
 
 print?
  1. USE AdventureWorks  
  2. GO  
  3. SELECT * FROM dbo.testRestore  


 

 

到这一步,灾难出现了。但是切记要冷静

下面就是本文的重点开始,做一次日志备份,最重要是选择【备份日志尾部】

 

 

然后在【选项】页选择:除【事务日志】除,其他红框包裹的地方为强烈建议勾选的地方。并且保证数据库不要有别人在连接,因为备份日志尾部会使数据库处于还原状态,拒绝其他会话的连接,如果不断开其他连接,是备份不了的。

 

 

 

然后按确定,当然,可以使用上方的【脚本】来生成语句:

 

 

[sql] view plain copy
 
 print?
  1. USE Master  
  2. GO  
  3. BACKUP LOG [AdventureWorks] TO  DISK = N'E:\AdventureWorks.bak' WITH  NO_TRUNCATE , NOFORMAT, NOINIT,  NAME = N'AdventureWorks-事务日志 备份', SKIP, NOREWIND, NOUNLOAD,  NORECOVERY , COMPRESSION,  STATS = 10, CHECKSUM  
  4. GO  
  5. declare @backupSetId as int  
  6. select @backupSetId = position from msdb..backupset where database_name=N'AdventureWorks' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'AdventureWorks' )  
  7. if @backupSetId is null begin raiserror(N'验证失败。找不到数据库“AdventureWorks”的备份信息。', 16, 1) end  
  8. RESTORE VERIFYONLY FROM  DISK = N'E:\AdventureWorks.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND  
  9. GO  

 

 

此时,数据库会处于【正在还原】的状态

 

 

 

如果发现备份不了可以用下面语句查看,并把spid杀掉:

 

[sql] view plain copy
 
 print?
  1. SELECT  * FROM sys.sysprocesses WHERE dbid=DB_ID('AdventureWorks')  

 

执行结果:

 

 

然后kill掉。

接着继续备份。

 

然后进行还原,如图:

先要还原完整备份,选择最近的那次,由于日志备份的特性(以后其他文章再说),只认最后一次备份,所以要选择最新的那次,否则还原不了。

 

 

 

这里又有一个注意事项,记得选择:

 

 

 

 

接着还原日志文件,这是最最重要的一步:

 

 

 

然后:


 

 

由于实验的时候出了点问题,后面重做了,所以时间选择到22:19分,我是在22:20分删除数据的。这里不用太在意,只要把时间点指定到你误删除的时间之前即可。而由于日志尾部备份都是最后一个备份文件,所以这里选则红框部分即可:

 

 

 

现在再检查一下:

 

 

 

可以看到,数据已经还原成功。

 

总结:

平时不做备份,出问题来喊急,这是苟有自取,还有一些脑袋发热的人喜欢看到ldf很大就直接删除,那以后出问题就别怪微软了。

本文中的方法看上去有点繁琐,但是实操几次就觉得好了,但是步骤建议严格按照上面说的,因为一旦操作错误,就很麻烦,此时再次强调——冷静冷静再冷静!!!!!!

这种方法有几个缺点:

1、             如果你发现误操作以后还有很多人做了操作,那么你还原成功后,别人的操作就会冲掉,所以发生误操作后,要马上停止别人对数据库的操作。

2、             这个方法要对数据库独占,所以你想偷偷恢复是不行的了。勇敢承认错误吧。

对于核心数据表,还是要先做好预防操作,可以看:SQLServer恢复表级数据

 

分享到:
评论

相关推荐

    SQL Server 2008 R2 主从数据库同步

    SQL Server 2008 R2 主从数据库同步是高可用性技术之一,通过配置数据库属性和事务日志传送,实现主从数据库之间的数据同步。本文将详细介绍 SQL Server 2008 R2 主从数据库同步的配置步骤和实现原理。 基本原理 ...

    SQL Server数据库备份与恢复(C#代码示例)

    C#结合SQL Server的API,如SqlClient和Smo,可以方便地进行数据库的备份和恢复操作。 首先,让我们了解SQL Server数据库备份的基本概念。数据库备份是为了防止数据丢失,它将数据库的当前状态保存到一个或多个文件...

    SQL Server 2008及更高版本数据库恢复方法之日志尾部备份

    在SQL Server 2008及更高版本中,日志尾部备份(Tail-Log Backup)是一种紧急恢复策略,它允许在发生数据破坏后,通过备份事务日志的末尾部分,配合完整备份来恢复数据。 首先,了解恢复模式的概念非常重要。SQL ...

    SQL_Server_2008删除或压缩数据库日志的方法.doc

    标题与描述均指向了一个具体的技术问题的解决方法——在SQL Server 2008中如何删除或压缩数据库日志。这一需求通常出现在日志文件占用过多磁盘空间,或者备份过程耗时过长,影响正常业务操作的情况下。下面将详细...

    SQL Server 2008 数据库误删除数据的恢复

    SQL Server 2008 数据库误删除数据的恢复 在 SQL Server 2008 数据库中,误删除数据的恢复是一个非常重要且紧急的问题。今天,我们将讨论如何从 SQL Server 2008 数据库中恢复误删除的数据。 首先,我们需要了解 ...

    数据库应用技术——SQL Server 2008篇(第3版)

    7. **备份与恢复策略**:介绍SQL Server 2008的备份选项,包括完整备份、差异备份、日志备份,以及如何制定恢复策略以应对数据丢失或系统故障。 8. **集成服务与Reporting Services**:讲解SQL Server的ETL工具——...

    如何强制删除或恢复SQLServer正在使用的数据库

    通常情况睛,SQLServer... 您可能感兴趣的文章:sqlserver只有MDF文件恢复数据库的方法sqlserver 数据库日志备份和恢复步骤asp 在线备份与恢复sqlserver数据库的代码SQLserver 数据库危险存储过程删除与恢复方法SQL Serv

    sql server 2008数据库备份和恢复

    全面讲述了Sql Server 2008数据库的备份与恢复

    sqlServer 2005-2008数据日志恢复工具

    SQL Server 2005-2008 数据日志恢复工具是一款专为解决SQL Server数据库日志问题而设计的应用程序。它旨在帮助用户管理和恢复SQL Server的日志文件,包括操作日志、主日志和临时日志。这些日志在数据库的正常运行和...

    SQLServer2008R2主从数据库同步

    为了支持数据库备份和恢复操作,需要在主从服务器上配置共享文件夹: - 创建共享文件夹 `DB_Backup`。 - 配置共享权限和 NTFS 权限。 - 使用 SQL Server 配置管理器将 SQL Server 服务和 SQL Server 代理服务的登录...

    SQLServer数据库的备份和还原详解

    ### SQL Server 数据库的备份与还原详解 #### 一、基本概念 在开始讨论SQL Server数据库的备份与还原之前,我们需要了解几个基本的概念。 - **MDF 文件**: 这是SQL Server数据库的主要数据文件,存储了数据库的...

    sqlserver 2000数据库备份+恢复+创建

    在SQL Server 2000中,数据库的备份与恢复是数据库管理的...以上就是关于SQL Server 2000数据库备份、恢复及创建的关键知识点。通过理解并应用这些概念,可以有效地管理和保护您的数据库,确保业务连续性和数据安全性。

    Sqlserver2005数据库还原备份工具

    SQL Server支持多种类型的备份,包括完整备份、差异备份、日志备份和文件或文件组备份。这些备份类型各有其应用场景,比如完整备份保存所有数据,而差异备份只记录自上次完整备份以来的变化,日志备份则用于事务日志...

    将Sql Server 2000中的数据库备份文件还原到sql2005中

    将Sql Server 2000中的数据库备份文件还原到sql2005中 ...将Sql Server 2000中的数据库备份文件还原到Sql Server 2005中需要了解Sql Server 2000和Sql Server 2005之间的差异,并正确地进行还原操作。

    SQLServer2008R2数据库备份与还原操作文档.pdf

    SQLServer2008R2数据库备份与还原操作文档.pdf

    Delphi SQL Server数据库备份程序_delphi_SQL_ServerDelphi_sqlserver_

    SQL Server是微软提供的一个企业级关系型数据库管理系统,支持各种数据库操作,包括数据存储、查询、备份和恢复等。在SQL Server中,备份操作通常通过T-SQL(Transact-SQL)语句或者SQL Server Management Studio...

    SQLSERVER数据库恢复与备份

    总结来说,SQL Server的数据库恢复与备份是一个全面的体系,包括选择合适的恢复模型、制定备份计划、执行日志备份以实现高可用性,以及在必要时进行数据恢复。理解并熟练掌握这些知识,对于任何SQL Server数据库管理...

    基于SQL Server的数据库恢复技术.pdf

    本文将从SQL Server的数据库恢复技术入手,详细解释数据库恢复的重要性、数据库恢复技术的分类、SQL Server数据库恢复技术的实现方法、数据库恢复的常见问题和解决方法等方面,对于SQL Server数据库管理员和开发人员...

    数据库应用技术——SQL Server 2000简明教程电子教案

    "数据库应用技术——SQL Server 2000简明教程电子教案"将带领学习者深入了解如何使用SQL Server 2000进行数据库管理,从基础概念到高级应用,覆盖了数据库设计、数据操作、安全管理、性能优化等多个方面,是学习和...

    sqlserver实现带进度条的数据库备份.docx

    SQL Server实现带进度条的数据库备份 SQL Server是一种关系型数据库管理系统,提供了各种功能来管理和维护数据库。其中,数据库备份是非常重要的一项任务,为了确保数据的安全和可靠性。然而,传统的数据库备份方式...

Global site tag (gtag.js) - Google Analytics