能否根据数据页信息查询到具体数据

szm341 2013-09-16 03:30:56

RT
能不能根据图中信息查到数据页内保存的具体数据?
...全文
203 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
szm341 2013-10-16
  • 打赏
  • 举报
回复
膜拜大神~~
KevinLiu 2013-10-11
  • 打赏
  • 举报
回复
引用 8 楼 yupeigu 的回复:
[quote=引用 楼主 szm341 的回复:] RT 能不能根据图中信息查到数据页内保存的具体数据?
呵呵,我做的一个实验,你可以参考参考:

--1.先建表
CREATE TABLE test(idd INT NOT NULL,name VARCHAR(10) NULL)

INSERT INTO TEST
SELECT 1,'abcdefg'
UNION ALL
SELECT 2,'hijklmn'


--SELECT * FROM TEST

SELECT *
FROM sys.tables 
WHERE name = 'test'



--2.查询元数据
--hobt_id : 72057594043236352
SELECT hobt_id
FROM sys.partitions
WHERE object_id = object_id('test')


/*
first_page :0x790500000100

拆分成2部分:0100和79050000

这2部分要翻转,也就是0001 和 00000579

前面表示fileId,后面是pageId,都是16机制的表示方法,

通过calc计算器的转换,就是10进制就是1和1401

*/
SELECT first_page    --转换值的顺序
FROM sys.system_internals_allocation_units
WHERE container_id = 72057594043236352



--3.这里创建一个表,用来存放dbcc page的结果
if exists(select * from sys.tables where name = 'dbcc_page')
   drop table dbcc_page
go
create table dbcc_page
(
ParentObject varchar(500),
Object       varchar(2000),
Field        varchar(1000),
Value        nvarchar(max)
)
go


--4.参数分别是数据库名,fileid,pageid,显示格式
--注意:这里是在自己的电脑上实验,用的master数据库,大家不要在正是服务器上尝试
/*
--这样会报错,只能采用下面的,建一个存储过程
insert into dbcc_page(ParentObject,Object,Field,Value)
DBCC page(master,1,1401,3) with tableresults
*/
if exists(select * from sys.procedures where name = 'proc_dbcc_page')
   drop procedure proc_dbcc_page
go

create procedure proc_dbcc_page
as

DBCC page(master,1,1401,3) with tableresults

go


--5.把dbcc page的结果插入到表中
insert into dbcc_page(ParentObject,Object,Field,Value)
exec proc_dbcc_page


--6.查看数据
select *
from dbcc_page


--过滤大部分其他元数据,选出表test中的数据,与最上面的数据相一致
select OBJECT,
       Field,
       value
from dbcc_page
where Object like 'Slot%Column%'
/*
OBJECT	                                               Field	value
Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4	idd	    1
Slot 0 Column 2 Offset 0xf Length 7 Length (physical) 7	name	abcdefg
Slot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4	idd	    2
Slot 1 Column 2 Offset 0xf Length 7 Length (physical) 7	name	hijklmn
*/
[/quote] 这个可以有
LongRui888 2013-10-11
  • 打赏
  • 举报
回复
引用 楼主 szm341 的回复:
RT 能不能根据图中信息查到数据页内保存的具体数据?
呵呵,我做的一个实验,你可以参考参考:

--1.先建表
CREATE TABLE test(idd INT NOT NULL,name VARCHAR(10) NULL)

INSERT INTO TEST
SELECT 1,'abcdefg'
UNION ALL
SELECT 2,'hijklmn'


--SELECT * FROM TEST

SELECT *
FROM sys.tables 
WHERE name = 'test'



--2.查询元数据
--hobt_id : 72057594043236352
SELECT hobt_id
FROM sys.partitions
WHERE object_id = object_id('test')


/*
first_page :0x790500000100

拆分成2部分:0100和79050000

这2部分要翻转,也就是0001 和 00000579

前面表示fileId,后面是pageId,都是16机制的表示方法,

通过calc计算器的转换,就是10进制就是1和1401

*/
SELECT first_page    --转换值的顺序
FROM sys.system_internals_allocation_units
WHERE container_id = 72057594043236352



--3.这里创建一个表,用来存放dbcc page的结果
if exists(select * from sys.tables where name = 'dbcc_page')
   drop table dbcc_page
go
create table dbcc_page
(
ParentObject varchar(500),
Object       varchar(2000),
Field        varchar(1000),
Value        nvarchar(max)
)
go


--4.参数分别是数据库名,fileid,pageid,显示格式
--注意:这里是在自己的电脑上实验,用的master数据库,大家不要在正是服务器上尝试
/*
--这样会报错,只能采用下面的,建一个存储过程
insert into dbcc_page(ParentObject,Object,Field,Value)
DBCC page(master,1,1401,3) with tableresults
*/
if exists(select * from sys.procedures where name = 'proc_dbcc_page')
   drop procedure proc_dbcc_page
go

create procedure proc_dbcc_page
as

DBCC page(master,1,1401,3) with tableresults

go


--5.把dbcc page的结果插入到表中
insert into dbcc_page(ParentObject,Object,Field,Value)
exec proc_dbcc_page


--6.查看数据
select *
from dbcc_page


--过滤大部分其他元数据,选出表test中的数据,与最上面的数据相一致
select OBJECT,
       Field,
       value
from dbcc_page
where Object like 'Slot%Column%'
/*
OBJECT	                                               Field	value
Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4	idd	    1
Slot 0 Column 2 Offset 0xf Length 7 Length (physical) 7	name	abcdefg
Slot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4	idd	    2
Slot 1 Column 2 Offset 0xf Length 7 Length (physical) 7	name	hijklmn
*/
szm341 2013-09-16
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
死锁分析比较好的一本书:《sqlserver 2012 实施与管理实战指南》 徐海蔚著,她写的2008估计你很难找到了。
谢版主~
發糞塗牆 2013-09-16
  • 打赏
  • 举报
回复
死锁分析比较好的一本书:《sqlserver 2012 实施与管理实战指南》 徐海蔚著,她写的2008估计你很难找到了。
發糞塗牆 2013-09-16
  • 打赏
  • 举报
回复
2005 存储引擎那本
szm341 2013-09-16
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
其实那个不是叫你去看数据页里面是什么内容,而是告诉你这个页存在死锁。怎么读那部分的数据可以去看2005或者2008技术内幕。那个是十六进制,要转换的,的确不好懂。死锁问题,应该总体来看。不要看那个数据页是干嘛的。
嗯。。好吧,也是,其实我主要是想问问能不能直接用pageid提取出直观的数据来? 这个技术内幕有记录吗?是哪一部啊?
發糞塗牆 2013-09-16
  • 打赏
  • 举报
回复
其实那个不是叫你去看数据页里面是什么内容,而是告诉你这个页存在死锁。怎么读那部分的数据可以去看2005或者2008技术内幕。那个是十六进制,要转换的,的确不好懂。死锁问题,应该总体来看。不要看那个数据页是干嘛的。
szm341 2013-09-16
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
DBCC TRACEON(3604) GO DBCC PAGE(5,1,989172)
这个我知道,但是读出来的东东看不懂,也看不到保存的具体数据啊~ 比如记录的userid是1还是100w这样的 还有就是。。这个对死锁分析具体有什么作用呢~
發糞塗牆 2013-09-16
  • 打赏
  • 举报
回复
DBCC TRACEON(3604) GO DBCC PAGE(5,1,989172)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