Dechifre kle ak Page WaitResource nan enpas ak kadna

Si w itilize rapò pwosesis bloke oswa kolekte graf SQL Server yo bay detanzantan, w ap rankontre bagay sa yo:

waitresource="PAGE: 6:3:70133"

waitresource=“KEY: 6:72057594041991168 (ce52f92a058c)“

Pafwa pral gen plis enfòmasyon nan XML jeyan sa a w ap etidye (graf enpas yo genyen yon lis resous ki ede w jwenn non objè yo ak non endèks), men se pa toujou.

Tèks sa a pral ede w dekode yo.

Tout enfòmasyon ki isit la se sou entènèt la nan divès kote, li jis trè distribye! Mwen vle mete tout bagay ansanm - soti nan DBCC PAGE rive nan hobt_id ak nan fonksyon yo san papye %%physloc%% ak %%lockres%%.

Premyèman, ann pale sou datant sou kadna PAGE, epi answit nou pral ale nan kadna KLE.

1) waitresource = "PAGE: 6:3:70133" = Database_Id: FileId: PageNumber

Si demann ou an ap tann sou yon fèmen PAGE, SQL Server ap ba ou adrès paj sa a.

Dekonpoze "PAGE: 6:3:70133" nou jwenn:

  • database_id = 6
  • data_file_id = 3
  • page_numer = 70133

1.1) Decrypt database_id

Ann jwenn non baz done a lè l sèvi avèk rechèch la:

SELECT 
    name 
FROM sys.databases 
WHERE database_id=6;
GO

Sa a se piblik DB WideWorldImporters sou sèvè SQL mwen an.

1.2) Chèche non dosye done a - si w enterese

Nou pral sèvi ak data_file_id nan pwochen etap la pou jwenn non tab la. Ou ka senpleman sote nan pwochen etap la, men si w enterese nan non fichye a, ou ka jwenn li nan kouri yon rechèch nan kontèks baz done a jwenn, ranplase data_file_id nan rechèch sa a:

USE WideWorldImporters;
GO
SELECT 
    name, 
    physical_name
FROM sys.database_files
WHERE file_id = 3;
GO

Nan baz done WideWorldImporters sa a se yon fichye ki rele WWI_UserData epi mwen retabli li nan C:MSSQLDATAWideWorldImporters_UserData.ndf. (Oops, ou kenbe m 'mete fichye sou disk la sistèm! Non! Sa te gòch).

1.3) Jwenn non objè a nan DBCC PAGE

Kounye a nou konnen paj #70133 nan fichye done 3 a fè pati baz done WorldWideImporters. Nou ka gade sa ki nan paj sa a lè l sèvi avèk DBCC PAGE san papye ak trase drapo 3604.
Remak: Mwen prefere sèvi ak DBCC PAGE sou yon kopi restore soti nan yon backup yon kote sou yon lòt sèvè, paske li se yon bagay san papye. Nan kèk ka, li ka lakòz yon pil fatra ke yo te kreye (approx. tradiktè - lyen an, malerezman, pa mennen okenn kote, men jije pa url la, nou ap pale de endèks filtre).

/* This trace flag makes DBCC PAGE output go to our Messages tab
instead of the SQL Server Error Log file */
DBCC TRACEON (3604);
GO
/* DBCC PAGE (DatabaseName, FileNumber, PageNumber, DumpStyle)*/
DBCC PAGE ('WideWorldImporters',3,70133,2);
GO

Defile nan rezilta yo, ou ka jwenn object_id ak index_id.
Dechifre kle ak Page WaitResource nan enpas ak kadna
Preske fini! Koulye a, ou ka jwenn tab la ak non endèks lè l sèvi avèk rechèch la:

USE WideWorldImporters;
GO
SELECT 
    sc.name as schema_name, 
    so.name as object_name, 
    si.name as index_name
FROM sys.objects as so 
JOIN sys.indexes as si on 
    so.object_id=si.object_id
JOIN sys.schemas AS sc on 
    so.schema_id=sc.schema_id
WHERE 
    so.object_id = 94623380
    and si.index_id = 1;
GO

Epi kounye a nou wè ke datant fèmen an te sou endèks PK_Sales_OrderLines nan tab Sales.OrderLines.

Remak: Nan SQL Server 2014 ak pita, ou ka jwenn non objè a tou lè l sèvi avèk DMO san dokiman sys.dm_db_database_page_allocations. Men, ou gen rechèch chak paj nan baz done a, ki pa sanble trè fre pou baz done gwo, kidonk mwen te itilize DBCC PAGE.

