Decipher Key ug Page WaitResource sa mga deadlock ug mga kandado

Kung gigamit nimo ang gibabagan nga report sa proseso o gikolekta ang mga deadlock graph nga gihatag sa SQL Server matag karon ug unya, makasugat ka og mga butang nga sama niini:

waitresource="PAGE: 6:3:70133"

waitresource=β€œKEY: 6:72057594041991168 (ce52f92a058c)β€œ

Usahay, adunay daghang impormasyon sa higanteng XML nga imong gitun-an (ang deadlock graphs adunay listahan sa mga kapanguhaan nga makatabang kanimo sa pagpangita sa mga ngalan sa butang ug indeks), apan dili kanunay.

Kini nga teksto makatabang kanimo sa paghubad niini.

Ang tanan nga kasayuran nga ania dinhi naa sa Internet sa lainlaing mga lugar, giapod-apod ra kaayo! Gusto nakong iusa kining tanan, gikan sa DBCC PAGE ngadto sa hobt_id ngadto sa undocumented %%physloc%% ug %%lockres%% functions.

Una, atong hisgotan ang mga paghulat sa PAGE lock, ug dayon mopadayon sa KEY lock.

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

Kung ang imong hangyo naghulat sa usa ka lock sa PAGE, ang SQL Server maghatag kanimo sa adres sa kana nga panid.

Ang pagbungkag sa "PANID: 6: 3: 70133" atong makuha:

  • database_id = 6
  • data_file_id = 3
  • panid_numero = 70133

1.1) Pag-decrypt sa database_id

Pangitaa ang ngalan sa database gamit ang pangutana:

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

Kini publiko DB WideWorld Importers sa akong SQL Server.

1.2) Pangitaa ang ngalan sa data file - kung interesado ka

Atong gamiton ang data_file_id sa sunod nga lakang aron makit-an ang ngalan sa lamesa. Mahimo ka lang molaktaw sa sunod nga lakang, apan kung interesado ka sa ngalan sa file, makit-an nimo kini pinaagi sa pagpadagan sa usa ka pangutana sa konteksto sa nakit-an nga database, ilisan ang data_file_id sa kini nga pangutana:

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

Sa WideWorldImporters database kini usa ka file nga gitawag WWI_UserData ug gipahiuli nako kini sa C:MSSQLDATAWideWorldImporters_UserData.ndf. (Oops, nasakpan ko nimo nga nagbutang og mga file sa system drive! Dili! Makauulaw).

1.3) Kuhaa ang ngalan sa butang gikan sa DBCC PAGE

Nahibal-an na namon nga ang panid #70133 sa datafile 3 iya sa database sa WorldWideImporters. Atong tan-awon ang sulod niini nga panid gamit ang undocumented DBCC PAGE ug trace flag 3604.
Mubo nga sulat: Gipalabi nako ang paggamit sa DBCC PAGE sa usa ka gipahiuli nga kopya sa usa ka lugar sa lain nga server, tungod kay kini wala’y dokumento. Sa pipila ka mga kaso, siya mahimong moresulta sa usa ka dump (gibanabana. tighubad - ang link, sa walay palad, wala magdala bisan asa, apan sa paghukom sa url, naghisgot kami bahin sa nasala nga mga indeks).

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

Pinaagi sa pag-scroll sa mga resulta, makit-an nimo ang object_id ug index_id.
Decipher Key ug Page WaitResource sa mga deadlock ug mga kandado
Hapit na mahuman! Karon makit-an nimo ang lamesa ug mga ngalan sa indeks nga adunay pangutana:

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

Ug dinhi atong makita nga ang paghulat sa lock anaa sa PK_Sales_OrderLines index sa Sales.OrderLines nga lamesa.

Mubo nga sulat: Sa SQL Server 2014 ug sa ibabaw, ang ngalan sa butang makita usab gamit ang dili dokumentado nga DMO sys.dm_db_database_page_allocations. Apan kinahanglan nimong pangutan-on ang matag panid sa database, nga dili kaayo nindot tan-awon alang sa dagkong mga database, mao nga gigamit nako ang DBCC PAGE.

