热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

深入解析SQLServer行迁移记录

引:本文基于SQLServer数据库mdf数据文件的存储结构,描述的是数据库中一些跨页记录的存储方法。本文为北亚数据恢复中心内部研究成果,目前仅发布于51CTO,转载

引:本文基于SQLServer数据库mdf数据文件的存储结构,描述的是数据库中一些跨页记录的存储方法。本文为北亚数据恢复中心内部研究成果,目前仅发布于51CTO,转载

引:本文基于SQL Server数据库mdf数据文件的存储结构,描述的是数据库中一些跨页记录的存储方法。本文为北亚数据恢复中心内部研究成果,目前仅发布于51CTO,转载时请与作者联系。

40002000200020002000

78

78401780341

wKiom1SB0wOSzVVTAACmtSY0pvo633.jpg

78sql server 80,3)

m_slotCnt = 1 m_freeCnt = 3065 m_freeData = 5125

Slot 0 Offset 0x60 Length5029

Record Type = FORWARDED_RECORD RecordAttributes = NULL_BITMAPVARIABLE_COLUMNS

Record Size = 5029

Memory Dump@0x000000000D30A060

0000000000000000: 3200080001000000 03000003 00cb0b9b 2...............

0000000000000010: 13a59362 62626262 62626262 62626262...bbbbbbbbbbbbb

0000000000000020: 62626262 62626262 62626262 62626262bbbbbbbbbbbbbbbb

0000000000000030: 62626262 62626262 62626262 62626262bbbbbbbbbbbbbbbb

……

在第80页中,有一条记录slot 0,起始为96字节,长度为5029,记录类型为 forwarded_record.这条记录就是forwarding_stub中指向的溢出记录,记录着第78页中slot0数据记录的真实数据。

这是一条完整记录,和一般记录格式略有差异,最大的不同是在记录中加入了一列变长数据。这一变长列加在记录的最后,只是存储引擎使用,对上层是透明的。同时记录的列信息也发生了变化。

列信息里的变长列数加1,而总列数不发生变化。变长列偏移数组里多出一项,用来指定加入的数据列的结束偏移,这个变长列的长度其实是固定的,都是10字节,应该是考虑到存取性能才把这个数据放在了记录的最后。这列数据其实不是一列标准的列数据,应该是一个forwarding_stub的结构体数据。里边也是存储了一个rowid指针,用8字节保存了指向移出前的记录的位置指针。

这个加入的列数据的定位解析还有点特殊。它在列信息中的列数据结束偏移是非常规的,是按溢出类型格式存储的。它的值会大于8192字节,其实是真实数值加了0x8000

现在来具体解释下上面的这条forwarded记录:

此记录头部状态A的值为0x32,解释为有可变长列,有null位图的forwarded 移出记录。记录总长度为5029字节数。列信息数据为03000003 00cb0b9b13a593。根据列信息结构来解析可得,总列数为3,是包含abc三个字段。Null位图都为0,表示没有为空的列。变长列数也为3,这里是包含了变长列bc和增加列。后边的结束偏移数组有3个,占用6字节,分别表示这3个变长列数据的结束位置。前两个很容易理解,第三个是0x93A5,转为十进制为37797,这明显是不正常的,真实的偏移值应为此值减去0x8000,即为0x13A5,转十进制为5029。这个值在前面的记录总长度处见过,不是巧合。

这样就可以手工的取出每一个字段值了。取出最后一列的值,会发现它特殊一点:

0004 4e00000001000000 。数据长度为10字节,跟forwarding很相似,只是在头部多加了一个字节的00。字段里的rowid记录了原来的forwarding记录的地址,这里是(1:78:0,这个地址指针正是指向前面我们看到的那条forwarding记录。

下面通过一幅图来总结下此节讲解的forwardingforwarded记录的整体结构。

wKioL1SB09azl6l0AACxlLKixC0997.jpg

Forwarding记录和forwarded 记录的相互连接关系

下图是在winhex中的解析展示:

wKiom1SB01nhUGhoAAHEchmqOwg428.jpg

推荐阅读
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 本文讲述了一位80后的普通男性程序员,尽管没有高学历,但通过不断的努力和学习,在IT行业中逐渐找到了自己的位置。从最初的仓库管理员到现在的多技能开发者,他的职业生涯充满了挑战与机遇。 ... [详细]
  • 图数据库与传统数仓实现联邦查询使用CYPHER实现从关系数据库过滤时间序列指标一、MySQL得到研报实体在Oracle中的唯一ID二、Oracle中过滤时间序列数据三、CYPHER ... [详细]
  • 大数据领域的职业路径与角色解析
    本文将深入探讨大数据领域的各种职业和工作角色,帮助读者全面了解大数据行业的需求、市场趋势,以及从入门到高级专业人士的职业发展路径。文章还将详细介绍不同公司对大数据人才的需求,并解析各岗位的具体职责、所需技能和经验。 ... [详细]
  • Java毕业设计项目:“传情旧物”网站(含源码与数据库)
    本项目介绍了如何配置和运行“传情旧物”网站,包括所需的技术栈、环境配置以及具体的操作步骤。 ... [详细]
  • 本文为初学者提供了一条清晰的学习路线,帮助他们逐步成长为优秀的Web开发人员。通过十个关键步骤,涵盖从基础到高级的各个方面,确保每位学习者都能找到适合自己的学习方向。 ... [详细]
  • 在尝试将 mysqldump 文件加载到新的 MySQL 服务器时,遇到因使用保留关键字 'table' 导致的语法错误。 ... [详细]
  • 阿里面试题解析:分库分表后的无限扩容瓶颈与解决方案
    本文探讨了在分布式系统中,分库分表后的无限扩容问题及其解决方案。通过分析不同阶段的服务架构演变,提出了单元化作为解决数据库连接数过多的有效方法。 ... [详细]
  • 本文详细介绍了如何将Spring框架与Hibernate ORM框架进行集成,包括配置文件的设置和数据持久化操作的实现。 ... [详细]
  • 如何将两个具有相同主键的Excel表格合并
    本文介绍如何将两个具有相同主键的Excel表格进行合并,通过左连接的方式将表2的数据插入到表1中。具体步骤包括在表1中添加新的列、使用VLOOKUP函数进行数据匹配,以及通过SQL语句实现数据库中的表连接。 ... [详细]
  • 解决Win7安装SQL Server时NetFx3启动失败的问题
    在使用Win7系统安装SQL Server时,部分用户可能会遇到“启动Windows功能NetFx3时出错”的提示。本文将详细介绍这一问题的原因及解决方法。 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • 本文讨论了在 Oracle 10gR2 和 Solaris 10 64-bit 环境下,从 XMLType 列中提取数据并插入到 VARCHAR2 列时遇到的性能问题,并提供了优化建议。 ... [详细]
  • 本文探讨了在 SQL Server 2012 的 Integration Services 项目中配置 ADO.NET 源时遇到的错误及其解决方案。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
author-avatar
逸之思
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有