其实本篇文章算是翻译Finding a table name from a page ID这篇文章,只是不想直接翻译。用自己的理解叙说出来。算是对上一篇博客"SQL Server如何找出一个表包含的页信息(Page)"的承前启后。

我们如果从日志或dump文件中发现页信息,那么能否通过页信息找到其关联的对象呢? 答案是可以,而且非常简单。如下所示,这个DBCC PAGE的输出信息:

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

 

PAGE: (1:24188)

 

 

BUFFER:

 

 

BUF @0x000000018123EDC0

 

bpage = 0x000000012AAD6000          bhash = 0x0000000000000000          bpageno = (1:24188)

bdbid = 7                           breferences = 0                     bcputicks = 0

bsampleCount = 0                    bUse1 = 26077                       bstat = 0x9

blog = 0x21cc7a7a                   bnext = 0x0000000000000000          

 

PAGE HEADER:

 

 

Page @0x000000012AAD6000

 

m_pageId = (1:24188)                m_headerVersion = 1                 m_type = 1

m_typeFlagBits = 0x0                m_level = 0                         m_flagBits = 0x8200

m_objId (AllocUnitId.idObj) = 439   m_indexId (AllocUnitId.idInd) = 256 

Metadata: AllocUnitId = 72057594066698240                                

Metadata: PartitionId = 72057594059030528                                Metadata: IndexId = 0

Metadata: ObjectId = 631673298      m_prevPage = (0:0)                  m_nextPage = (0:0)

pminlen = 8                         m_slotCnt = 193                     m_freeCnt = 376

m_freeData = 7430                   m_reservedCnt = 0                   m_lsn = (47:211:2)

m_xactReserved = 0                  m_xdesId = (0:0)                    m_ghostRecCnt = 0

m_tornBits = 1650828474             DB Frag ID = 1                      

 

Allocation Status

.....................................................................

输出信息里面有很重要的一部分信息(PAGE HEADER),如上图所示:

通过Metadata : ObjectId =631673298, 我们可以找出这个Page所涉及的对象为TestDeadLock(其实这个Page ID确实是从表TestDeadLock中找出的一个Page)

IndexId =0 就可以判断这个是数据页,不是索引页(Index Page), m_type = 1就表示它是Data Page,m_level = 0 就表示页的层数为0

其实DBCC PAGE的输出信息里面可以挖掘到很多信息,就看你的贮备的知识多少和你是否对这些信息感兴趣。

Paul S. Randal的博客中提到,如果ObjectId为99,那么意味着这个页面已经损坏,你需要等待DBCC CHECKDB完成才能知道损坏的程度; 如果您看到ObjectId为0,则表示未找到对应的元数据。这可能是因为:

自记录页面损坏以来,已删除该页面所属的表

系统目录以某种方式损坏了

该页面已损坏,因此使用了不正确的值来查找元数据

无论如何,您都需要等待DBCC CHECKDB完成才能知道区损坏的程度。

另外,如果OBJECT_NAME (xxxx)返回NULL,要么是你执行脚本上下文的数据库弄错了,要么是元数据损坏了。需要DBCC CHECKDB返回详细信息。

The Metadata: ObjectId field is what we want. If you see it is 99, then stop as that means the damaged page is part of the allocation system and not part of a table and you’ll need to wait for DBCC CHECKDB to complete to know the extent of the damage.

If you see the ObjectId is 0, that means there was no metadata found. This could be because:

The table that the page was part of has been deleted since the page corruption was logged

The system catalogs are corrupt in some way

The page is corrupt and so incorrect values were used to look up the metadata

In any case, you’ll need to wait for DBCC CHECKDB to complete to know the extent of the damage.

参考资料:

https://www.sqlskills.com/blogs/paul/finding-table-name-page-id/

