Famaritana ny lakile sy ny pejy WaitResource amin'ny fiatoana sy hidy

Raha mampiasa ny tatitra momba ny dingana voasakana ianao na manangona ireo grafika tsy misy fepetra omen'ny SQL Server tsindraindray, dia hahita zavatra toy izao ianao:

waitresource=β€œPEJY: 6:3:70133”

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

Indraindray dia hisy fampahalalana bebe kokoa ao amin'io XML goavambe ianaranao io (ny grafika maty paika dia misy lisitry ny loharano manampy anao hahita ny zavatra sy ny anaran'ny fanondroana), fa tsy foana.

Ity lahatsoratra ity dia hanampy anao hamantatra azy ireo.

Ny vaovao rehetra eto dia ao amin'ny Internet any amin'ny toerana samihafa, zaraina be fotsiny! Te-hametraka ny zava-drehetra aho - manomboka amin'ny DBCC PAGE ka hatramin'ny hobt_id ary amin'ny asa %%physloc%% sy %%lockres%% tsy misy taratasy.

Voalohany, andeha isika hiresaka momba ny fiandrasana amin'ny hidin'ny PAGE, ary avy eo dia hifindra any amin'ny KEY hidin-trano.

1) waitresource = "PEJY: 6: 3: 70133" = Id_database: FileId: PageNumber

Raha miandry amin'ny hidin'ny PAGE ny fanontanianao dia hanome anao ny adiresin'io pejy io ny SQL Server.

Ny fandravana ny "PEJY: 6: 3: 70133" dia mahazo:

  • database_id = 6
  • data_file_id = 3
  • pejy_isa = 70133

1.1) Decrypt database_id

Andeha hojerentsika ny anaran'ny database amin'ny fampiasana ny fangatahana:

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

Ampahibemaso izany DB WideWorldImporters amin'ny SQL Server-ko.

1.2) Mitady ny anaran'ny rakitra data - raha liana ianao

Hampiasa data_file_id isika amin'ny dingana manaraka hahitana ny anaran'ny latabatra. Azonao atao ny mitsambikina fotsiny amin'ny dingana manaraka, fa raha liana amin'ny anaran'ny rakitra ianao dia afaka mahita izany amin'ny alΓ lan'ny fampandehanana fanontaniana amin'ny tontolon'ny angon-drakitra hita, manolo ny data_file_id amin'ity fangatahana ity:

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

Ao amin'ny tahiry WideWorldImporters ity dia rakitra iray antsoina hoe WWI_UserData ary naverina tamin'ny C:MSSQLDATAWideWorldImporters_UserData.ndf. (Oay, tratranao nametraka rakitra teo amin'ny kapila rafitra aho! Tsia! Sahiran-tsaina izany).

1.3) Raiso ny anaran'ny zavatra avy amin'ny DBCC PAGE

Fantatray izao fa ny pejy #70133 ao amin'ny rakitra data 3 dia an'ny tahiry WorldWideImporters. Azontsika jerena ny votoatin'ity pejy ity amin'ny fampiasana ny DBCC PAGE tsy misy taratasy sy ny sainam-pirenena 3604.
Fanamarihana: Aleoko mampiasa DBCC PAGE amin'ny kopia naverina avy amin'ny backup any amin'ny toerana hafa amin'ny mpizara hafa, satria zavatra tsy misy taratasy izany. Amin'ny toe-javatra sasany, izy mety hiteraka fanariam-pako (eo ho eo mpandika teny - ny rohy, indrisy, tsy mitondra mankaiza, fa raha tsaraina amin'ny url, dia miresaka momba ny fanondroana voasivana isika).

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

Rehefa mikoriana amin'ny valiny ianao dia afaka mahita object_id sy index_id.
Famaritana ny lakile sy ny pejy WaitResource amin'ny fiatoana sy hidy
Efa ho vita! Azonao atao izao ny mahita ny anaran'ny latabatra sy ny index amin'ny alΓ lan'ny fangatahana:

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

Ary ankehitriny hitantsika fa ny fiandrasana hidin-trano dia tao amin'ny tondro PK_Sales_OrderLines an'ny latabatra Sales.OrderLines.

Fanamarihana: Ao amin'ny SQL Server 2014 sy aoriana, ny anaran'ny zavatra dia azo jerena amin'ny fampiasana ny DMO sys.dm_db_database_page_allocations tsy misy taratasy. Saingy tsy maintsy manontany ny pejy rehetra ao amin'ny database ianao, izay tsy dia mahafinaritra loatra amin'ny angon-drakitra lehibe, ka nampiasa DBCC PAGE aho.

