You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从SQL Server中恢复误删除的数据库表数据?

别慌!误删SQL Server表中的数据并不是完全没救,具体的恢复方法得看你的数据库配置和操作场景,我给你梳理几种最实用的方案,按优先级来:

1. 有完整备份+事务日志备份(最稳妥的方案)

如果平时有做完整备份和定期的事务日志备份,那这是最可靠的恢复方式,步骤大概是这样:

  • 先把完整备份恢复到一个临时数据库(别直接覆盖原库!),恢复时用NORECOVERY参数,让数据库处于可恢复日志的状态:
RESTORE DATABASE YourTempDB
FROM DISK = 'C:\Backup\YourFullBackup.bak'
WITH NORECOVERY, REPLACE;
  • 接着恢复最近的事务日志备份,指定STOPAT参数到删除数据之前的时间点,这样就能把数据恢复到误删前的状态:
RESTORE LOG YourTempDB
FROM DISK = 'C:\Backup\YourLogBackup.trn'
WITH RECOVERY, STOPAT = '2024-05-20 14:30:00'; -- 替换成你误删前的准确时间
  • 最后从临时库把误删的数据查询出来,用INSERT INTO导回原表就好。
2. 数据库处于完整/大容量日志恢复模式(且未截断日志)

如果你的数据库用的是完整或大容量日志恢复模式,而且误删后没做过日志截断(比如没备份日志、没收缩日志),那可以通过读取事务日志来找回删除的数据:

  • 先查询事务日志,找到删除操作相关的记录,用系统函数fn_dblog
SELECT 
    [Transaction ID],
    [Begin Time],
    [End Time],
    [Operation],
    [Context],
    [AllocUnitName]
FROM fn_dblog(NULL, NULL)
WHERE Operation = 'LOP_DELETE_ROWS' 
AND AllocUnitName = 'dbo.YourTableName'; -- 替换成你的表名
  • 找到对应的事务ID后,再用fn_dblog提取被删除的行数据,或者用脚本生成反向的INSERT语句(核心是解析日志里的原始数据)。
  • 注意:这种方法对TRUNCATE TABLE无效,因为TRUNCATE不记录行级日志。
3. 刚执行DELETE还没提交事务(紧急救命招)

如果删完数据后,你还没关闭查询窗口,也没执行COMMIT,那直接敲ROLLBACK;就能撤销删除!

  • 不确定有没有提交的话,可以查一下当前会话的未提交事务:
SELECT * FROM sys.dm_tran_session_transactions WHERE session_id = @@SPID;

如果能看到未提交的事务,赶紧ROLLBACK!

4. 误执行了TRUNCATE TABLE(麻烦但仍有机会)

TRUNCATE是批量删除,不记录行级日志,所以上面的日志方法基本没用。但也不是完全没辙:

  • 如果有备份,还是回到方案1,用备份恢复到临时库再导数据。
  • 如果没有备份,但数据库还没重启过,可以尝试用第三方数据恢复工具(专门针对SQL Server的恢复软件),不过这种情况风险较高,操作前最好先把数据库脱机,或者做一个磁盘镜像,避免数据被覆盖。
重要提醒
  • 不管用哪种方法,先给当前数据库做一个完整备份!别让误操作雪上加霜。
  • 生产环境下,一定要先在测试库或临时库验证恢复结果,确认没问题再同步到原库。
  • 平时一定要做好定期的完整备份和事务日志备份,这才是防止数据丢失的根本。

内容的提问来源于stack exchange,提问作者Kaushik Nandwana

火山引擎 最新活动