【问题标题】:How to recover data from truncated table如何从截断的表中恢复数据
【发布时间】:2010-11-16 10:55:57
【问题描述】:

在阅读先生的书中的 sql server 面试问题时。希夫·普拉沙德·柯伊拉腊。我知道了,即使使用 truncate table 命令,数据也可以恢复。

请告诉我当使用“删除”命令删除数据时如何恢复数据,如果使用“截断”命令删除数据如何恢复数据。

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

如果你能给我任何好的链接来一步一步地做到这一点,那将对我有很大的帮助。

我有 sql server 2008。

谢谢

【问题讨论】:

    标签: sql-server sql-server-2008 truncate


    【解决方案1】:

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

    如果当前会话未关闭,则当被 TRANSACTION 包围时,DELETE 和 TRUNCATE 都可以回滚。如果 TRUNCATE 写在 TRANSACTION 包围的查询编辑器中,如果 session 关闭,则不能回滚,但 DELETE 可以回滚。

    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
    

    【讨论】:

    • TRUNCATE 被记录下来,并且可以通过从数据库或日志备份中恢复来“回滚”,就像 DELETE 一样。
    • 如果您的数据库处于完全恢复模式,您可以通过截断、删除或删除来恢复数据完整的分步文章在这里code.abhayprince.com/article/…
    • @nvogel, is this article 这样的恢复示例,还是您有其他想法?
    • 如果可以从数据库或日志备份中恢复截断的数据,那么为什么这是一个公认的答案? - 此答案为:“如果没有使用事务并且提交了 TRUNCATE 操作,则无法从日志文件中检索。”
    【解决方案2】:

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

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

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

    恢复方法:

    【讨论】:

      【解决方案3】:

      SQL 服务器保留被截断的记录和那些记录的条目(页号和文件号),您可以从下面的查询中轻松浏览。 获取页面 ID 和文件 ID 后,可以将其放入 DBCC PAGE 以检索完整记录。

      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 服务器恢复被截断的记录。 http://raresql.com/2012/04/08/how-to-recover-truncated-data-from-sql-server-without-backup/

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-21
          • 2019-02-19
          • 1970-01-01
          • 2011-08-27
          • 2017-06-11
          • 2014-04-29
          • 1970-01-01
          相关资源
          最近更新 更多