Decipher Key na Page WaitResource katika kufuli na kufuli

Ukitumia ripoti ya mchakato uliozuiwa au kukusanya grafu za kufuli zinazotolewa na SQL Server mara kwa mara, utakumbana na mambo kama haya:

waitresource=“UKURASA: 6:3:70133“

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

Wakati mwingine kutakuwa na habari zaidi katika XML hiyo kubwa unayosoma (grafu zisizo na mwisho zina orodha ya nyenzo zinazokusaidia kujua kitu na majina ya faharisi), lakini sio kila wakati.

Maandishi haya yatakusaidia kuyafafanua.

Taarifa zote zilizo hapa ziko kwenye mtandao sehemu mbalimbali, zimesambazwa sana tu! Ninataka kuweka kila kitu pamoja - kutoka DBCC PAGE hadi hobt_id na hadi %%physloc%% na %%lockres%% kazi zisizo na hati.

Kwanza, hebu tuzungumze kuhusu kusubiri kwenye kufuli za PAGE, na kisha tutaendelea na kufuli KEY.

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

Ikiwa hoja yako inasubiri kwenye kufuli ya UKURASA, Seva ya SQL itakupa anwani ya ukurasa huo.

Kuchambua "UKURASA: 6:3:70133" tunapata:

  • kitambulisho_cha hifadhidata = 6
  • data_file_id = 3
  • page_numer = 70133

1.1) Simbua kitambulisho_cha hifadhidata

Wacha tupate jina la hifadhidata kwa kutumia hoja:

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

Hii ni ya umma DB WideWorldWaagizaji kwenye Seva yangu ya SQL.

1.2) Kutafuta jina la faili ya data - ikiwa una nia

Tutatumia data_file_id katika hatua inayofuata ili kupata jina la jedwali. Unaweza kuruka hatua inayofuata, lakini ikiwa una nia ya jina la faili, unaweza kuipata kwa kuendesha hoja katika muktadha wa hifadhidata iliyopatikana, kubadilisha data_file_id katika swali hili:

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

Katika hifadhidata ya WideWorldImporters hili ni faili linaloitwa WWI_UserData na nimeirejesha kuwa C:MSSQLDATAWideWorldImporters_UserData.ndf. (Lo, ulinikamata nikiweka faili kwenye diski ya mfumo! Hapana! Hiyo ilikuwa shida).

1.3) Pata jina la kitu kutoka kwa DBCC PAGE

Sasa tunajua kwamba ukurasa #70133 katika faili ya data 3 ni wa hifadhidata ya WorldWideImporters. Tunaweza kuangalia yaliyomo kwenye ukurasa huu kwa kutumia DBCC PAGE isiyo na hati na kufuatilia bendera 3604.
Kumbuka: Ninapendelea kutumia DBCC PAGE kwenye nakala iliyorejeshwa kutoka kwa nakala rudufu mahali pengine kwenye seva nyingine, kwa sababu ni kitu kisicho na hati. Katika baadhi ya matukio, yeye inaweza kusababisha dampo kuundwa (takriban. mtafsiri - kiunga, kwa bahati mbaya, hakielekezi popote, lakini kwa kuangalia url, tunazungumza juu ya faharisi zilizochujwa.).

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

Kupitia matokeo, unaweza kupata object_id na index_id.
Decipher Key na Page WaitResource katika kufuli na kufuli
Karibu kumaliza! Sasa unaweza kupata jedwali na majina ya faharisi kwa kutumia swali:

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

Na sasa tunaona kwamba kusubiri kwa kufuli kulikuwa kwenye faharasa ya PK_Sales_OrderLines ya jedwali la Sales.OrderLines.

Kumbuka: Katika SQL Server 2014 na baadaye, jina la kitu pia linaweza kupatikana kwa kutumia DMO sys.dm_db_database_page_allocations isiyo na kumbukumbu. Lakini lazima uulize kila ukurasa kwenye hifadhidata, ambayo haionekani kuwa nzuri sana kwa hifadhidata kubwa, kwa hivyo nilitumia DBCC PAGE.

1.4) Je, inawezekana kuona data kwenye ukurasa ambao ulizuiwa?