1.4) Èske li posib pou wè done yo sou paj ki te bloke a?

Oke, wi. Men... èske ou sèten ke ou reyèlman bezwen li?
Li ralanti menm sou ti tab. Men, se yon ti kras fre, kidonk depi ou te li sa a lwen ... ann pale sou %%physloc%%!

%%physloc%% se yon moso maji san papye ki retounen yon idantifyan fizik pou chak antre. ou ka itilize %%physloc%% ansanm ak sys.fn_PhysLocFormatter nan SQL Server 2008 ak pi wo.

Kounye a ke nou konnen ke nou te vle fèmen paj la nan Sales.OrderLines, nou ka gade tout done ki nan tablo sa a, ki estoke nan dosye done #3 nan paj #70133, lè l sèvi avèk rechèch sa a:

Use WideWorldImporters;
GO
SELECT 
    sys.fn_PhysLocFormatter (%%physloc%%),
    *
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO

Tankou mwen te di, li ralanti menm sou ti tab. Mwen te ajoute NOLOCK nan demann lan paske nou toujou pa gen okenn garanti ke done nou vle gade yo se egzakteman menm jan li te ye lè kadna a te detekte - pou nou ka san danje fè lekti sal.
Men, Hurray, rechèch la retounen m 'menm 25 ranje yo pou ke rechèch nou an te goumen
Dechifre kle ak Page WaitResource nan enpas ak kadna
Ase sou PAGE kadna. E si nou ap tann yon KLE lock?

2) waitresource = "KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (Hash majik ki ka dechifre lè l sèvi avèk %%lockres%% si ou reyèlman vle sa)

Si demann ou an ap eseye fèmen yon dosye nan endèks la epi li fèmen tèt li, ou fini ak yon kalite adrès konplètman diferan.
Kraze "6:72057594041991168 (ce52f92a058c)" an pati, nou jwenn:

  • database_id = 6
  • hobt_id = 72057594041991168
  • hash majik = (ce52f92a058c)

2.1) Decrypt database_id

Sa a travay egzakteman menm jan ak egzanp ki anwo a! Jwenn non baz done a lè l sèvi avèk rechèch la:

SELECT 
    name 
FROM sys.databases 
WHERE database_id=6;
GO

Nan ka mwen an se toujou menm jan an DB WideWorldImporters.

2.2) Dechifre hobt_id

Nan kontèks baz done a jwenn, ou bezwen egzekite yon rechèch nan sys.partitions ak yon pè nan rantre ki pral ede detèmine non yo nan tab la ak endèks...

USE WideWorldImporters;
GO
SELECT 
    sc.name as schema_name, 
    so.name as object_name, 
    si.name as index_name
FROM sys.partitions AS p
JOIN sys.objects as so on 
    p.object_id=so.object_id
JOIN sys.indexes as si on 
    p.index_id=si.index_id and 
    p.object_id=si.object_id
JOIN sys.schemas AS sc on 
    so.schema_id=sc.schema_id
WHERE hobt_id = 72057594041991168;
GO

Li di m ke demann lan t ap tann sou aplikasyon an. Peyi fèmen lè l sèvi avèk endèks PK_Application_Countries.

2.3) Koulye a, yon ti kras majik %%lockres%% - si ou vle chèche konnen ki antre te fèmen

Si mwen reyèlman vle konnen ki ranje kadna a te sou, mwen ka chèche konnen lè mwen mande tab la tèt li. Nou ka sèvi ak fonksyon %%lockres%% san dokiman pou jwenn yon antre ki matche ak hash majik la.
Tanpri sonje ke rechèch sa a pral eskane tout tab la, epi sou tab gwo sa a ka pa plezi ditou:

SELECT
    *
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO

Mwen te ajoute NOLOCK (sou konsèy Klaus Aschenbrenner sou Twitter) paske blokaj ka vin yon pwoblèm. Nou jis vle gade sa ki la kounye a, epi yo pa sa ki te la lè tranzaksyon an te kòmanse - mwen pa panse ke konsistans done enpòtan pou nou.
Voila, dosye nou te goumen pou nou!
Dechifre kle ak Page WaitResource nan enpas ak kadna

Rekonesans ak plis lekti

Mwen pa sonje ki moun ki premye dekri anpil nan bagay sa yo, men isit la se de pòs sou bagay ki pi piti dokimante ke ou ta renmen:

Sous: www.habr.com

Add nouvo kòmantè