代码之家  ›  专栏  ›  技术社区  ›  Dr. Rajesh Rolen

如何从截断表中恢复数据

  •  7
  • Dr. Rajesh Rolen  · 技术社区  · 15 年前

    在浏览Shiv Prashad Koirala先生的书中的SQL Server采访问题时。我知道,即使使用truncate table命令,数据也可以恢复。

    请告诉我使用“delete”命令删除数据时如何恢复数据,以及使用“truncate”命令删除数据时如何恢复数据。

    我所知道的是,当我们使用delete命令删除记录时,它的条目是在日志文件中创建的,但是我不知道如何从中恢复数据,并且当我读取到截断表时,它不会在数据库中输入任何日志条目,那么如何恢复它呢?

    如果你能给我任何一个很好的链接,让我一步一步地去做,那将对我有很大的帮助。

    我有SQL Server 2008。

    谢谢

    4 回复  |  直到 7 年前
        1
  •  5
  •   Jagmag    15 年前

    如果在代码中使用事务,则可以回滚截断。如果没有使用事务,并且提交了截断操作,则无法从日志文件中检索该操作。truncate是DDL操作,它没有记录在日志文件中。

    如果当前会话未关闭,则当事务包围时,删除和截断都可以回滚。如果truncate是在被事务包围的查询编辑器中写入的,并且会话关闭,则不能回滚它,但可以回滚删除操作。

    USE tempdb
    GO
    -- Create Test Table
    CREATE TABLE TruncateTest (ID INT)
    INSERT INTO TruncateTest (ID)
    SELECT 1
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
    GO
    -- Check the data before truncate
    SELECT * FROM TruncateTest
    GO
    -- Begin Transaction
    BEGIN TRAN
    -- Truncate Table
    TRUNCATE TABLE TruncateTest
    GO
    -- Check the data after truncate
    SELECT * FROM TruncateTest
    GO
    -- Rollback Transaction
    ROLLBACK TRAN
    GO
    -- Check the data after Rollback
    SELECT * FROM TruncateTest
    GO
    -- Clean up
    DROP TABLE TruncateTest
    GO
    
        2
  •  5
  •   Nath_Math    13 年前

    默认情况下,这两个都不能恢复,但在可能的情况下有特殊情况。

    截断 :执行truncate时,SQL Server不会删除数据,但只释放页面。这意味着,如果您仍然可以阅读这些页面(使用查询或第三方工具),就有可能恢复数据。但是,在覆盖这些页面之前,您需要快速采取行动。

    删除 :如果数据库处于完全恢复模式,则所有事务都记录在事务日志中。如果您可以读取事务日志,那么从理论上讲,您可以找出所有受影响行的先前值,然后恢复数据。

    回收方法:

        3
  •  4
  •   user1059637    14 年前

    SQL Server保留被截断的记录和这些记录的条目(页面文件),您可以从下面的查询轻松浏览。 一旦获得了页ID和文件ID,就可以将其放入DBCC页以检索完整的记录。

    SELECT LTRIM(RTRIM(Replace([Description],'Deallocated',''))) AS [PAGE ID]
    ,[Slot ID],[AllocUnitId]
    FROM    sys.fn_dblog(NULL, NULL)  
    WHERE    
    AllocUnitId IN 
    (Select [Allocation_unit_id] from sys.allocation_units allocunits
    INNER JOIN sys.partitions partitions ON (allocunits.type IN (1, 3)  
    AND partitions.hobt_id = allocunits.container_id) OR (allocunits.type = 2 
    AND partitions.partition_id = allocunits.container_id)  
    Where object_id=object_ID('' + 'dbo.Student' + ''))
    AND Operation IN ('LOP_MODIFY_ROW') AND [Context] IN ('LCX_PFS') 
    AND Description Like '%Deallocated%'
    

    下面给出了文章的链接,解释了如何从SQL Server恢复截断的记录。 http://raresql.com/2012/04/08/how-to-recover-truncated-data-from-sql-server-without-backup/

        4
  •  0
  •   Abhay Prince    7 年前

    如果数据库处于完全恢复模式,则可以通过截断、删除或删除来恢复数据。 这里是完整的逐步文章 https://codingfry.blogspot.com/2018/09/how-to-recover-data-from-truncated.html

    推荐文章