SQL Server如何通过Page_ID找到对应的表的更多相关文章

  1. 如果SQL Server 配置管理器没有找到就代表安装失败?

    如果SQL Server 配置管理器没有找到就代表安装失败? 2017-05-09 17:58 124人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先,只要你 ...

  2. 【SQL Server复制】数据库复制:修改表结构、新增表、新增存储过程 会被复制到订阅服务器?

    转自:https://www.cnblogs.com/happyday56/p/3849018.html 关键字:sql server复制 [SQL Server高可用性]数据库复制:修改表结构.新增 ...

  3. SQL Server 2008 阻止保存要求重新创建表的更改问题的设置方法

    不是很理解为什么在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你.而且我遇到的情况是居然有的时候阻止你,有的时候不阻止你,摸不到头脑. ...

  4. 【转】【SQLServer】SQL Server 2008“阻止保存要求重新创建表的更改”

    不是很理解为什么在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你.而且我遇到的情况是居然有的时候阻止你,有的时候不阻止你,摸不到头脑. ...

  5. SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

    ---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ ...

  6. SQL Server性能优化(8)堆表结构介绍

    一.表结构综述 下图是SQL Server中表的组织形式(其中分区1.分区2是为了便于管理,把表进行分区,放到不同的硬盘数据文件里.默认情况下,表只有一个分区.).表在硬盘上的存放形式,有堆和B树两种 ...

  7. sql server编写通用脚本自动统计各表数据量心得

    工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...

  8. SQL Server 多库操作 库名.dbo.表名 出错的问题!

    SQL Server 多库操作 库名.dbo.表名 出错的问题! 数据库名不要用数字开头. 例如:343934.dbo.user 这就会出错.md a343934.dbo.user 就没问题!! 记住 ...

  9. SQL Server 2017 SELECT…INTO 创建的新表指定到文件组

    原文:SQL Server 2017 SELECT-INTO 创建的新表指定到文件组 SELECT-INTO 在 SQL Server 中也是常见的一个功能,过去用此方法创建的新表只能存储到默认的文件 ...

随机推荐

  1. Java修炼——异常的概念以及处理方式(捕获异常)

    异常概念分类 异常( Exception 也称例外)就是在程序的运行过程中 所发生的不正常的事件,它会中断正在运行的程序  所需文件找不到  网络连接不通或中断  算术运算错 (被零除-)  ...

  2. python3如何随机生成大数据存储到指定excel文档里

    本次主要采用的是python3的第三方库xlwt,来创建一个excel文件.具体步骤如下: 1.确认存储位置,文件命名跟随时间格式 2.封装写入格式 3.实现随机数列生成 4.定位行和列把随机数写入 ...

  3. POJ1743 Musical Theme (后缀数组 & 后缀自动机)最大不重叠相似子串

    A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the ...

  4. UVA-136Ugly numbers

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...

  5. Orleans在.net core的开发

    Goods 服务 启动 using System; using System.Collections.Generic; using System.Linq; using System.Net; usi ...

  6. 实习生4面美团Java岗,已拿offer!(框架+多线程+集合+JVM)

    美团技术一面 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不好 挺好的(其实心还是有点虚,不过最近刷了很多题也只能壮着胆子充胖子了) 3.找到单链表的三等分点,如果单链表是 ...

  7. 什么是RMI?

    RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力.Java作为一种风靡一时的网络开发语言,其巨大的威 ...

  8. CMAKE同时编译C++和CUDA文件

    1. 首先是运行环境 Ubuntu 16.04 G++ 5.4.0 CUDA 8.0 2. 文件结构 cv@cv:~/myproject$ tree src src/ |-- CMakeLists.t ...

  9. python 类属性与实例属性

    #__author__ = 'juzi_juzi' #类属性与实例属性 #1.无法通过类访问实例属性: #2.类属性归类所所有,但是所有实例都可访问: #3.如果存在相同名称的类属性与实例属性,实例访 ...

  10. appium+java(八)获取Toast内容信息

    前言 Appium中很经典的问题了,在两年前也就是2017年3月6号07:22分,我才看到appium1.6.3版本的发布,更新内容为Ios上可以实现Toast的获取,而Windows也就是安卓端,还 ...