1.4) Azo atao ve ny mahita ny angon-drakitra ao amin'ny pejy voasakana?

Eny, eny. Saingy... azonao antoka ve fa tena ilainao izany?
Miadana na eny ambony latabatra kely aza. Fa somary mangatsiatsiaka ihany, ka hatramin'ny namakianao hatramin'izao... %%physloc%% no resahina!

%%physloc%% dia ody tsy misy taratasy izay mamerina famantarana ara-batana ho an'ny fidirana tsirairay. azonao ampiasaina %%physloc%% miaraka amin'ny sys.fn_PhysLocFormatter amin'ny SQL Server 2008 sy ambony.

Rehefa fantatray izao fa te hanidy ny pejy ao amin'ny Sales.OrderLines izahay dia afaka mijery ny angona rehetra ato amin'ity tabilao ity, izay voatahiry ao amin'ny rakitra data #3 amin'ny pejy #70133, amin'ny fampiasana ity fanontaniana ity:

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

Araka ny nolazaiko dia miadana na dia amin'ny latabatra kely aza. Nampiako NOLOCK ny fangatahana satria mbola tsy manana antoka izahay fa ny angon-drakitra tiana hojerena dia mitovy tanteraka amin'ny fotoana nahitana ny hidin-trano - mba hahafahanay manao vakiteny maloto.
Saingy, indrisy, ny andalana 25 mitovy amin'izay niadian'ny fanontanianay no naverin'ilay fanontaniana tamiko
Famaritana ny lakile sy ny pejy WaitResource amin'ny fiatoana sy hidy
Ampy izay ny hidin'ny PAGE. Ahoana raha miandry hidy KEY isika?

2) waitresource = "KEY: 6: 72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (hash majika izay azo alaina amin'ny fampiasana %% lockres%% raha tena tianao izany)

Raha manandrana manidy rakitsoratra ao amin'ny fanondroana ny fanontanianao ary voahidy ny tenany, dia manana karazana adiresy hafa tanteraka ianao.
Manapaka ny "6:72057594041991168 (ce52f92a058c)" ho ampahany, dia mahazo:

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

2.1) Decrypt database_id

Mitovy tanteraka amin'ny ohatra etsy ambony io! Tadiavo ny anaran'ny angon-drakitra mampiasa ny fangatahana:

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

Raha ny ahy dia mbola mitovy ihany DB WideWorldImporters.

2.2) Decrypt hobt_id

Ao anatin'ny tontolon'ny angon-drakitra hita, mila manatanteraka fanontaniana amin'ny sys.partitions ianao miaraka amin'ny fiaraha-miasa roa izay hanampy amin'ny famaritana ny anaran'ny latabatra sy ny index...

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

Lazainy amiko fa miandry eo amin'ny Application.Countries hidin-trano ny fangatahana mampiasa ny PK_Application_Countries index.

2.3) Ankehitriny majika kely %%lockres%% - raha te-hahafantatra izay fidirana ianao

Raha tena te-hahafantatra aho hoe aiza no nisy ny hidin-trano, dia azoko fantarina amin'ny alalan'ny fanontaniako ny latabatra mihitsy. Azontsika ampiasaina ny fiasa %%lockres%% tsy misy taratasy hitadiavana fidirana mifanaraka amin'ny hash majika.
Mariho fa ity fanontaniana ity dia hijery ny latabatra manontolo, ary amin'ny latabatra lehibe dia mety tsy hahafinaritra mihitsy izany:

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

Nampiako NOLOCK (amin'ny torohevitr'i Klaus Aschenbrenner ao amin'ny Twitter) satria mety ho lasa olana ny fanakanana. Te-hijery fotsiny izay misy amin'izao fotoana izao izahay, fa tsy izay teo tamin'ny nanombohan'ny fifampiraharahana - tsy heveriko fa zava-dehibe amintsika ny tsy fitovian'ny angon-drakitra.
Voila, ny rakitsoratra niadianay!
Famaritana ny lakile sy ny pejy WaitResource amin'ny fiatoana sy hidy

Fisaorana sy famakiana fanampiny

Tsy tadidiko hoe iza no namaritra voalohany ny ankamaroan'ireo zavatra ireo, fa ireto misy lahatsoratra roa momba ny zavatra kely indrindra voarakitra mety ho tianao:

Source: www.habr.com

Add a comment