Decifrate Chjave è Pagina WaitResource in deadlocks è chjusi

Se aduprate u rapportu di prucessu bluccatu o recullate i grafici di bloccu furniti da SQL Server periodicamente, scuntrà cose cusì:

waitresource="PAGINA: 6:3:70133"

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

A volte, ci sarà più infurmazione in quellu XML giant chì studiate (i grafici di bloccu cuntenenu una lista di risorse chì aiutanu à truvà i nomi di l'ughjettu è l'indici), ma micca sempre.

Stu testu vi aiuterà à decifralli.

Tutte l'infurmazioni chì sò quì sò in Internet in parechji lochi, hè simplicemente assai distribuitu! Vogliu mette tuttu inseme, da DBCC PAGE à hobt_id à e funzioni non documentate %%physloc%% è %%lockres%%.

Prima, parlemu di l'attese nantu à i chjusi PAGE, è dopu passà à i chjusi KEY.

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

Se a vostra dumanda aspetta nantu à una serratura di PAGE, SQL Server vi darà l'indirizzu di quella pagina.

Rumpendu "PAGINA: 6:3:70133" avemu:

  • database_id = 6
  • data_file_id = 3
  • pagina_number = 70133

1.1) Decrypt database_id

Truvate u nome di a basa di dati cù a dumanda:

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

Hè publicu DB WideWorldImporters nantu à u mo SQL Server.

1.2) Cerchendu u nome di u schedariu di dati - se site interessatu

Avemu da aduprà data_file_id in u prossimu passu per truvà u nome di a tavola. Pudete solu saltà à u passu prossimu, ma se site interessatu in u nome di u schedariu, pudete truvà lu in eseguendu una dumanda in u cuntestu di a basa di dati truvata, sustituendu data_file_id in questa dumanda:

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

In a basa di dati WideWorldImporters hè un schedariu chjamatu WWI_UserData è l'aghju restauratu à C:MSSQLDATAWideWorldImporters_UserData.ndf. (Oops, m'avete pigliatu à mette i schedari nantu à l'unità di u sistema! No! Hè vergogna).

1.3) Ottene u nome di l'ughjettu da DBCC PAGE

Avà sapemu chì a pagina #70133 in datafile 3 appartene à a basa di dati WorldWideImporters. Pudemu guardà u cuntenutu di sta pagina usendu a PAGINA DBCC non documentata è a bandiera di traccia 3604.
Nota: Preferite aduprà DBCC PAGE nantu à una copia restaurata in un altru servitore, perchè hè roba senza documentu. In certi casi, ella pò purtà à un dump (ca. traduttore - u ligame, sfurtunatamenti, ùn porta nulla, ma à ghjudicà da l'url, parlemu di indici filtrati).

/* 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

Scrolling à i risultati, pudete truvà u object_id è index_id.
Decifrate Chjave è Pagina WaitResource in deadlocks è chjusi
Quasi finitu ! Avà pudete truvà a tabella è i nomi di l'indici cù una dumanda:

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

E quì vedemu chì l'aspittà nantu à a serratura era nantu à l'indice PK_Sales_OrderLines di a tavola Sales.OrderLines.

Nota: In SQL Server 2014 è sopra, u nome di l'ughjettu pò ancu esse truvatu cù u DMO non documentatu sys.dm_db_database_page_allocations. Ma avete da interrogà ogni pagina in a basa di dati, chì ùn pare micca assai bellu per basa di dati grande, cusì aghju utilizatu DBCC PAGE.

1.4) Hè pussibule di vede i dati nantu à a pagina chì hè stata bluccata?

Nuuu, sì. Ma ... sì sicuru chì avete veramente bisognu ?
Hè lentu ancu nantu à i picculi tavulini. Ma hè un pocu bellu, cusì postu chì avete lettu finu à quì... parlemu di %%physloc%% !

%%physloc%% hè un pezzu di magia senza documentu chì torna un ID fisicu per ogni entrata. pudete aduprà %%physloc%% cù sys.fn_PhysLocFormatter in SQL Server 2008 è superiore.

Avà chì sapemu chì vulemu bluccà a pagina in Sales.OrderLines, pudemu fighjà tutte e dati in questa tavula, chì hè guardatu in u schedariu di dati #3 in a pagina #70133, cù a seguente dumanda:

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

Cum'è aghju dettu, hè lentu ancu nantu à tavulini chjuchi. Aghju aghjustatu NOLOCK à a dumanda perchè ùn avemu sempre micca guaranzia chì i dati chì vulemu guardà sò esattamente u listessu ch'ellu era à u mumentu chì a serratura hè stata scuperta - cusì pudemu fà in modu sicuru letture brutte.
Ma, evviva, a dumanda mi torna e 25 fila per quale a nostra dumanda hà cumbattutu.
Decifrate Chjave è Pagina WaitResource in deadlocks è chjusi
Basta circa i blocchi PAGE. E s'è no aspettemu una serratura KEY?

2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (hash magicu chì pò esse decifratu cù %%lockres%% se vulete veramente)

Se a vostra dumanda prova di chjappà nantu à una voce d'indici è si chjude per sè stessu, uttene un tipu d'indirizzu completamente diversu.
Rumpendu "6: 72057594041991168 (ce52f92a058c)" in parti, avemu:

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

2.1) Decrypt database_id

Funziona esattamente u listessu cum'è cù l'esempiu sopra! Truvemu u nome di a basa di dati utilizendu a dumanda:

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

In u mo casu, hè u listessu DB WideWorldImporters.

2.2) Decrypt hobt_id

In u cuntestu di a basa di dati truvata, avete bisognu di query sys.partitions cù un coppiu di unisce chì aiutanu à determinà i nomi di a tabella è l'indici ...

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

Mi dice chì a dumanda era aspittendu nantu à l'Application.Countries lock using the PK_Application_Countries index.

2.3) Avà per qualchì %%lockres%% magia - se vulete sapè quale entrata hè stata chjusa

Se vogliu veramente sapè nantu à quale fila era necessariu a serratura, puderaghju scopre interrugandu a tavola stessa. Pudemu aduprà a funzione %%lockres%% indocumentata per truvà una entrata chì currisponde à l'hash magicu.
Nota chì sta dumanda scansarà tutta a tavula, è nantu à e tavulini grandi questu puderia micca esse divertente:

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

Aghju aghjustatu NOLOCK (nantu à u cunsigliu di Klaus Aschenbrenner in Twitter) perchè i chjusi ponu esse un prublema. Vulemu solu guardà ciò chì ci hè avà, è micca ciò chì era quandu a transazzione cuminciò - ùn pensu micca chì a coherenza di dati hè impurtante per noi.
Voila, u record per quale avemu luttatu !
Decifrate Chjave è Pagina WaitResource in deadlocks è chjusi

Ringraziamenti è più lettura

Ùn mi ricordu micca quellu chì hà descrittu prima parechje di queste cose, ma quì sò dui posti nantu à e cose menu documentate chì vi piacerebbe:

Source: www.habr.com

Add a comment