取消删除最近删除的行sql server

时间:2012-12-09 08:58:34

标签: sql sql-server

我错误地删除了某些行b,我可以使用日志或SSMS恢复它们吗

2 个答案:

答案 0 :(得分:11)

SQL Server会为每个已删除的记录保留日志。您可以通过fn_dblog sql server函数查询这些日志。

Select [RowLog Contents 0]
FROM   sys.fn_dblog(NULL, NULL)
WHERE  AllocUnitName = 'dbo.TableName'
       AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )
       AND Operation in ( 'LOP_DELETE_ROWS' )  

但是这个日志是十六进制格式。并且您需要将此Hex格式转换为实际数据。

以下是本文将帮助您以上面定义的相同方式恢复已删除的记录。

http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/

答案 1 :(得分:10)

如果您的数据库处于简单恢复模式,那么您可能会运气不好。您可以还原到最新的备份,但如果它很久以前它可能不包含您删除并希望重新插入的行的副本。在此期间也很可能插入了其他数据。您可以恢复到新数据库,然后执行SQL手术以恢复消失的数据。

如果您的数据库处于完全恢复模式,则:

  1. 查找上次完整备份,此后的所有增量备份以及自上次增量备份或完整备份以来的所有日志备份文件,并将其还原到正确的时间点。如果可以接受,您可以覆盖数据库,或者可以恢复到新数据库并执行SQL手术。

  2. 恢复过程将如下所示:

    BACKUP DATABASE YourDB TO DISK = 'D:\MSSQL\Data\YourDB\YourDB Pre-Repair.bak'
    -- It is CRUCIAL you take a new backup before doing ANYTHING so you don't
    -- make another mistake you can't reverse.
    
    RESTORE DATABASE YourDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121208 110000.bak' WITH REPLACE, NORECOVERY;
    -- be very careful with REPLACE as needing it proves there is un-backed-up data
    RESTORE LOG YourDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121208 111500.log' WITH NORECOVERY;
    RESTORE LOG YourDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121208 113000.log' WITH NORECOVERY;
    -- restore more log files, all of them, in order, with none skipped
    RESTORE LOG YourDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121209 020000.log'
       WITH STOPAT = '20121209 01:57:00', RECOVERY;
    

    请注意,我在此处使用了WITH STOPAT,这使您可以将数据库还原到特定时间点。在我的示例中,日志备份每15分钟进行一次,致命查询在2012-12-09上午1:57:15发布。

  3. 如果要将数据库还原到新数据库,则必须执行以下操作:

    RESTORE DATABASE NewDB FROM DISK
       = 'D:\MSSQL\Data\YourDB\YourDB 20121208 110000.bak'
    WITH
       MOVE 'YourDBLogicalName' TO 'D:\MSSQL\Data\NewDB.mdf',
       MOVE 'YourDBLogicalName_Log' TO 'L:\MSSQL\Logs\NewDB.ldf';
    

    使用RESTORE FILELISTONLY找出备份中的内容。如果同一文件中有多个备份,则会有更多语法来读取该信息,然后指定您要使用哪个。使用sp_helpdb 'YourDB'找出放置NewDB数据库和日志文件的位置。

    然后还有更多的脚本来重命名逻辑文件,如果你愿意的话(我总是这样做)。

    当然,愚蠢的我,我现在才意识到你可以使用SSMS GUI完成大部分工作。但是如果你想开始理解所有这些东西并且变得非常擅长,我建议编写脚本。我是开发人员,但可以恢复数据库lickety-split而无需请求“官方”DBA的帮助。