Iddeċifra Ċavetta u Page WaitResource f'deadlocks u serraturi

Jekk tuża r-rapport tal-proċess imblukkat jew tiġbor il-graffs tal-imblokk ipprovduti minn SQL Server perjodikament, tiltaqa 'ma' affarijiet bħal dawn:

waitresource=“PAĠNA: 6:3:70133“

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

Xi drabi jkun hemm aktar informazzjoni f'dak l-XML ġgant li qed tistudja (il-grafiċi tal-imblokk fihom lista ta' riżorsi li tgħinek issib l-ismijiet tal-oġġett u tal-indiċi), iżda mhux dejjem.

Dan it-test jgħinek tiddeċifrahom.

L-informazzjoni kollha li hawn tinsab fuq l-Internet f'diversi postijiet, hija biss imqassma ħafna! Irrid ngħaqqad kollox flimkien - minn PAĠNA DBCC għal hobt_id u għall-funzjonijiet mhux dokumentati %%physloc%% u %%lockres%%.

L-ewwel, ejja nitkellmu dwar tistenna fuq is-serraturi tal-PAĠNA, u mbagħad ngħaddu għal serraturi KEY.

1) waitresource=“PAĠNA: 6:3:70133” = Database_Id: FileId: PageNumber

Jekk il-mistoqsija tiegħek qed tistenna fuq lock PAĠNA, SQL Server jagħtik l-indirizz ta 'dik il-paġna.

Tkissir "PAĠNA: 6:3:70133" aħna jkollna:

  • database_id = 6
  • data_file_id = 3
  • numru_paġna = 70133

1.1) Iddecrypt database_id

Ejja nsibu l-isem tad-database billi tuża l-mistoqsija:

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

Dan huwa pubbliku DB WideWorldImporters fuq l-SQL Server tiegħi.

1.2) Tfittex l-isem tal-fajl tad-dejta - jekk inti interessat

Se nużaw data_file_id fil-pass li jmiss biex insibu l-isem tat-tabella. Tista 'sempliċement taqbeż għall-pass li jmiss, imma jekk inti interessat fl-isem tal-fajl, tista' ssibu billi tmexxi mistoqsija fil-kuntest tad-database misjuba, billi tissostitwixxi data_file_id f'din il-mistoqsija:

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

Fid-database WideWorldImporters dan huwa fajl imsejjaħ WWI_UserData u għandi restawrat għal C:MSSQLDATAWideWorldImporters_UserData.ndf. (Oops, qabadni npoġġi fajls fuq id-diska tas-sistema! Le! Dak kien skomdu).

1.3) Ikseb l-isem tal-oġġett minn PAĠNA DBCC

Issa nafu li l-paġna #70133 fil-fajl tad-dejta 3 tappartjeni għad-database WorldWideImporters. Nistgħu nħarsu lejn il-kontenut ta 'din il-paġna billi tuża l-PAĠNA DBCC mhux dokumentata u l-bandiera tat-traċċa 3604.
Nota: Nippreferi nuża DBCC PAGE fuq kopja restawrata minn backup x'imkien fuq server ieħor, għax hija ħaġa mhux dokumentata. F'xi każijiet, hi jista' jirriżulta fil-ħolqien ta' miżbla (madwar. traduttur - il-link, sfortunatament, ma twassal imkien, iżda jekk niġġudikaw mill-url, qed nitkellmu dwar indiċijiet iffiltrati).

