Читать журнал транзакций SQL Server - PullRequest
9 голосов
/ 26 января 2012

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

есть ли способ прочитать его в текстовом формате или преобразовать шестнадцатеричные данные в текст. Я хочу создать инструмент, который может читать журналы. Доступны сторонние инструменты, например ApexSQL, но ониплатные инструменты.

Ответы [ 6 ]

12 голосов
/ 26 января 2012

Вы можете использовать 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 , чтобы помочь в этом (и я полагаю, что также доступен исходный код Марка Расмуссена Orca MDF , предположительно имеет некоторый код для декодирования внутреннего формата строки).

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

3 голосов
/ 04 октября 2013

Существует несколько функций и команд 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

2 голосов
/ 26 апреля 2013
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') 

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

проверьте эту ссылку, чтобы получить ваши данные в удобочитаемом формате, проверьте здесь

1 голос
/ 12 апреля 2019

Попробуйте это.



    Select 
        b.Description,
        d.AllocUnitName,
        b.[Transaction ID],
        d.name,
        d.Operation,
        b.[Transaction Name],
        b.[Begin Time],
        c.[End Time]
    from (
        Select 
            Description,
            [Transaction Name],
            Operation,
            [Transaction ID],
            [Begin Time]
        FROM sys.fn_dblog(NULL,NULL) 
        where Operation like 'LOP_begin_XACT'
    ) as b
    inner join (
        Select 
            Operation,
            [Transaction ID],
            [End Time]
        FROM sys.fn_dblog(NULL,NULL)
        where Operation like 'LOP_commit_XACT'
    ) as c
    on c.[Transaction ID] = b.[Transaction ID]
    inner join (
        select 
            x.AllocUnitName,
            x.Operation,
            x.[Transaction ID],
            z.name
        FROM sys.fn_dblog(NULL,NULL) x
        inner join sys.partitions y
        on x.PartitionId = y.partition_id
        inner join sys.objects z
        on z.object_id = y.object_id
        where z.type != 'S'
    )as d
    on d.[Transaction ID] = b.[Transaction ID]
    order by b.[Begin Time] ASC


Это может получить транзакцию базы данных (например, вставка, обновление, удаление), время транзакции и имя объекта.

Надеюсь, что это поможет.

1 голос
/ 04 января 2017

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

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

Шаг 3. ВЫБЕРИТЕ LTRIM (RTRIM (КОНВЕРТ (VARCHAR (макс.), ЗАМЕНА (hex_Value, 0x00, 0x20)))) С # hex

Для получения дополнительной информации перейдите по этой ссылке

0 голосов
/ 26 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...