Как восстановить данные из усеченной таблицы - PullRequest
7 голосов
/ 16 ноября 2010

при прохождении через вопрос интервью сервера sql в книге г-на. Шив Прашад Койрала. я узнал, что даже после использования команды truncate table данные могут быть восстановлены.

скажите, пожалуйста, как мы можем восстановить данные, если данные были удалены с помощью команды "delete", и как можно восстановить данные, если данные были удалены с помощью команды "truncate".

Что я знаю, так это то, что когда мы используем команду удаления для удаления записей, запись делается в файле журнала, но я не знаю, как восстановить данные и, как я прочитал, эта усеченная таблица не входит ни в одну запись журнала базы данных, то, как это можно восстановить.

Если вы можете дать мне какую-нибудь хорошую ссылку, чтобы сделать это практически шаг за шагом, то это мне очень поможет.

У меня есть SQL Server 2008.

Спасибо

Ответы [ 4 ]

5 голосов
/ 06 июня 2013

По умолчанию ни один из этих двух не может быть возвращен, но в некоторых случаях это возможно.

Усечение : при выполнении усечения SQL Server не удаляет данные, а только освобождаетстраницы.Это означает, что если вы все еще можете читать эти страницы (используя запрос или сторонний инструмент), есть возможность восстановить данные.Однако вам нужно действовать быстро, прежде чем эти страницы будут перезаписаны.

Удалить : если база данных находится в режиме полного восстановления, все транзакции регистрируются в журнале транзакций.Если вы можете прочитать журнал транзакций, вы можете теоретически выяснить, какие были предыдущие значения всех затронутых строк, а затем восстановить данные.

Методы восстановления:

  • Один метод использует SQL-запросы, аналогичные тем, которые были опубликованы здесь для усечения, или использует функции, такие как fn_dblog, для чтения журнала транзакций.

  • Другой метод - использовать сторонние инструменты, такие как1021 * ApexSQL Log , SQL Log Rescue , ApexSQL Recover или Quest Toad

5 голосов
/ 16 ноября 2010

Если вы используете транзакции в своем коде, TRUNCATE можно откатить. Если транзакция не используется и операция TRUNCATE зафиксирована, ее нельзя извлечь из файла журнала. TRUNCATE является операцией DDL и не регистрируется в файле журнала.

DELETE и TRUNCATE можно откатить, когда они окружены TRANSACTION, если текущий сеанс не закрыт. Если TRUNCATE записан в редакторе запросов в окружении TRANSACTION и если сеанс закрыт, его нельзя откатить, но можно удалить 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
4 голосов
/ 08 апреля 2012

SQL-сервер хранит записи (Страница № и № файла) усеченных записей и этих записей, которые вы можете легко просмотреть из запроса ниже. Как только вы получите идентификатор страницы и идентификатор файла, вы можете поместить его в страницу 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-сервера. http://raresql.com/2012/04/08/how-to-recover-truncated-data-from-sql-server-without-backup/

0 голосов
/ 28 декабря 2014

Если ваша база данных находится в режиме полного восстановления, вы можете восстановить данные путем усечения, удаления или удаления Полная пошаговая статья здесь https://codingfry.blogspot.com/2018/09/how-to-recover-data-from-truncated.html

...