டெட்லாக்ஸ் மற்றும் லாக்குகளில் டிசிஃபர் கீ மற்றும் பேஜ் வெயிட் ரிசோர்ஸ்

நீங்கள் தடுக்கப்பட்ட செயல்முறை அறிக்கையைப் பயன்படுத்தினால் அல்லது SQL சர்வரால் வழங்கப்பட்ட டெட்லாக் வரைபடங்களை அவ்வப்போது சேகரித்தால், இது போன்ற விஷயங்களை நீங்கள் சந்திப்பீர்கள்:

waitresource="பக்கம்: 6:3:70133"

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

சில நேரங்களில், நீங்கள் படிக்கும் அந்த மாபெரும் எக்ஸ்எம்எல்லில் கூடுதல் தகவல்கள் இருக்கும் (முட்டுக்கட்டை வரைபடங்களில் பொருள் மற்றும் குறியீட்டின் பெயர்களைக் கண்டறிய உதவும் ஆதாரங்களின் பட்டியல் உள்ளது), ஆனால் எப்போதும் இல்லை.

அவற்றைப் புரிந்துகொள்ள இந்த உரை உங்களுக்கு உதவும்.

இங்கே இருக்கும் அனைத்து தகவல்களும் இணையத்தில் பல்வேறு இடங்களில் உள்ளன, இது மிகவும் விநியோகிக்கப்படுகிறது! DBCC PAGE முதல் hobt_id வரை ஆவணப்படுத்தப்படாத %%physloc%% மற்றும் %%lockres%% செயல்பாடுகள் வரை அனைத்தையும் ஒன்றாக இணைக்க விரும்புகிறேன்.

முதலில், PAGE பூட்டுகளில் காத்திருப்புகளைப் பற்றி பேசலாம், பின்னர் KEY பூட்டுகளுக்கு செல்லலாம்.

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

உங்கள் கோரிக்கை ஒரு PAGE பூட்டில் காத்திருந்தால், SQL சேவையகம் அந்த பக்கத்தின் முகவரியை உங்களுக்கு வழங்கும்.

"பக்கம்: 6:3:70133"ஐ உடைத்தால், நமக்குக் கிடைக்கும்:

  • தரவுத்தள_ஐடி = 6
  • data_file_id = 3
  • பக்கம்_எண் = 70133

1.1) தரவுத்தள_ஐடியை மறைகுறியாக்கவும்

வினவலைப் பயன்படுத்தி தரவுத்தளத்தின் பெயரைக் கண்டறியவும்:

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

இது பொது DB WideWorldImporters எனது SQL சேவையகத்தில்.

1.2) தரவுக் கோப்பின் பெயரைத் தேடுகிறது - நீங்கள் ஆர்வமாக இருந்தால்

அட்டவணையின் பெயரைக் கண்டறிய அடுத்த கட்டத்தில் data_file_id ஐப் பயன்படுத்தப் போகிறோம். நீங்கள் அடுத்த படிக்குச் செல்லலாம், ஆனால் நீங்கள் கோப்பு பெயரில் ஆர்வமாக இருந்தால், கண்டுபிடிக்கப்பட்ட தரவுத்தளத்தின் சூழலில் வினவலை இயக்குவதன் மூலம் அதைக் கண்டறியலாம், இந்த வினவலில் data_file_id ஐ மாற்றவும்:

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

WideWorldImporters தரவுத்தளத்தில் இது WWI_UserData எனப்படும் கோப்பு மற்றும் நான் அதை C:MSSQLDATAWideWorldImporters_UserData.ndf க்கு மீட்டமைத்துள்ளேன். (அச்சச்சோ, சிஸ்டம் டிரைவில் ஃபைல்களைப் போடுவதைப் பிடித்துவிட்டீர்கள்! இல்லை! சங்கடமாக இருக்கிறது).

1.3) DBCC பக்கத்திலிருந்து பொருளின் பெயரைப் பெறவும்

