ڈیسیفر کلید اور صفحہ انتظار وسائل تعطل اور تالے میں

اگر آپ بلاک شدہ عمل کی رپورٹ استعمال کرتے ہیں یا وقفے وقفے سے ایس کیو ایل سرور کی طرف سے فراہم کردہ ڈیڈ لاک گراف جمع کرتے ہیں، تو آپ کو اس طرح کی چیزوں کا سامنا کرنا پڑے گا:

waitresource="PAGE: 6:3:70133"

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

کبھی کبھی، اس بڑے XML میں مزید معلومات ہوتی ہیں جس کا آپ مطالعہ کرتے ہیں (ڈیڈ لاک گراف میں وسائل کی ایک فہرست ہوتی ہے جو آپ کو آبجیکٹ اور انڈیکس کے نام تلاش کرنے میں مدد کرتی ہے)، لیکن ہمیشہ نہیں۔

یہ متن آپ کو ان کو سمجھنے میں مدد کرے گا۔

یہاں موجود تمام معلومات انٹرنیٹ پر مختلف جگہوں پر موجود ہیں، یہ بہت آسانی سے تقسیم کی جاتی ہیں! میں ان سب کو ایک ساتھ رکھنا چاہتا ہوں، DBCC PAGE سے hobt_id تک غیر دستاویزی %%physloc%% اور %%lockres%% فنکشنز۔

سب سے پہلے، آئیے PAGE تالے پر انتظار کے بارے میں بات کرتے ہیں، اور پھر KEY تالے کی طرف بڑھتے ہیں۔

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

اگر آپ کی درخواست PAGE لاک پر انتظار کر رہی ہے تو، SQL سرور آپ کو اس صفحہ کا پتہ دے گا۔

"PAGE: 6:3:70133" کو توڑ کر ہمیں ملتا ہے:

  • database_id = 6
  • ڈیٹا_فائل_آئی ڈی = 3
  • صفحہ نمبر = 70133

1.1) ڈیٹا بیس_id کو ڈکرپٹ کریں۔

استفسار کا استعمال کرتے ہوئے ڈیٹا بیس کا نام تلاش کریں:

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

یہ عوامی ہے۔ ڈی بی وائیڈ ورلڈ امپورٹرز میرے ایس کیو ایل سرور پر۔

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 PAGE سے آبجیکٹ کا نام حاصل کریں۔

اب ہم جانتے ہیں کہ ڈیٹا فائل 70133 میں صفحہ #3 ورلڈ وائیڈ امپورٹرز ڈیٹا بیس سے تعلق رکھتا ہے۔ ہم غیر دستاویزی DBCC PAGE اور ٹریس فلیگ 3604 کا استعمال کرتے ہوئے اس صفحہ کے مواد کو دیکھ سکتے ہیں۔
نوٹ: میں DBCC PAGE کو کسی دوسرے سرور پر بحال شدہ کاپی پر استعمال کرنے کو ترجیح دیتا ہوں، کیونکہ یہ غیر دستاویزی چیز ہے۔ کچھ معاملات میں، وہ ایک ڈمپ کے نتیجے میں ہو سکتا ہے (تقریبا. مترجم - لنک، بدقسمتی سے، کہیں بھی نہیں جاتا، لیکن یو آر ایل کے مطابق، ہم فلٹرڈ انڈیکسز کے بارے میں بات کر رہے ہیں).

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

نتائج تک سکرول کرکے، آپ آبجیکٹ_آئی ڈی اور انڈیکس_آئی ڈی تلاش کرسکتے ہیں۔
ڈیسیفر کلید اور صفحہ انتظار وسائل تعطل اور تالے میں
تقریپا ہو گیا! اب آپ ایک سوال کے ساتھ ٹیبل اور انڈیکس کے نام تلاش کر سکتے ہیں:

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

اور یہاں ہم دیکھتے ہیں کہ لاک پر انتظار Sales.OrderLines ٹیبل کے PK_Sales_OrderLines انڈیکس پر تھا۔

نوٹ: SQL سرور 2014 اور اس سے اوپر میں، آبجیکٹ کا نام غیر دستاویزی DMO sys.dm_db_database_page_allocations کا استعمال کرتے ہوئے بھی پایا جا سکتا ہے۔ لیکن آپ کو ڈیٹا بیس کے ہر صفحے سے استفسار کرنا ہوگا، جو بڑے ڈیٹا بیس کے لیے بہت اچھا نہیں لگتا، اس لیے میں نے DBCC PAGE استعمال کیا۔

