问题:
经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了。人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题。
遇到这种情况,一般都是没有做备份,不然也不会来发问了。首先要冷静,否则会有更大的灾难。直到你放弃。
解决方法:
对于这类问题,主要是找回误操作之前的数据,在2008之前,有个很出名的工具Log Exploer,听说还挺好用的,这个网上大把教程,这里就不多说了。但是唯一遗憾的是,不支持2008及更高版本,这时除了其他第三方工具,那么最常用的就是本文提到的方法——日志尾部备份。本文实验环境2008R2,对于2008及其以上版本可以使用这个方法,其实2005也可以,2000很少用,没试过,只是2008之前可以使用Log Exploer,所以就没必要用这种方法。
下面图文并茂讲解操作方法,至于原理,不属于本文范围,而且我相信真遇到误操作的时候,估计没人会看原理了。
步骤:
(1)、检查数据库的恢复模式,如图:
或者使用脚本检查:
- SELECT recovery_model,recovery_model_desc
- FROM sys.databases
- WHERE name ='AdventureWorks'
结果如下:
确保数据库的恢复模式最起码不能为【简单】。至于如何修改成完整模式,我觉得这些应该没必要多说了。
切记,对于任何重要环境,不仅仅是客户正式环境(俗称生产环境),都强烈建议使用【完整恢复模式】,虽然对于另外两种(大容量日志(BULK_LOGGED)、简单(SIMPLE))来说,完整恢复模式产生的日志会大,但是在出现问题的时候,就会觉得这些都不算什么了。并且我也想不到任何理由对于正式环境不使用完整恢复模式。只要管理得当,完整恢复模式的日志也不会太变态。
(2)、这里其实隐含另外一步,曾经做过最少一次的完整备份。因为所有类型的备份都基于完整备份,如果没有最少一次完整备份,其他类型的备份都是多余的,所以在这里强调一下,在创建完一个新数据库之后,强烈建议甚至强制做一次完整备份。
- SELECT database_name,recovery_model,name
- FROM msdb.dbo.backupset
使用上面的语句粗略可以看到有那些数据库做过备份,由于测试,所以做了几次备份,可以看到我这个时间点已经做了备份了。
(3)、确保别人不再连接数据库,然后做一次日志尾部备份:
首先先创建一点数据:
- /*
- 由于tempdb永远为简单恢复模式,所以不适合做案例。
- 这里使用微软的示例数据库AdventureWorks
- */
- USE AdventureWorks
- GO
- IF OBJECT_ID('testRestore') IS NOT NULL
- DROP TABLE testRestore
- GO
- CREATE TABLE testRestore
- (
- id INT IDENTITY(1, 1) ,
- NAME VARCHAR(50)
- );
- --插入测试数据:
- INSERT INTO testRestore(Name)
- SELECT 'test1'
- UNION ALL
- SELECT 'test2'
- UNION ALL
- SELECT 'test3'
- UNION ALL
- SELECT 'test4'
- UNION ALL
- SELECT 'test5'
- UNION ALL
- SELECT 'test6'
- UNION ALL
- SELECT 'test7'
- UNION ALL
- SELECT 'test8'
- SELECT * FROM testRestore
检查一下结果:
然后来做个删除操作,为了定位是啥时候发生的,我加了一个waitfor命令,让它在某个时间发生,这样恢复的时候就有准确性:
- USE AdventureWorks
- GO
- WAITFOR TIME '21:45'
- DELETE FROM dbo.testRestore
现在来看看数据:
- USE AdventureWorks
- GO
- SELECT * FROM dbo.testRestore
到这一步,灾难出现了。但是切记要冷静。
下面就是本文的重点开始,做一次日志备份,最重要是选择【备份日志尾部】
然后在【选项】页选择:除【事务日志】除,其他红框包裹的地方为强烈建议勾选的地方。并且保证数据库不要有别人在连接,因为备份日志尾部会使数据库处于还原状态,拒绝其他会话的连接,如果不断开其他连接,是备份不了的。
然后按确定,当然,可以使用上方的【脚本】来生成语句:
- USE Master
- GO
- 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
- GO
- declare @backupSetId as int
- 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' )
- if @backupSetId is null begin raiserror(N'验证失败。找不到数据库“AdventureWorks”的备份信息。', 16, 1) end
- RESTORE VERIFYONLY FROM DISK = N'E:\AdventureWorks.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
- GO
此时,数据库会处于【正在还原】的状态
如果发现备份不了可以用下面语句查看,并把spid杀掉:
- 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 主从数据库同步的配置步骤和实现原理。 基本原理 ...
C#结合SQL Server的API,如SqlClient和Smo,可以方便地进行数据库的备份和恢复操作。 首先,让我们了解SQL Server数据库备份的基本概念。数据库备份是为了防止数据丢失,它将数据库的当前状态保存到一个或多个文件...
在SQL Server 2008及更高版本中,日志尾部备份(Tail-Log Backup)是一种紧急恢复策略,它允许在发生数据破坏后,通过备份事务日志的末尾部分,配合完整备份来恢复数据。 首先,了解恢复模式的概念非常重要。SQL ...
"sql server 2008数据库转sql server 2005数据库" ...以上四种方法都可以将 SQL Server 2008 数据库转换为 SQL Server 2005 数据库。每种方法都有其特点和缺陷,读者可以根据实际情况选择合适的方法。
标题与描述均指向了一个具体的技术问题的解决方法——在SQL Server 2008中如何删除或压缩数据库日志。这一需求通常出现在日志文件占用过多磁盘空间,或者备份过程耗时过长,影响正常业务操作的情况下。下面将详细...
SQL Server 2008 数据库误删除数据的恢复 在 SQL Server 2008 数据库中,误删除数据的恢复是一个非常重要且紧急的问题。今天,我们将讨论如何从 SQL Server 2008 数据库中恢复误删除的数据。 首先,我们需要了解 ...
7. **备份与恢复策略**:介绍SQL Server 2008的备份选项,包括完整备份、差异备份、日志备份,以及如何制定恢复策略以应对数据丢失或系统故障。 8. **集成服务与Reporting Services**:讲解SQL Server的ETL工具——...
通常情况睛,SQLServer... 您可能感兴趣的文章:sqlserver只有MDF文件恢复数据库的方法sqlserver 数据库日志备份和恢复步骤asp 在线备份与恢复sqlserver数据库的代码SQLserver 数据库危险存储过程删除与恢复方法SQL Serv
全面讲述了Sql Server 2008数据库的备份与恢复
SQL Server 2005-2008 数据日志恢复工具是一款专为解决SQL Server数据库日志问题而设计的应用程序。它旨在帮助用户管理和恢复SQL Server的日志文件,包括操作日志、主日志和临时日志。这些日志在数据库的正常运行和...
为了支持数据库备份和恢复操作,需要在主从服务器上配置共享文件夹: - 创建共享文件夹 `DB_Backup`。 - 配置共享权限和 NTFS 权限。 - 使用 SQL Server 配置管理器将 SQL Server 服务和 SQL Server 代理服务的登录...
### SQL Server 数据库的备份与还原详解 #### 一、基本概念 在开始讨论SQL Server数据库的备份与还原之前,我们需要了解几个基本的概念。 - **MDF 文件**: 这是SQL Server数据库的主要数据文件,存储了数据库的...
在SQL Server 2000中,数据库的备份与恢复是数据库管理的...以上就是关于SQL Server 2000数据库备份、恢复及创建的关键知识点。通过理解并应用这些概念,可以有效地管理和保护您的数据库,确保业务连续性和数据安全性。
根据提供的文件信息,我们可以分析并总结出以下与“C# SqlServer数据库备份 恢复”相关的知识点: ### 一、C#中的Windows Forms应用程序 本案例中的代码片段是基于Windows Forms的应用程序,用于实现数据库的备份和...
本文详细介绍了如何在 SQL Server 2008 中实现数据库的定时自动备份,包括创建存储过程、创建代理作业、检查备份日志及结果以及故障恢复等多个方面。通过这些步骤,可以有效地保护数据库数据的安全性,减少因意外...
SQLServer2008R2数据库备份与还原操作文档.pdf
数据库程序设计——SQL Server 2000数据库程序设计【学生用光盘(2)】.part1 ; 数据库程序设计——SQL Server 2000数据库程序设计【学生用光盘(2)】.part2 ; 数据库程序设计——SQL Server 2000数据库程序设计...
通过以上脚本及其详细解析,我们可以了解到在SQL Server 2008环境中如何安全地执行数据库收缩操作。关键步骤包括备份数据库、调整恢复模式以及收缩日志文件。同时,也强调了备份和合理选择恢复模式的重要性。希望...
SQL Server是微软提供的一个企业级关系型数据库管理系统,支持各种数据库操作,包括数据存储、查询、备份和恢复等。在SQL Server中,备份操作通常通过T-SQL(Transact-SQL)语句或者SQL Server Management Studio...
总结来说,SQL Server的数据库恢复与备份是一个全面的体系,包括选择合适的恢复模型、制定备份计划、执行日志备份以实现高可用性,以及在必要时进行数据恢复。理解并熟练掌握这些知识,对于任何SQL Server数据库管理...