Decipher Key na Page WaitResource dina deadlocks na konci

Upami anjeun nganggo laporan prosés anu diblokir atanapi ngumpulkeun grafik deadlock anu disayogikeun ku SQL Server sacara périodik, anjeun bakal mendakan hal-hal sapertos kieu:

waitresource="KACA: 6:3:70133"

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

Sakapeung, bakal aya langkung seueur inpormasi dina XML raksasa anu anjeun pelajari (grafik deadlock ngandung daptar sumber anu ngabantosan anjeun mendakan nami objék sareng indéks), tapi henteu salawasna.

téks ieu bakal mantuan anjeun decipher aranjeunna.

Sadaya inpormasi anu aya di dieu aya dina Internét di sababaraha tempat, éta disebarkeun pisan! Abdi hoyong nempatkeun sadayana babarengan, ti DBCC PAGE mun hobt_id ka undocumented %% physloc%% jeung %% lockres%% fungsi.

Mimiti, hayu urang ngobrol ngeunaan ngantosan dina konci PAGE, teras teraskeun kana konci KUNCI.

1) waitresource = "KACA: 6: 3: 70133" = Database_Id: FileID: PageNumber

Upami pamundut anjeun ngantosan dina konci PAGE, SQL Server bakal masihan anjeun alamat halaman éta.

Ngarecah "HALAMAN: 6: 3: 70133" urang meunang:

  • id_database = 6
  • data_file_id = 3
  • kaca_nomer = 70133

1.1) Ngadékripsi id_database

Milarian nami pangkalan data nganggo pamundut:

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

Éta umum DB WideWorldImporters dina SQL Server abdi.

1.2) Pilari nami file data - upami anjeun resep

Urang bade nganggo data_file_id dina lengkah saterusna pikeun manggihan nami tabel. Anjeun ngan bisa skip kana lengkah saterusna, tapi lamun kabetot dina ngaran file, Anjeun bisa manggihan eta ku ngajalankeun query dina konteks database kapanggih, ngaganti data_file_id kana query ieu:

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

Dina database WideWorldImporters ieu file disebut WWI_UserData na mah geus disimpen deui ka C: MSSQLDATAWideWorldImporters_UserData.ndf. (Aduh, anjeun nyekel kuring nempatkeun file dina sistem drive! Henteu! Ieu ngerakeun).

1.3) Meunangkeun ngaran objék tina DBCC PAGE

Urang ayeuna terang yén halaman #70133 dina datafile 3 milik database WorldWideImporters. Urang tiasa ningali eusi halaman ieu nganggo DBCC PAGE anu teu didokumentasikeun sareng ngalacak bandéra 3604.
Catetan: Kuring leuwih resep ngagunakeun DBCC PAGE dina salinan disimpen wae dina server sejen, sabab éta barang undocumented. Dina sababaraha kasus, manéhna bisa ngakibatkeun dump a (kira-kira. penerjemah - link, hanjakalna, ngabalukarkeun nowhere, tapi ditilik ku url, urang ngobrol ngeunaan indexes disaring).

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

Ku ngagulung ka hasil, anjeun tiasa mendakan object_id sareng index_id.
Decipher Key na Page WaitResource dina deadlocks na konci
Ampir rengse! Ayeuna anjeun tiasa mendakan nami méja sareng indéks kalayan pamundut:

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

Sarta di dieu urang tingali yén antosan on konci éta dina indéks PK_Sales_OrderLines tina tabel Sales.OrderLines.

Catetan: Dina SQL Server 2014 sareng di luhur, nami obyék ogé tiasa dipendakan nganggo DMO sys.dm_db_database_page_allocations anu teu didokumentasikeun. Tapi anjeun kedah naroskeun unggal halaman dina pangkalan data, anu henteu katingali saé pikeun database ageung, janten kuring nganggo DBCC PAGE.

1.4) Naha mungkin ningali data dina halaman anu diblokir?

Nuhun, enya. Tapi… naha anjeun yakin yén anjeun peryogi pisan?
Ieu slow sanajan dina tabel leutik. Tapi éta rada keren, janten saprak anjeun parantos maca dugi ka ayeuna ... hayu urang ngobrol ngeunaan %%physloc%%!

%%physloc%% mangrupa sapotong undocumented magic nu mulih ID fisik pikeun tiap entri. anjeun tiasa nganggo %%physloc%% sareng sys.fn_PhysLocFormatter dina SQL Server 2008 sareng di luhur.

Ayeuna urang terang yén urang hoyong meungpeuk halaman dina Sales.OrderLines, urang tiasa ningali sadaya data dina tabel ieu, anu disimpen dina file data #3 dina halaman #70133, kalayan patarosan ieu:

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

Salaku Cenah mah, éta slow sanajan dina tabel leutik. Kuring nambihkeun NOLOCK kana pamundut sabab kami masih teu gaduh jaminan yén data anu urang hoyong tingali persis sami sareng waktos konci éta kapanggih - ku kituna urang tiasa aman ngalakukeun bacaan anu kotor.
Tapi, horee, query mulih kuring pisan 25 jajar nu query kami perang.
Decipher Key na Page WaitResource dina deadlocks na konci
Cukup ngeunaan konci PAGE. Kumaha upami urang ngantosan konci KUNCI?

2) waitresource = "KEY: 6: 72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (hash sihir anu tiasa didekripsi ku %% lockres%% upami anjeun hoyong)

Upami pamundut anjeun nyobian ngonci éntri indéks sareng dikonci nyalira, anjeun nampi jinis alamat anu béda.
Megatkeun "6: 72057594041991168 (ce52f92a058c)" kana bagian, urang meunang:

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

2.1) Ngadékripsi id_database

Gawéna persis sarua jeung conto di luhur! Kami mendakan nami pangkalan data nganggo pamundut:

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

Dina kasus kuring, éta sami DB WideWorldImporters.

2.2) Ngadekrip hobt_id

Dina kontéks pangkalan data anu kapendak, anjeun kedah naroskeun sys.partitions sareng sababaraha gabungan anu bakal ngabantosan nangtukeun nami tabel sareng indé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

Eta ngabejaan kuring yen pamundut ieu ngantosan on konci Application.Countries ngagunakeun indéks PK_Application_Countries.

2.3) Ayeuna pikeun sababaraha %%lockres%% sihir - upami anjeun hoyong terang éntri mana anu dikonci

Upami kuring hoyong terang dina barisan mana konci anu diperyogikeun, kuring tiasa mendakan ku naroskeun kana méja sorangan. Urang tiasa nganggo undocumented %% lockres%% fungsi pikeun manggihan entri nu cocog jeung Hash magic.
Catet yén pamundut ieu bakal nyeken sakabéh tabel, sarta dina tabel badag ieu bisa jadi teu senang pisan:

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

Abdi nambihan NOLOCK (on nasehat Klaus Aschenbrenner on twitter) sabab konci tiasa janten masalah. Kami ngan ukur hoyong ningali naon anu aya ayeuna, sareng sanés naon anu aya nalika urus dimimitian - kuring henteu nyangka yén konsistensi data penting pikeun urang.
Voila, catetan anu urang perjuangkeun!
Decipher Key na Page WaitResource dina deadlocks na konci

Pangakuan sareng bacaan salajengna

Abdi henteu émut saha anu mimiti ngajelaskeun seueur hal ieu, tapi ieu aya dua tulisan ngeunaan hal-hal anu pangsaeutikna didokumentasikeun anu anjeun resep:

sumber: www.habr.com

Tambahkeun komentar