如何从截断表中恢复数据

时间:2010-11-16 10:55:58

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

虽然在先生的书中通过sql server面试问题。 shiv prashad koirala。我知道,即使在使用truncate table命令后,数据也可以恢复。

请告诉我如何使用'delete'命令删除数据时如何恢复数据?如果使用'truncate'命令删除数据,如何恢复数据。

我所知道的是,当我们使用delete命令删除记录时,它的条目是在日志文件中生成但我不知道如何从中恢复数据并且因为我读到truncate table没有输入任何日志条目数据库然后如何恢复。

如果你能给我任何好的联系,几乎一步一步地做到这一点,那将对我有很大的帮助。

我有sql server 2008。

由于

4 个答案:

答案 0 :(得分:5)

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

如果当前会话未关闭,则在被TRANSACTION包围时,

DELETE和TRUNCATE都可以回滚。如果在TRANSACTION包围的查询编辑器中写入TRUNCATE,并且会话已关闭,则无法回滚,但可以回滚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

答案 1 :(得分:5)

默认情况下,这两个都不能恢复,但有可能出现这种情况。

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

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

恢复方法:

答案 2 :(得分:4)

SQL Server保留截断记录和那些记录的条目(Page#& file#),您可以从下面的查询中轻松浏览。 获得页面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/

答案 3 :(得分:0)

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