1.4) کیا اس صفحہ پر موجود ڈیٹا کو دیکھنا ممکن ہے جسے بلاک کیا گیا تھا؟

Nuuu، ہاں. لیکن… کیا آپ کو یقین ہے کہ آپ کو واقعی اس کی ضرورت ہے؟
یہ چھوٹی میزوں پر بھی سست ہے۔ لیکن یہ ایک طرح کا ٹھنڈا ہے، لہذا چونکہ آپ نے ابھی تک پڑھا ہے... آئیے %%physloc%% کے بارے میں بات کرتے ہیں!

%%physloc%% جادو کا ایک غیر دستاویزی ٹکڑا ہے جو ہر اندراج کے لیے ایک فزیکل ID واپس کرتا ہے۔ آپ استعمال کر سکتے ہیں ایس کیو ایل سرور 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 تالے کے بارے میں کافی ہے۔ اگر ہم KEY لاک کا انتظار کر رہے ہیں تو کیا ہوگا؟

2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (جادو ہیش جسے %%lockres%% کے ساتھ ڈکرپٹ کیا جا سکتا ہے اگر آپ واقعی چاہتے ہیں)

اگر آپ کا استفسار انڈیکس انٹری پر لاک کرنے کی کوشش کرتا ہے اور خود ہی لاک ہوجاتا ہے، تو آپ کو بالکل مختلف قسم کا پتہ ملتا ہے۔
"6:72057594041991168 (ce52f92a058c)" کو حصوں میں توڑنے سے، ہمیں ملتا ہے:

  • database_id = 6
  • hobt_id = 72057594041991168
  • میجک ہیش = (ce52f92a058c)

2.1) ڈیٹا بیس_id کو ڈکرپٹ کریں۔

یہ بالکل اسی طرح کام کرتا ہے جیسا کہ اوپر کی مثال کے ساتھ ہے! ہم استفسار کا استعمال کرتے ہوئے ڈیٹا بیس کا نام تلاش کرتے ہیں:

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

میرے معاملے میں، یہ ایک ہی ہے ڈی بی وائیڈ ورلڈ امپورٹرز.

2.2) hobt_id کو ڈکرپٹ کریں۔

پائے گئے ڈیٹا بیس کے تناظر میں، آپ کو sys.partitions سے کچھ جوائنز کے ساتھ استفسار کرنے کی ضرورت ہے جو ٹیبل اور انڈیکس کے ناموں کا تعین کرنے میں مدد کرے گی...

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 انڈیکس کا استعمال کرتے ہوئے Application.Countries لاک پر انتظار کر رہی تھی۔

2.3) اب کچھ %%lockres%% جادو کے لیے - اگر آپ یہ جاننا چاہتے ہیں کہ کون سا اندراج بند تھا

اگر میں واقعی میں جاننا چاہتا ہوں کہ کس قطار میں تالا کی ضرورت تھی، تو میں خود ٹیبل سے استفسار کر کے جان سکتا ہوں۔ ہم جادوئی ہیش سے مماثل اندراج تلاش کرنے کے لیے غیر دستاویزی %%lockres%% فنکشن استعمال کر سکتے ہیں۔
نوٹ کریں کہ یہ استفسار پوری میز کو اسکین کرے گا، اور بڑی میزوں پر یہ بالکل بھی مزہ نہیں آ سکتا:

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

میں نے NOLOCK شامل کیا (ٹویٹر پر کلاؤس اسچین برینر کے مشورے پر) کیونکہ تالے ایک مسئلہ ہو سکتے ہیں۔ ہم صرف یہ دیکھنا چاہتے ہیں کہ اب وہاں کیا ہے، اور یہ نہیں کہ جب لین دین شروع ہوا تو وہاں کیا تھا - مجھے نہیں لگتا کہ ڈیٹا کی مستقل مزاجی ہمارے لیے اہم ہے۔
Voila، وہ ریکارڈ جس کے لیے ہم لڑے!
ڈیسیفر کلید اور صفحہ انتظار وسائل تعطل اور تالے میں

اعترافات اور مزید پڑھنا

مجھے یاد نہیں ہے کہ ان میں سے بہت سی چیزوں کو سب سے پہلے کس نے بیان کیا تھا، لیکن یہاں کم سے کم دستاویزی چیزوں کے بارے میں دو پوسٹس ہیں جو آپ پسند کر سکتے ہیں:

ماخذ: www.habr.com

نیا تبصرہ شامل کریں