我无法弄清楚为什么在查询事务日志文件时此连接无法返回表名。
SELECT [Transaction ID],
[Current LSN],
PartitionId,
sp.object_id,
so.[name],
[Operation],
[Context],
[AllocUnitName],
[Begin Time],
[End Time],
[Transaction SID],
[Num Elements] ,
[RowLog Contents 0],
[RowLog Contents 1],
[RowLog Contents 2],
[RowLog Contents 3]
FROM fn_dump_dblog(NULL,NULL,'DISK',1
,'D:\Users\Chad\SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\OTIS_LogBackup_2016-02-02_13-36-21.bak'
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL) as logF
LEFT OUTER JOIN sys.partitions sp ON sp.partition_id = logF.PartitionId
LEFT OUTER JOIN sys.objects so on so.object_id = sp.object_id
WHERE
[Transaction ID] = '0000:00d15747';
这是结果。您可以看到分区 ID 已填充:
当我执行此查询以获取表名时,它使用在先前结果中找到的分区 id 工作:
SELECT so.*
FROM sys.objects so
INNER JOIN sys.partitions sp on so.object_id = sp.object_id
WHERE sp.partition_id = 72057594059489280
那么为什么我加入上面的原始语句时找不到表名呢?
您需要确保在正确数据库的上下文中运行查询。
由于诸如
sys.objects
上下文相关的系统视图,它们只返回与当前数据库相关的行。例如,在 master 中运行此代码只会显示
PartitionId
master 中存在的表,并且这些表名可能不正确。假设您的数据库名称是
OTIS
您可以通过将数据库名称添加到连接子句中来解决此问题,例如JOIN OTIS.sys.partitions
andJOIN OTIS.sys.objects
。由于您已经对日志文件本身的名称进行了硬编码,因此这样的事情应该更可靠地工作:
或者,您可以简单地放置
USE OTIS;
在您的select
语句之前,以便它首先执行。