Как я могу восстановить данные из файла LDF?

9

Мы используем SQL 2005 Express Edition. Мы хотим прочитать данные из файла LDF, чтобы восстановить некоторые удаленные записи.

Мы попытались использовать пробную версию ApexSQL, которая нам очень помогла. Вместо того, чтобы искать стороннее программное обеспечение, мы пытаемся понять, как читать файл журнала самостоятельно.

Как мы можем прочитать и восстановить данные из файла LDF?

goofyui
источник
Использует ли база данных модель полного восстановления или просто?
MartinC
Да, мы используем модель полного восстановления
goofyui
Мы можем восстановить данные, используя пробную версию ApexSQL. Пробная версия позволяет только просматривать данные. У нас нет бюджета, чтобы купить полную версию, поэтому мы пытаемся выяснить это сами, чтобы восстановить данные из файла
.ldf

Ответы:

11

Вам потребуется предыдущая полная резервная копия и все резервные копии журналов, сделанные с момента последней полной резервной копии

1) Возьмите хвост резервного копирования журнала

BACKUP LOG OldDB TO DISK='C:\OldDB_Tail.trn' WITH NO_TRUNCATE

2) Найти транзакцию для удаленных записей (операция будет LOP_DELETE_ROWS для DELETE и LOP_SET_BITS & LOP_MODIFY_ROW для TRUNCATE TABLE)

SELECT * FROM fn_dblog(NULL,NULL) WHERE AllocUnitName = 'dbo.YourTableName'

3) Восстановить предыдущее полное резервное копирование и создать резервные копии журналов, а также хвост новой базы данных WITH NORECOVERY и STOPAT = 'Перед началом времени для транзакции'

RESTORE DATABASE NewDB
FROM DISK='C:\Previous_Full_Backup_Of_OldDB.bak'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM',
MOVE 'OldDB' TO 'C:\DATABASES\NewDB.mdf',
MOVE 'OldDB_Log' TO 'C:\DATABASES\NewDB.ldf'

RESTORE LOG NewDB
FROM DISK='C:\Previous_TranLog_Backup_Of_OldDB.trn'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM'

RESTORE LOG NewDB
FROM DISK='C:\OldDB_Tail.trn'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM'

-- This recovers the restored database and allows access
RESTORE DATABASE NewDB WITH RECOVERY

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

Также в этом блоге Роберта Л. Дэвиса есть пример объединения STOP и STANDBY, чтобы вы могли запрашивать состояние баз данных в разные моменты времени.

MartinC
источник
А как насчет Truncate Records? Я предполагаю, что некоторые из них также усечены!
goofyui
1) Как взять .trn из моей старой базы данных. Я получил .ldf, .mdf !! У меня нет файла журнала транзакций.
goofyui
Идея здесь в том, чтобы восстановить базу данных до того момента, когда данные были потеряны, и тогда вы сможете сделать копию потерянных данных. Команда BACKUP LOG - это то, что создает файл trn из активной части журнала транзакций (ldf)
MartinC
Мне трудно полностью понять вашу точку зрения. Можете ли вы поделиться синтаксисом для продолжения ... например, сохранить его как OldDB, где произошла авария, и NewDB, в который будет восстановлен файл журнала OldDB ..
goofyui
1
Я добавил некоторые подробности и ссылки на блоги, чтобы найти момент времени для восстановления, и другой блог об использовании вывода fn_dblog для восстановления удаленных строк.
MartinC