1.4) Posible bang makita ang datos sa panid nga gibabagan?

Nuuu, oo nga. Apan… sigurado ka ba nga kinahanglan nimo kini?
Kini hinay bisan sa gagmay nga mga lamesa. Apan kini medyo cool, mao nga sukad nabasa nimo kini hangtod karon ... maghisgot kita bahin sa %%physloc%%!

Ang %%physloc%% usa ka dili dokumentado nga piraso sa salamangka nga nagbalik ug pisikal nga ID para sa matag entry. magamit nimo %%physloc%% uban sa sys.fn_PhysLocFormatter sa SQL Server 2008 ug sa ulahi.

Karon nga nahibal-an namon nga gusto namon nga babagan ang panid sa Sales.OrderLines, mahimo namon tan-awon ang tanan nga datos sa kini nga lamesa, nga gitipigan sa data file #3 sa panid #70133, nga adunay mosunod nga pangutana:

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

Sama sa akong giingon, kini hinay bisan sa gagmay nga mga lamesa. Gidugangan nako ang NOLOCK sa hangyo tungod kay wala pa kami garantiya nga ang datos nga gusto namon tan-awon parehas ra sa panahon nga nadiskubre ang kandado - aron luwas nga mahimo naton ang mga hugaw nga pagbasa.
Apan, hooray, ang pangutana nagbalik kanako sa 25 ka laray nga giawayan sa among pangutana.
Decipher Key ug Page WaitResource sa mga deadlock ug mga kandado
Igo na mahitungod sa PAGE lock. Unsa kaha kung naghulat kami sa usa ka KEY lock?

2) waitresource = "KEY: 6: 72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (magic hash nga mahimong ma-decrypt sa %%lockres%% kung gusto nimo)

Kung ang imong pangutana mosulay sa pag-lock sa usa ka index entry ug ma-lock sa kaugalingon, makakuha ka usa ka lahi nga tipo sa adres.
Pagbungkag sa "6:72057594041991168 (ce52f92a058c)" sa mga bahin, makuha namon:

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

2.1) Pag-decrypt sa database_id

Kini molihok nga parehas sa pananglitan sa ibabaw! Atong makita ang ngalan sa database gamit ang pangutana:

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

Sa akong kaso, parehas ra DB WideWorld Importers.

2.2) I-decrypt ang hobt_id

Sa konteksto sa nakit-an nga database, kinahanglan nimo nga pangutan-on ang sys.partitions nga adunay usa ka pares nga pag-apil nga makatabang sa pagtino sa mga ngalan sa lamesa ug indeks ...

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

Kini nagsulti kanako nga ang hangyo naghulat sa Application.Countries lock gamit ang PK_Application_Countries index.

2.3) Karon alang sa pipila ka %%lockres%% magic - kung gusto nimo mahibal-an kung unsang entry ang gi-lock

Kung gusto gyud nako mahibal-an kung unsang laray ang gikinahanglan sa kandado, mahibal-an nako pinaagi sa pagpangutana sa lamesa mismo. Magamit namo ang undocumented %%lockres%% function para mangita ug entry nga mohaum sa magic hash.
Timan-i nga kini nga pangutana mag-scan sa tibuuk nga lamesa, ug sa dagkong mga lamesa mahimo’g dili kini makalingaw:

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

Gidugang nako ang NOLOCK (sa tambag ni Klaus Aschenbrenner sa twitter) tungod kay ang mga kandado mahimong usa ka problema. Gusto lang namon nga tan-awon kung unsa ang naa karon, ug dili kung unsa ang naa sa pagsugod sa transaksyon - Wala ako maghunahuna nga ang pagkamakanunayon sa datos hinungdanon kanamo.
Voila, ang rekord nga among giawayan!
Decipher Key ug Page WaitResource sa mga deadlock ug mga kandado

Mga pagpasalamat ug dugang nga pagbasa

Wala ko kahinumdom kung kinsa ang unang naghulagway sa daghan niini nga mga butang, apan ania ang duha ka mga post mahitungod sa pinakagamay nga dokumentado nga mga butang nga gusto nimo:

Source: www.habr.com

Idugang sa usa ka comment