தரவுக் கோப்பு 70133 இல் உள்ள #3 பக்கம் WorldWideImporters தரவுத்தளத்திற்குச் சொந்தமானது என்பதை இப்போது நாம் அறிவோம். ஆவணப்படுத்தப்படாத DBCC PAGE ஐப் பயன்படுத்தி இந்தப் பக்கத்தின் உள்ளடக்கங்களைப் பார்க்கலாம் மற்றும் கொடி 3604 என்பதைக் கண்டறியலாம்.
குறிப்பு: DBCC PAGE ஐ வேறொரு சர்வரில் எங்காவது மீட்டமைக்கப்பட்ட நகலில் பயன்படுத்த விரும்புகிறேன், ஏனெனில் இது ஆவணமற்றது. சில சந்தர்ப்பங்களில், அவள் ஒரு திணிப்பு ஏற்படலாம் (தோராயமாக மொழிபெயர்ப்பாளர் - இணைப்பு, துரதிருஷ்டவசமாக, எங்கும் வழிவகுக்கவில்லை, ஆனால் url மூலம் ஆராயும்போது, ​​வடிகட்டப்பட்ட குறியீடுகளைப் பற்றி பேசுகிறோம்).

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

முடிவுகளுக்கு ஸ்க்ரோலிங் செய்வதன் மூலம், object_id மற்றும் index_id ஆகியவற்றைக் கண்டறியலாம்.
டெட்லாக்ஸ் மற்றும் லாக்குகளில் டிசிஃபர் கீ மற்றும் பேஜ் வெயிட் ரிசோர்ஸ்
கிட்டத்தட்ட முடிந்து விட்டது! இப்போது நீங்கள் அட்டவணை மற்றும் குறியீட்டு பெயர்களை வினவலில் காணலாம்:

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

விற்பனை.OrderLines அட்டவணையின் PK_Sales_OrderLines குறியீட்டில் பூட்டுக்கான காத்திருப்பு இருந்ததை இங்கே காண்கிறோம்.

குறிப்பு: SQL சர்வர் 2014 மற்றும் அதற்கு மேற்பட்டவற்றில், ஆவணமற்ற DMO sys.dm_db_database_page_allocations ஐப் பயன்படுத்தி பொருளின் பெயரையும் காணலாம். ஆனால் தரவுத்தளத்தில் உள்ள ஒவ்வொரு பக்கத்தையும் நீங்கள் வினவ வேண்டும், இது பெரிய தரவுத்தளங்களுக்கு மிகவும் அழகாகத் தெரியவில்லை, எனவே நான் DBCC பக்கத்தைப் பயன்படுத்தினேன்.

1.4) தடுக்கப்பட்ட பக்கத்தில் தரவைப் பார்க்க முடியுமா?

நூவ், ஆம். ஆனால்... உங்களுக்கு உண்மையிலேயே இது தேவையா?
சிறிய மேசைகளில் கூட மெதுவாக இருக்கும். ஆனால் இது ஒருவித அருமை, எனவே நீங்கள் இதுவரை படித்ததிலிருந்து...%%physloc%% பற்றி பேசலாம்!

%%physloc%% என்பது ஒவ்வொரு நுழைவுக்கும் ஒரு இயற்பியல் ஐடியை வழங்கும் ஆவணப்படுத்தப்படாத மாயமாகும். நீங்கள் பயன்படுத்த முடியும் SQL சர்வர் 2008 மற்றும் அதற்கு மேல் உள்ள sys.fn_PhysLocFormatter உடன் %%physloc%%.

Sales.OrderLines இல் பக்கத்தைத் தடுக்க விரும்புகிறோம் என்பதை இப்போது அறிந்துள்ளோம், இந்த அட்டவணையில் உள்ள எல்லா தரவையும் பார்க்கலாம், இது பக்கம் #3 இல் உள்ள தரவுக் கோப்பில் #70133 இல் சேமிக்கப்பட்டுள்ளது, பின்வரும் வினவலுடன்:

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

நான் சொன்னது போல், சிறிய மேசைகளில் கூட மெதுவாக இருக்கும். கோரிக்கையில் NOLOCK ஐச் சேர்த்தேன், ஏனென்றால் நாங்கள் பார்க்க விரும்பும் தரவு, பூட்டு கண்டுபிடிக்கப்பட்ட நேரத்தில் இருந்ததைப் போலவே இருக்கும் என்பதற்கு எங்களிடம் எந்த உத்தரவாதமும் இல்லை - எனவே நாங்கள் அழுக்குப் படிக்காமல் பாதுகாப்பாகச் செய்யலாம்.
ஆனால், ஹூரே, எங்கள் வினவல் போராடிய 25 வரிசைகளை வினவல் எனக்கு வழங்குகிறது.
டெட்லாக்ஸ் மற்றும் லாக்குகளில் டிசிஃபர் கீ மற்றும் பேஜ் வெயிட் ரிசோர்ஸ்
PAGE பூட்டுகளைப் பற்றி போதுமானது. நாம் ஒரு முக்கிய பூட்டுக்காக காத்திருந்தால் என்ன செய்வது?

