2012-01-26 34 views
8

Cách chúng ta có thể đọc nhật ký giao dịch SQL Server, tôi biết sử dụng nhật ký DBCC (cơ sở dữ liệu, 4) và nó sẽ tạo đầu ra nhật ký bây giờ tôi muốn giải mã Nhật ký ghi nhật ký.Đọc nhật ký giao dịch SQL Server

0x00003E001C000000A500000001000200BE040000000006021D0000000100000018000000 (chỉ là một phần của dữ liệu)

là có phương pháp nào để đọc nó trong định dạng văn bản hoặc chuyển đổi dữ liệu hex để text.i muốn thực hiện một công cụ có thể đọc công cụ của bên logs.third có sẵn tức là ApexSQL nhưng chúng là công cụ được trả tiền.

+0

Để làm được những gì chính xác? –

+0

bản sao có thể có của [Trình thám hiểm/nhật ký giao dịch máy chủ SQL] (http://stackoverflow.com/questions/3789443/sql-server-transaction-log-explorer-analyzer) –

Trả lời

11

Bạn có thể sử dụng sys.fn_dblog để đọc nhật ký giao dịch. Ví dụ bên dưới.

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') 

Đối với một IIRC deleteinsert hoạt động [RowLog Contents 0] chứa toàn bộ hàng chèn và xóa. Các bản cập nhật phức tạp hơn một chút ở chỗ chỉ một hàng có thể được ghi lại.

Để giải mã định dạng hàng này, bạn cần phải hiểu cách các hàng được lưu trữ nội bộ trong SQL Server. Cuốn sách Microsoft SQL Server 2008 Internals trình bày chi tiết này. Bạn cũng có thể tải xuống SQL Server Internals Viewer để được trợ giúp về vấn đề này (Và tôi tin rằng mã nguồn cho Mark Rasmussen 's Orca MDF cũng có sẵn, có lẽ có một số mã để giải mã định dạng hàng nội bộ).

Để biết ví dụ về việc thực hiện điều này trong TSQL, hãy xem this blog post để chứng minh rằng hoàn toàn có thể trích xuất thông tin hữu ích từ nhật ký miễn là mục đích của dự án bị giới hạn. Viết một trình đọc nhật ký thổi đầy đủ có thể đối phó với các thay đổi lược đồ trong các đối tượng và những thứ như cột thưa thớt (và các chỉ mục lưu trữ cột trong phiên bản tiếp theo) có thể là một số lượng lớn công việc.

0

Tôi không thể hiểu nhu cầu của bạn, nhưng dữ liệu từ nhật ký của bạn có thể được trích xuất bằng các công cụ như Lumigent LogExplorer. Tôi không biết gì về một cách khác để làm những gì bạn muốn.

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') 

bạn nhận được giao dịch liên quan đến tất cả các thông tin sử dụng trên query..where cột kỷ lục đăng nhập sẽ hiển thị ghi lại thực tế của bạn mà là ở định dạng Hexadecimal ..

kiểm tra liên kết này để có được dữ liệu của bạn sang định dạng có thể đọc được của con người. check here

+0

Dễ dàng giải pháp tốt nhất cho câu hỏi này. Chỉ cần lưu một vài trăm hàng cho tôi. –

+1

@MagicLasso - Nó chứa chính xác cùng một liên kết và phần lớn mã giống như tôi đã đăng ba tháng trước đó. –

2

Có một số hàm và lệnh SQL Server (ví dụ: fn_dblog, fn_dump_dblog và DBCC PAGE) có khả năng cung cấp cách xem nội dung tệp LDF. Tuy nhiên, cần phải có kiến ​​thức quan trọng về T-SQL để sử dụng chúng, một số không có giấy tờ và kết quả chúng cung cấp rất khó để chuyển thành định dạng có thể đọc được. Sau đây là những ví dụ của việc xem nội dung file LDF sử dụng các hàm SQL Server và các lệnh:

1 - Dưới đây là một ví dụ sử dụng fn_dblog để đọc một nhật ký giao dịch trực tuyến, với một kết quả của 129 cột (chỉ 7 đưa ra ở đây)

enter image description here

2 - Chức năng fn_dump_dblog được sử dụng để đọc nhật ký giao dịch bản sao lưu gốc hoặc nén nguyên bản. Kết quả cũng tương tự:

enter image description here

Thật không may, không có tài liệu chính thức có sẵn cho fn_dblog và chức năng fn_dump_dblog.Để dịch các cột, bạn cần phải làm quen với cấu trúc nội bộ và định dạng dữ liệu, cờ và tổng số của chúng trong dữ liệu hàng

3 - DBCC PAGE được sử dụng để đọc nội dung của tệp trực tuyến cơ sở dữ liệu - MDF và LDF. Kết quả là một đầu ra hệ thập lục phân, trong đó trừ khi bạn có một trình soạn thảo hex, sẽ rất khó để giải thích

enter image description here

0

Bước 1. CREATE TABLE # hệ lục phân ( [hex_Value] varbinary NULL )

bước 2. dữ liệu chèn vào bảng, Ví dụ chèn vào giá trị # hệ lục phân (0x300008000F000000030000020015001B00536976754D79736F7265)

bước 3. Chọn LTRIM (RTRIM (CONVERT (VARCHAR (max), REPLACE (hex_Value, 0x00, 0x20)))) TỪ # hệ lục phân

For more Information go through this link

Các vấn đề liên quan