SQL Server отслеживает все изменения базы данных и каждую базовую транзакцию. Это делается в файле, называемом журналом транзакций или TLOG. Журнал транзакций является важной частью базы данных и необходим для восстановления базы данных в состояние согласованности в случае сбоя системы. Журнал транзакций никогда не должен быть удален или перемещен, если вы полностью не понимаете последствия.
Но вы знали, что вы можете извлечь ценную информацию из журнала транзакций? Эта информация может помочь ответить на вопросы, такие как “Кто ответственен за удаление этой таблицы?” или “Когда произошла операция?” и может быть использована для восстановления изменений данных или потери данных.
Получение информации из журнала транзакций
Существует несколько способов получить доступ к информации внутри журнала транзакций. Один из способов – использовать команду DBCC LOG, но вывод не очень полезен для целей восстановления. Другой способ – использовать неопубликованную SQL-функцию sys.fn_dblog. Эта функция считывает активную часть журнала транзакций и предоставляет информацию о номере последовательности журнала (LSN) и типе выполненной операции.
Вот пример использования функции sys.fn_dblog:
SELECT * FROM fn_dblog(NULL, NULL)
Это вернет набор результатов с колонками, такими как CurrentLSN, Operation и TransactionId, которые могут быть использованы для отслеживания конкретных операций в журнале транзакций.
Восстановление удаленных данных
Допустим, кто-то случайно удалил несколько строк из таблицы, и вы хотите восстановить данные. Используя функцию sys.fn_dblog, вы можете найти LSN, соответствующий операции удаления, а затем восстановить базу данных до этого LSN с использованием опции STOPBEFOREMARK команды RESTORE LOG.
Вот пример восстановления базы данных до определенного LSN:
RESTORE LOG WITH STOPBEFOREMARK = 'lsn:32000000023100001'
После восстановления базы данных до нужного LSN вы можете экспортировать удаленные строки из восстановленной базы данных в производственную базу данных.
Определение LSN операции удаления таблицы
Если таблица была удалена, и вы хотите узнать, когда это произошло, вы можете использовать функцию sys.fn_dblog для поиска операций удаления в журнале транзакций. Однако может быть сложно определить точный LSN для использования при восстановлении базы данных, особенно в производственной среде, где между резервными копиями журнала транзакций может происходить несколько удалений объектов.
Вот пример поиска операций удаления в журнале транзакций:
SELECT [Current LSN], Operation, [Transaction Id], [Transaction SID], [Transaction Name], [Begin Time], [SPID], [Description], AllocUnitName FROM fn_dblog(NULL, NULL) WHERE [Transaction Name] = 'DROPOBJ'
После определения операции удаления вы можете использовать тот же процесс восстановления удаленных данных для восстановления базы данных до нужного LSN.
Заключение
Журнал транзакций в SQL Server содержит ценную информацию, которая может быть использована для восстановления изменений данных или потери данных. Используя функцию sys.fn_dblog, вы можете извлечь эту информацию и восстановить базу данных до определенного момента времени. Однако важно использовать эти техники осторожно и полностью понимать последствия изменения журнала транзакций.