如何从 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 name
和operation 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;远程进程可能已经死了