2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (நீங்கள் உண்மையிலேயே விரும்பினால் %%lockres%% உடன் மறைகுறியாக்கக்கூடிய மேஜிக் ஹாஷ்)

உங்கள் வினவல் குறியீட்டு உள்ளீட்டில் பூட்ட முயற்சித்து, தானாகவே பூட்டப்பட்டால், நீங்கள் முற்றிலும் மாறுபட்ட முகவரியைப் பெறுவீர்கள்.
“6:72057594041991168 (ce52f92a058c)”ஐப் பகுதிகளாகப் பிரித்தால், நமக்குக் கிடைக்கும்:

  • தரவுத்தள_ஐடி = 6
  • hobt_id = 72057594041991168
  • மேஜிக் ஹாஷ் = (ce52f92a058c)

2.1) தரவுத்தள_ஐடியை மறைகுறியாக்கவும்

இது மேலே உள்ள உதாரணத்தைப் போலவே செயல்படுகிறது! வினவலைப் பயன்படுத்தி தரவுத்தளத்தின் பெயரைக் காண்கிறோம்:

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

என் விஷயத்திலும், அதே தான் DB WideWorldImporters.

2.2) decrypt hobt_id

கண்டுபிடிக்கப்பட்ட தரவுத்தளத்தின் சூழலில், அட்டவணை மற்றும் குறியீட்டின் பெயர்களைத் தீர்மானிக்க உதவும் இரண்டு இணைப்புகளுடன் sys. பகிர்வுகளை நீங்கள் வினவ வேண்டும் ...

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

விண்ணப்பத்தில் கோரிக்கை காத்திருக்கிறது என்று அது சொல்கிறது. PK_Application_Countries இன்டெக்ஸைப் பயன்படுத்தி நாடுகள் பூட்டப்படுகின்றன.

2.3) இப்போது சில %%lockres%% மேஜிக் - எந்த நுழைவு பூட்டப்பட்டது என்பதை நீங்கள் கண்டுபிடிக்க விரும்பினால்

எந்த வரிசையில் பூட்டு தேவை என்பதை நான் அறிய விரும்பினால், அட்டவணையையே வினவுவதன் மூலம் என்னால் கண்டுபிடிக்க முடியும். மேஜிக் ஹாஷுடன் பொருந்தக்கூடிய உள்ளீட்டைக் கண்டறிய, ஆவணப்படுத்தப்படாத %%lockres%% செயல்பாட்டைப் பயன்படுத்தலாம்.
இந்த வினவல் முழு டேபிளையும் ஸ்கேன் செய்யும், மேலும் பெரிய டேபிள்களில் இது வேடிக்கையாக இருக்காது என்பதை நினைவில் கொள்ளவும்:

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

நான் NOLOCK ஐச் சேர்த்தேன் (ட்விட்டரில் கிளாஸ் அஸ்சென்பிரன்னரின் ஆலோசனையின் பேரில்) ஏனெனில் பூட்டுகள் ஒரு பிரச்சனையாக இருக்கலாம். இப்போது என்ன இருக்கிறது என்பதைப் பார்க்க விரும்புகிறோம், பரிவர்த்தனை தொடங்கியபோது என்ன இருந்தது என்பதை அல்ல - தரவு நிலைத்தன்மை எங்களுக்கு முக்கியம் என்று நான் நினைக்கவில்லை.
வோய்லா, நாங்கள் போராடிய சாதனை!
டெட்லாக்ஸ் மற்றும் லாக்குகளில் டிசிஃபர் கீ மற்றும் பேஜ் வெயிட் ரிசோர்ஸ்

அங்கீகாரம் மற்றும் மேலதிக வாசிப்பு

இவற்றில் பலவற்றை முதலில் விவரித்தவர் யார் என்பது எனக்கு நினைவில் இல்லை, ஆனால் நீங்கள் விரும்பக்கூடிய குறைவான ஆவணப்படுத்தப்பட்ட விஷயங்களைப் பற்றிய இரண்டு இடுகைகள் இங்கே:

ஆதாரம்: www.habr.com

கருத்தைச் சேர்