如何从 TRANSACTION LOG BACKUP FILE 中获取 SQL 语句? [关闭]

Posted

技术标签:

【中文标题】如何从 TRANSACTION LOG BACKUP FILE 中获取 SQL 语句? [关闭]【英文标题】:How to get SQL statement from TRANSACTION LOG BACKUP FILE? [closed] 【发布时间】:2017-06-27 02:53:18 【问题描述】:

我只是想问一下 SQL Server 中的事务日志。我们可以在任何系统位置以.bak 格式备份这些日志文件。

问题是从事务日志备份文件中提取 SQL 语句/查询。我们可以使用fn_dump_dblog 函数来做到这一点。但我们想要的是在日志中提取查询或事务必须完成的数据。

我想手动执行它,就像为 sql server 执行的“apex”工具一样。并且不想使用任何第三方工具。

现在我可以从日志中提取table nameoperation type。但仍在搜索 SQL 语句提取。

【问题讨论】:

事务日志不包含已在数据库上执行的查询的任何历史记录。它包含在(某些)故障的情况下恢复数据库所需的信息以及使数据库持久的足够信息。它确实包含操作类型,因为它需要知道数据是添加还是删除,以便知道在恢复期间要做什么。 【参考方案1】:

解码事务日志的内容非常棘手 - Apex 会为执行此操作的工具收费是有原因的 - 需要做很多工作才能做到正确。

事务日志本身是所发生更改的记录,而不是为进行更改而执行的查询的记录。在您的问题中,您提到提取查询 - 这是不可能的,只能提取数据更改。

对于简单的插入/删除事务,可以对其进行解码,但是这样做的复杂性太大,无法在此处详细重现。使用 fn_dblog 解码日志的简单场景类似,但其复杂性应该让您了解它的难度。您可以在 RowLogContents 中提取操作类型 + 十六进制数据 - 根据操作类型,RowLogContents 可以“相对”简单地解码,因为它与页面上二进制/十六进制级别的行格式相同.

我不喜欢使用链接作为示例/答案,但仅针对简单场景的解释长度并非微不足道。我对链接答案的唯一救赎是它是我的文章 - 所以这也是免责声明。长度和复杂性确实使这个问题无法用肯定的答案来回答!

https://sqlfascination.com/2010/02/03/how-do-you-decode-a-simple-entry-in-the-transaction-log-part-1/ https://sqlfascination.com/2010/02/05/how-do-you-decode-a-simple-entry-in-the-transaction-log-part-2/

已经发表了进一步的文章,这些文章以此为基础尝试将这个逻辑自动化到 t-sql 本身中。

https://raresql.com/2012/02/01/how-to-recover-modified-records-from-sql-server-part-1/

您尝试编写自己的解码器所花费的时间/精力非常高,与许可证的成本相比,我绝不建议您尝试编写自己的软件来执行此操作,除非您打算出售它。

您可能还希望考虑将替代跟踪机制与应用程序代码的运行保持一致,而不是尝试从备份中进行逆向工程。

【讨论】:

以上是关于如何从 TRANSACTION LOG BACKUP FILE 中获取 SQL 语句? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Transaction Log Truncate && Shrink

The transaction log for database 'xxxx' is full due to 'ACTIVE_TRANSACTION'

[转]How expensive are page splits in terms of transaction log?

SpringBoot系列(入门,ORM,Transaction,lOG)

Android throw DeadObjectException with LOG: Transaction failed on small parcel;远程进程可能已经死了

Web3 JS 如何从区块中获取交易