Naam, ndiyo. Lakini ... una uhakika kwamba unahitaji kweli?
Ni polepole hata kwenye meza ndogo. Lakini ni vizuri, kwa hivyo kwa kuwa umesoma hadi hapa ... wacha tuzungumze kuhusu %%physloc%%!

%%physloc%% ni sehemu ya uchawi isiyo na hati ambayo hurejesha kitambulisho halisi kwa kila ingizo. unaweza kutumia %%physloc%% pamoja na sys.fn_PhysLocFormatter katika SQL Server 2008 na matoleo mapya zaidi.

Kwa kuwa sasa tunajua kuwa tulitaka kufunga ukurasa katika Sales.OrderLines, tunaweza kuangalia data yote katika jedwali hili, ambayo imehifadhiwa katika faili ya data #3 kwenye ukurasa #70133, kwa kutumia hoja hii:

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

Kama nilivyosema, ni polepole hata kwenye meza ndogo. Niliongeza NOLOCK kwa ombi kwa sababu bado hatuna hakikisho kwamba data tunayotaka kuangalia ni sawa na ilivyokuwa wakati kufuli iligunduliwa - kwa hivyo tunaweza kufanya usomaji chafu kwa usalama.
Lakini, haraka, swali linanirudishia safu 25 zile zile ambazo swali letu lilipigania.
Decipher Key na Page WaitResource katika kufuli na kufuli
Inatosha kuhusu kufuli za PAGE. Je, ikiwa tunangojea kufuli ya UFUNGUO?

2) waitresource=“KEY: 6:72057594041991168 (ce52f92a058c)” = Database_Id, HOBT_Id (heshi ya kichawi inayoweza kusimbwa kwa kutumia %%lockres%% ikiwa kweli unataka hiyo)

Ikiwa hoja yako itajaribu kufunga rekodi kwenye faharasa na kujifungia yenyewe, utaishia na aina tofauti kabisa ya anwani.
Kuvunja "6:72057594041991168 (ce52f92a058c)" katika sehemu, tunapata:

  • kitambulisho_cha hifadhidata = 6
  • hobt_id = 72057594041991168
  • uchawi hashi = (ce52f92a058c)

2.1) Simbua kitambulisho_cha hifadhidata

Hii inafanya kazi sawa na mfano hapo juu! Tafuta jina la hifadhidata kwa kutumia hoja:

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

Katika kesi yangu bado ni sawa DB WideWorldWaagizaji.

2.2) Simbua hobt_id

Katika muktadha wa hifadhidata iliyopatikana, unahitaji kutekeleza swali kwa sys.partitions na jozi ya viungio ambavyo vitasaidia kuamua majina ya jedwali na faharasa...

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

Inaniambia kuwa ombi lilikuwa likisubiriwa kwenye Application.Nchi hufunga kwa kutumia faharasa ya PK_Application_Countries.

2.3) Sasa uchawi kidogo %%lockres%% - ikiwa unataka kujua ni kiingilio gani kilifungwa.

Ikiwa ninataka kujua ni safu gani ambayo kufuli ilikuwa imewashwa, naweza kujua kwa kuuliza jedwali lenyewe. Tunaweza kutumia chaguo la kukokotoa la %%lockres%% ambalo halina hati ili kupata ingizo linalolingana na heshi ya uchawi.
Tafadhali kumbuka kuwa swali hili litachanganua jedwali zima, na kwenye jedwali kubwa hii inaweza isifurahishe hata kidogo:

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

Nimeongeza NOLOCK (kwa ushauri wa Klaus Aschenbrenner kwenye Twitter) kwa sababu vizuizi vinaweza kuwa shida. Tunataka tu kuangalia ni nini sasa, na sio kile kilichokuwepo wakati shughuli ilianza - sidhani kama uthabiti wa data ni muhimu kwetu.
Voila, rekodi tuliyopigania!
Decipher Key na Page WaitResource katika kufuli na kufuli

Shukrani na kusoma zaidi

Sikumbuki ni nani aliyeelezea mengi ya mambo haya kwanza, lakini hapa kuna machapisho mawili kuhusu vitu visivyo na kumbukumbu ambavyo unaweza kupenda:

Chanzo: mapenzi.com

Kuongeza maoni