我們如何讀取SQL Server事務日誌,我知道使用DBCC日誌(數據庫,4),它會生成日誌輸出,現在我想解碼爲十六進制格式的日誌記錄。閱讀SQL Server事務日誌
0x00003E001C000000A500000001000200BE040000000006021D0000000100000018000000(僅數據的一部分)
有沒有讀它以文本格式或text.i想使一個工具,可以閱讀logs.third第三方工具都可以轉換爲十六進制數據的方法即ApexSQL,但他們是付費工具。
我們如何讀取SQL Server事務日誌,我知道使用DBCC日誌(數據庫,4),它會生成日誌輸出,現在我想解碼爲十六進制格式的日誌記錄。閱讀SQL Server事務日誌
0x00003E001C000000A500000001000200BE040000000006021D0000000100000018000000(僅數據的一部分)
有沒有讀它以文本格式或text.i想使一個工具,可以閱讀logs.third第三方工具都可以轉換爲十六進制數據的方法即ApexSQL,但他們是付費工具。
您可以使用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 Rasmussen的Orca MDF的源代碼也可用,這可能有一些代碼來解碼內部行格式)。
有關在TSQL中執行此操作的示例,請參閱this blog post,該示例說明只要項目的目標有限,從日誌中提取有用信息是完全可能的。編寫一個完整的日誌讀取器,可以處理對象中的模式更改以及諸如稀疏列(以及下一版本中的列存儲索引)之類的內容,但可能需要大量的工作。
我無法理解您的需求,但您日誌中的數據可以通過Lumigent LogExplorer等工具提取。我不知道還有另一種方法去做你想做的事。
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
輕鬆解決此問題的最佳解決方案。爲我節省了幾百行。 –
@MagicLasso - 它包含與我三個月前發佈的完全相同的鏈接和基本相同的代碼。 –
有幾種SQL Server函數和命令(例如fn_dblog,fn_dump_dblog和DBCC PAGE)可能提供查看LDF文件內容的方法。然而,需要使用T-SQL的重要知識才能使用它們,有些還沒有記錄,並且它們提供的結果很難轉換爲可讀的格式。以下是使用SQL Server的功能和命令查看LDF文件內容的例子:
1 - 下面是一個使用fn_dblog閱讀網上交易日誌,以129列(僅7所示)
的結果的一個例子2 - fn_dump_dblog函數用於讀取事務日誌本機壓縮備份或本地壓縮備份。結果是相似的:
不幸的是,沒有官方的文檔可供fn_dblog和fn_dump_dblog功能。要翻譯列,您需要熟悉內部結構和數據格式,標記及其在連續數據中的總數。012 - DB3 - DBCC PAGE用於讀取數據庫聯機文件的內容 - MDF和LDF。其結果是一個十六進制輸出,除非你有一個十六進制編輯器,將難以解釋
步驟1. CREATE TABLE#十六進位( [hex_Value] VARBINARY NULL )
步驟2. 將數據插入表中,實施例 插入#十六進位值(0x300008000F000000030000020015001B00536976754D79736F7265)
步驟3. SELECT LTRIM(RTRIM(CONVERT(VARCHAR(最大值),REPLACE(hex_Value,爲0x00,0x20的)))) FROM#十六進位
到底該怎麼做? –
可能重複的[SQL Server事務日誌瀏覽器/分析器](http://stackoverflow.com/questions/3789443/sql-server-transaction-log-explorer-analyzer) –