sql server 删除数据错误能还原吗

 我来答
哎呀……18a91a6
2016-11-24 · TA获得超过4.2万个赞
知道大有可为答主
回答量:7246
采纳率:76%
帮助的人:3055万
展开全部

一、在LOG文件完整的情况下,可以还原。但一般而言,是将数据库的整个的状态还原到误删除数据之前。建议备份当前数据库。


二、给出SQL 2008下的具体做法,别的版本的SQL Server可参照操作。

最常用的就是日志尾部备份恢复法。以下环境2008R2,对于2008及其以上版本可以使用这个方法,其实2005也可以,2000很少用,没测试过。(SQL2008之前可以使用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)、确保别人不再连接数据库,然后做一次日志尾部备份:

首先先创建一点数据:

/*
这里使用微软的示例数据库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:20分删除数据的,只要把时间点指定到你误删除的时间之前即可)由于日志尾部备份都是最后一个备份文件,所以这里选则红框部分即可:


点确定,完成后再检查一下表,可以看到,数据已经还原成功。


 **************************************************************************

总结:

1、方法看上去有点繁琐,但是实际操作并不太难。

2、再次强调,先备份现场环境,无论故障影响有多严重,保全好当时情况。如果并不是重要生产数据,当别论。

3、步骤建议严格按照上面提示,对重要数据库实际操作前建议先在测试数据库中演练并理解后再正式操作。


额外提醒,此方法的缺点:

1、如果误操作以后还有很多人做了操作,还原后,连着别人的操作数据都会冲掉,所以发生误操作后,应考虑停止它人对数据库的操作。。

2、此方法要对数据库独占,操作过程中,它人无法使用与联接数据库。

greystar_cn
2016-10-27 · 知道合伙人软件行家
greystar_cn
知道合伙人软件行家
采纳数:16407 获赞数:17260
本人主要从事.NET C#方向的技术开发工作,具有10多年的各类架构开发工作经验。

向TA提问 私信TA
展开全部
SqlServer2000非正常删除(误删)LOG数据文件后数据库紧急修复方法,本文已一个实际例子来展示恢复过程,下文中涂改的部分均为内部内容,涂改的数据库名均表示为returndate,各位在实际恢复时则使用现场实际数据库表命名即可。
http://jingyan.baidu.com/article/454316abb2cc59f7a7c03a03.html
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2020-06-25
展开全部

sql 表被drop,truncate 或者delete只要没有覆盖,均是可以恢复的,你可以参考:

sql drop table 恢复

sql delete 数据恢复

sql truncate table 恢复

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
s1093792990
2017-04-14 · 超过78用户采纳过TA的回答
知道小有建树答主
回答量:249
采纳率:100%
帮助的人:59万
展开全部
SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可。但是,这个恢复需要有两个前提条件:
1. 至少有一个误删除之前的数据库完全备份。
2. 数据库的恢复模式(Recovery mode)是“完整(Full)”。
针对这两个前提条件,会有三种情况:
情况一、如果这两个前提条件都存在,通过SQL语句只需三步就能恢复(参考文章),无需借助第三方工具。
a) 备份当前数据库的事务日志:BACKUP LOG [数据库名] TO disk= N'备份文件名' WITH NORECOVERY
b) 恢复一个误删除之前的完全备份:RESTORE DATABASE [数据库名] FROM DISK = N'完全备份文件名' WITH NORECOVERY, REPLACE
c) 将数据库恢复至误删除之前的时间点:RESTORE LOG [数据库] FROM DISK = N'第一步的日志备份文件名' WITH STOPAT = N'误删除之前的时间点' , RECOVERY
情况二、如果第1个前提条件不存在,第2个前提条件存在,需要借助第三方工具。
情况三、如果第2个前提条件不存在,无法恢复。所以,一定要将数据库恢复模式设置为“完整(Full)”
注:只有使用delete删除的数据才支持还原
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式