【问题标题】:How can I extract T-SQL command from LDF file in SQL Server?如何从 SQL Server 的 LDF 文件中提取 T-SQL 命令?
【发布时间】:2013-09-05 18:16:29
【问题描述】:

我使用 SQL Server 2008 R2 以及 SSAS 和 SSIS。

我创建了一个阶段数据库,每天都从 OLTP 数据库中填充。

然后在数据清理和集成数据 (ETL) 之后,我最常将我的数据转移到 DataWarehouse

现在我需要做的是如何更改我的 OLTP 数据库中的跟踪。

我知道解决方案Trigger(我可以在 OLTP 数据库中的所有表上触发触发器并记录数据插入/删除/更新自触发器内的已插入和已删除表)

但是我的 OLTP 数据库非常大(大约 80,000,000 条记录)并且创建触发器使我的业务变慢。

我从这个网站上找到了一些这样的查询:

SELECT 
*
FROM 
sys.fn_dblog(NULL,NULL)

显示来自LDF 文件的所有记录。

我找到了一些第三方软件,它可以读取 LDF 文件,然后提取命令(插入/更新/删除)命令,例如 ApexSQL

我在这个网站上发现了一个问题How to view transaction logs in SQL Server 2008

最后我认为如果第 3 方可以从 LDF 文件中提取此命令,为什么我们不能提取该命令?!?

另一方面,我需要在 OLTPs 数据库中找到像 Alter Table 和 Alter Field 这样的 DDL 命令来更改我的阶段数据库。

我发现This Link 可以从 LDF 文件中恢复已删除的行。

【问题讨论】:

  • 我需要一个更窄且格式正确的问题。
  • 根据您的编辑,您需要开始使用一些更改跟踪。为此解析日志文件不是解决方案。

标签: sql-server-2008 ssis ssas data-warehouse olap


【解决方案1】:

虽然上面的答案会告诉您如何查看事务日志,但我同意 JNK 的观点,即解析事务日志不是表更改的良好审计线索。

这完全取决于您要保留多少审计数据,以及您愿意在审计中放慢多少速度。不要忘记数据保留期限。

1 - 基于触发器的审计在表和数据库级别都可以正常工作。请参阅我的 blog 了解有关此问题的演示文稿。

但是,对具有大量更改的表进行审计可能不切实际,并且您可能永远不会使用这些数据。保留期限是关键。

2 - 如果您想使用 SQL Server 内置的功能,请查看 Change Data Capture 功能。它基于将日志文件作为定期 SQL 代理作业读取。因此,您没有针对每个事件的触发器触发。某事发生与发生之间存在滞后时间。

3 - 如果您只是查看记录是由谁以及何时插入或更新的,这可以通过修改数据仓库的自定义 ETL 代码来完成。只需将这些字段添加到表中并让代码更新它们。

我希望这些建议能让您远离阅读交易日志,这实际上可能非常乏味。

约翰

【讨论】:

  • 我认为Change Data Capture 是更好的解决方案。谢谢。
【解决方案2】:

您可以使用 Kalen Delaney 的 SQL Server xxx Internals 书中描述的 sys.fn_dblog() 函数来转储整个日志,

-- Use adventure works
USE AdventureWorks2012;
go

-- Dump (ins, del, upd) rows
SELECT *
FROM sys.fn_dblog(NULL,NULL)
WHERE Operation IN ('LOP_DELETE_ROWS', 'LOP_INSERT_ROWS','LOP_MODIFY_ROW');
go

但是,它们是包含插入和删除数据的二进制字段。此外,更新可能只包含部分数据。

这方面我没有做太多研究……

但是,大家都知道,固定数据是先存储在一行中,然后是可变长度数据。见内部书。您将不得不解析出二进制 blob 的每个部分。这适用于简单数据,而不是特殊页面类型。

看看这个blog article ,它只是为了一个固定的例子这样做。

如果您想为任何桌子动态地执行此操作,请从花时间进行研究的公司购买商用现货 (COTS) 产品。

【讨论】:

    【解决方案3】:

    我发现了这个:

    Select * from ::fn_dblog(null,null)
    

    或查看此链接:How can I view SQL Server 2005 Transaction log file

    或此链接:How Do You Decode A Simple Entry in the Transaction Log?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 2010-12-21
      • 1970-01-01
      • 2011-12-19
      • 2011-01-02
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多