2012-01-26 5 views
8

Как мы можем читать журналы транзакций SQL Server, я знаю, используя журнал DBCC (база данных, 4), и теперь он будет генерировать выходные данные журнала. Я хочу декодировать запись журнала, которая является шестнадцатеричным.Прочитать журнал транзакций SQL Server

0x00003E001C000000A500000001000200BE040000000006021D0000000100000018000000 (только часть данных)

есть ли способ, чтобы прочитать его в текстовом формате или преобразовывать шестнадцатеричные данные в text.i хочет сделать инструмент, который может читать logs.third инструментов сторонних производителей доступны т.е. ApexSQL, но они являются платными инструментами.

+0

Чтобы сделать то, что именно? –

+0

Возможный дубликат [SQL Server Transaction Log Explorer/Analyzer] (http://stackoverflow.com/questions/3789443/sql-server-transaction-log-explorer-analyzer) –

ответ

11

Вы можете использовать sys.fn_dblog, чтобы прочитать журнал транзакций. Пример ниже.

SELECT [RowLog Contents 0], 
     [RowLog Contents 1], 
     [Current LSN], 
     Operation, 
     Context, 
     [Transaction ID], 
     AllocUnitId, 
     AllocUnitName, 
     [Page ID], 
     [Slot ID] 
FROM sys.fn_dblog(NULL,NULL) 
WHERE Context IN ('LCX_MARK_AS_GHOST', 'LCX_HEAP', 'LCX_CLUSTERED') 
AND Operation IN ('LOP_DELETE_ROWS', 'LOP_INSERT_ROWS') 

Для delete и insert операции IIRC [RowLog Contents 0] содержит всю строку, вставленный и удален. Обновления немного сложнее в том, что можно зарегистрировать только частичную строку.

Чтобы декодировать этот формат строки, вам нужно понять, как строки хранятся внутри SQL Server. Книга Microsoft SQL Server 2008 Internals подробно описывает это. Вы также можете скачать SQL Server Internals Viewer, чтобы помочь в этом отношении (И я считаю, что также имеется исходный код для Mark RasmussenOrca MDF, который предположительно имеет некоторый код для декодирования внутреннего формата строки).

Для примера этого в TSQL см. this blog post, который показывает, что вполне возможно извлечь полезную информацию из журнала до тех пор, пока цель проекта ограничена. Написание полностью обработанного журнала, который мог бы справиться с изменениями схемы в объектах и ​​вещами, такими как разреженные столбцы (и индексы хранилища столбцов в следующей версии), скорее всего, будет огромным объемом работы.

0

Я не могу понять ваши потребности, но данные из вашего журнала можно извлечь с помощью таких инструментов, как Lumigent LogExplorer. Я ничего не знаю о другом способе делать то, что вы хотите.

1
Select * from sys.fn_dblog(NULL,NULL) 
WHERE Context IN ('LCX_MARK_AS_GHOST', 'LCX_HEAP', 'LCX_CLUSTERED') 
AND Operation IN ('LOP_DELETE_ROWS', 'LOP_INSERT_ROWS') 

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

проверить эту ссылку, чтобы получить данные в удобочитаемый формат. check here

+0

Легко лучшее решение этого вопроса. Просто сохранил пару сотен строк для меня. –

+1

@MagicLasso - Он содержит точно такую ​​же ссылку и в основном тот же код, что и я, опубликованный тремя месяцами ранее. –

2

Есть несколько функций SQL Server и команды (например, fn_dblog, fn_dump_dblog и DBCC PAGE), которые потенциально обеспечивают способ просмотра содержимого файла LDF. Однако для их использования требуются значительные знания T-SQL, некоторые из них недокументированы, а полученные результаты трудно преобразовать в удобочитаемый формат. Ниже приведены примеры просмотра содержимого файла LDF с использованием функций и команд SQL Server:

1 - Вот пример использования fn_dblog читать журнал онлайн транзакций, с результатом 129 столбцов (только 7 показано здесь)

enter image description here

2 - Функция fn_dump_dblog используется для чтения собственных или сжатых резервных копий протокола транзакций. Результат аналогичен:

enter image description here

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

3 - DBCC PAGE используется для чтения содержимого онлайн-файлов базы данных - MDF и LDF. Результатом является шестнадцатеричным выход, который, если у вас есть шестнадцатеричный редактор, будет трудно интерпретировать

enter image description here

0

Шаг 1. CREATE TABLE #hex ( [hex_Value] VARBINARY NULL )

Шаг 2. данные вставки в таблицу, пример вставки в значение #hex (0x300008000F000000030000020015001B00536976754D79736F7265)

Шаг 3. ВЫБРАТЬ LTRIM (RTRIM (CONVERT (VARCHAR (макс), REPLACE (hex_Value, 0x00, 0x20)))) ИЗ #hex

For more Information go through this link

Смежные вопросы