/* 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 permezz tar-riżultati, tista 'ssib object_id u index_id.
Iddeċifra Ċavetta u Page WaitResource f'deadlocks u serraturi
Kważi lest! Issa tista' ssib it-tabella u l-ismijiet tal-indiċi billi tuża l-mistoqsija:

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

U issa naraw li l-istennija tal-lock kienet fuq l-indiċi PK_Sales_OrderLines tat-tabella Sales.OrderLines.

Nota: F'SQL Server 2014 u aktar tard, l-isem tal-oġġett jista' jinstab ukoll bl-użu tad-DMO mhux dokumentat sys.dm_db_database_page_allocations. Imma trid tfittex kull paġna fid-database, li ma tantx tidher friska għal databases kbar, għalhekk użajt DBCC PAGE.

1.4) Huwa possibbli li tara d-dejta fuq il-paġna li kienet imblukkata?

Ukoll, iva. Imma... żgur li għandek bżonnha tassew?
Huwa bil-mod anke fuq imwejjed żgħar. Iżda huwa tip ta 'frisk, allura peress li qrajt s'issa... ejja nitkellmu dwar %%physloc%%!

%%physloc%% hija biċċa maġija mhux dokumentata li tirritorna identifikatur fiżiku għal kull dħul. tista' tuża %%physloc%% flimkien ma' sys.fn_PhysLocFormatter f'SQL Server 2008 u ogħla.

Issa li nafu li ridna nissakkar il-paġna f'Sales.OrderLines, nistgħu nħarsu lejn id-dejta kollha f'din it-tabella, li hija maħżuna fil-fajl tad-dejta #3 fuq il-paġna #70133, billi tuża din il-mistoqsija:

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

Kif għedt, huwa bil-mod anke fuq imwejjed ċkejkna. Żidt NOLOCK mat-talba għax għad m’għandna l-ebda garanzija li d-dejta li rridu nħarsu lejha hija eżattament l-istess kif kienet meta nstab is-serratura – sabiex inkunu nistgħu nagħmlu qari maħmuġin b’mod sigur.
Iżda, hurra, il-mistoqsija tirritorna lili l-istess 25 ringiela li għalihom iġġieldet il-mistoqsija tagħna
Iddeċifra Ċavetta u Page WaitResource f'deadlocks u serraturi
Biżżejjed dwar il-paġni serraturi. X'jiġri jekk qed nistennew lock KEY?

2) waitresource=“KEY: 6:72057594041991168 (ce52f92a058c)” = Database_Id, HOBT_Id (magic hash li jista’ jiġi decrypted bl-użu ta’ %%lockres%% jekk verament trid dak)

Jekk il-mistoqsija tiegħek tipprova tissakkar rekord fl-indiċi u tissakkar innifsu, tispiċċa b'tip ta 'indirizz kompletament differenti.
Tkissir "6:72057594041991168 (ce52f92a058c)" f'partijiet, irridu:

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

2.1) Iddecrypt database_id

Dan jaħdem eżattament l-istess bħall-eżempju ta 'hawn fuq! Sib l-isem tad-database billi tuża l-mistoqsija:

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

Fil-każ tiegħi għadu l-istess DB WideWorldImporters.

2.2) Decrypt hobt_id

Fil-kuntest tad-database misjuba, għandek bżonn tesegwixxi mistoqsija lil sys.partitions b'par ta' tingħaqad li tgħin biex tiddetermina l-ismijiet tat-tabella u l-indiċi...

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

Jgħidli li t-talba kienet qed tistenna fuq l-Application.Countries lock billi tuża l-indiċi PK_Application_Countries.

2.3) Issa ftit magic %%lockres%% - jekk trid issir taf liema dħul kien imsakkar

Jekk verament irrid inkun naf liema ringiela kienet fuq is-serratura, nista' nsib billi nagħmel mistoqsija fuq it-tabella nnifisha. Nistgħu nużaw il-funzjoni mhux dokumentata %%lockres%% biex insibu dħul li taqbel mal-hash magic.
Jekk jogħġbok innota li din il-mistoqsija se tiskennja t-tabella kollha, u fuq tabelli kbar dan jista' ma jkun pjaċevoli xejn:

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

Żidt NOLOCK (fuq parir ta’ Klaus Aschenbrenner fuq Twitter) għax l-imblukkar jistgħu jsiru problema. Irridu biss inħarsu lejn dak li hemm issa, u mhux dak li kien hemm meta bdiet it-tranżazzjoni - ma naħsibx li l-konsistenza tad-dejta hija importanti għalina.
Voila, ir-rekord li ġġieldu għalih!
Iddeċifra Ċavetta u Page WaitResource f'deadlocks u serraturi

Rikonoxximenti u qari ulterjuri

Ma niftakarx min iddeskriva l-ewwel ħafna minn dawn l-affarijiet, iżda hawn żewġ postijiet dwar l-affarijiet l-inqas dokumentati li tista' tixtieq:

Sors: www.habr.com

Żid kumment