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.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.
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%% !
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.
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 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 !
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: