ব্লক করা প্রক্রিয়া রিপোর্টে খালি ব্লকিং প্রক্রিয়া


28

আমি বর্ধিত ইভেন্টগুলি ব্যবহার করে অবরুদ্ধ প্রক্রিয়া প্রতিবেদনগুলি সংগ্রহ করছি, এবং কিছু প্রতিবেদনে কোনও কারণে blocking-processনোড খালি রয়েছে। এটি সম্পূর্ণ এক্সএমএল:

<blocked-process-report monitorLoop="383674">
 <blocked-process>
  <process id="processa7bd5b868" taskpriority="0" logused="106108620" waitresource="KEY: 6:72057613454278656 (8a2f7bc2cd41)" waittime="25343" ownerId="1051989016" transactionname="user_transaction" lasttranstarted="2017-03-20T09:30:38.657" XDES="0x21f382d9c8" lockMode="X" schedulerid="7" kpid="15316" status="suspended" spid="252" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-03-20T09:39:15.853" lastbatchcompleted="2017-03-20T09:39:15.850" lastattention="1900-01-01T00:00:00.850" clientapp="Microsoft Dynamics AX" hostname="***" hostpid="1348" loginname="***" isolationlevel="read committed (2)" xactid="1051989016" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame line="1" stmtstart="40" sqlhandle="0x02000000f7def225b0edaecd8744b453ce09bdcff9b291f50000000000000000000000000000000000000000" />
    <frame line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" />
   </executionStack>
   <inputbuf>
(@P1 bigint,@P2 int)DELETE FROM DIMENSIONFOCUSUNPROCESSEDTRANSACTIONS WHERE ((PARTITION=5637144576) AND ((FOCUSDIMENSIONHIERARCHY=@P1) AND (STATE=@P2)))   </inputbuf>
  </process>
 </blocked-process>
 <blocking-process>
  <process />
 </blocking-process>
</blocked-process-report>

এই hobt_id এর সূচকের জন্য সূচক সংজ্ঞা

CREATE UNIQUE CLUSTERED INDEX [I_7402FOCUSDIMENSIONHIERARCHYIDX] ON [dbo].[DIMENSIONFOCUSUNPROCESSEDTRANSACTIONS]
(
    [PARTITION] ASC,
    [FOCUSDIMENSIONHIERARCHY] ASC,
    [STATE] ASC,
    [GENERALJOURNALENTRY] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

কোনও বিভাজন জড়িত নেই, এটি সারণী সংজ্ঞা:

CREATE TABLE [dbo].[DIMENSIONFOCUSUNPROCESSEDTRANSACTIONS](
    [FOCUSDIMENSIONHIERARCHY] [bigint] NOT NULL DEFAULT ((0)),
    [GENERALJOURNALENTRY] [bigint] NOT NULL DEFAULT ((0)),
    [STATE] [int] NOT NULL DEFAULT ((0)),
    [RECVERSION] [int] NOT NULL DEFAULT ((1)),
    [PARTITION] [bigint] NOT NULL DEFAULT ((5637144576.)),
    [RECID] [bigint] NOT NULL,
 CONSTRAINT [I_7402RECID] PRIMARY KEY NONCLUSTERED 
(
    [RECID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[DIMENSIONFOCUSUNPROCESSEDTRANSACTIONS]  WITH CHECK ADD CHECK  (([RECID]<>(0)))
GO

পুরো ডাটাবেসের কোনও সারণীতে কোনও ট্রিগার বা বিদেশী কী সংজ্ঞায়িত করা হয়নি।

সঠিক এসকিউএল সার্ভার বিল্ডটি হ'ল:

মাইক্রোসফ্ট এসকিউএল সার্ভার 2012 (এসপি 3-সিইউ 4) - 11.0.6540.0 (এক্স 64)
জুন 23 2016 17:45:11 কপিরাইট (সি) মাইক্রোসফ্ট কর্পোরেশন এন্টারপ্রাইজ সংস্করণ: উইন্ডোজ এনটি 6.3 এ কোর-ভিত্তিক লাইসেন্সিং (-৪-বিট) বিল্ড 14393:) (হাইপারভাইসর)

প্রসারিত ইভেন্টগুলি মোটামুটি সহজ, কেবল অবরুদ্ধ প্রক্রিয়া রিপোর্টগুলিতে লগইন করুন:

CREATE EVENT SESSION [Dynperf_Blocking_Data] ON SERVER 
ADD EVENT sqlserver.blocked_process_report(
    ACTION(package0.collect_system_time,sqlserver.client_hostname,sqlserver.context_info)),
ADD EVENT sqlserver.lock_escalation(
    ACTION(package0.collect_system_time,sqlserver.client_hostname,sqlserver.context_info)),
ADD EVENT sqlserver.xml_deadlock_report(
    ACTION(package0.collect_system_time,sqlserver.client_hostname,sqlserver.context_info)) 
ADD TARGET package0.event_file(SET filename=N'F:\SQLTrace\Dynamics_Blocking.xel',max_file_size=(100),max_rollover_files=(10))
WITH (MAX_MEMORY=32768 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_NODE,TRACK_CAUSALITY=ON,STARTUP_STATE=ON)
GO

ডেটাবেসটি রিড কমিটেড স্ন্যাপশট আইসোলেশনে কনফিগার করা হয়েছে এবং সাদৃশ্যটির সর্বাধিক ডিগ্রি সেট করা হয়েছে This এটি সার্ভার কনফিগারেশন:

+------------------------------------+-------+
|                name                | value |
+------------------------------------+-------+
| access check cache bucket count    |     0 |
| access check cache quota           |     0 |
| Ad Hoc Distributed Queries         |     0 |
| affinity I/O mask                  |     0 |
| affinity mask                      |     0 |
| affinity64 I/O mask                |     0 |
| affinity64 mask                    |     0 |
| Agent XPs                          |     1 |
| allow updates                      |     0 |
| backup compression default         |     1 |
| blocked process threshold (s)      |     2 |
| c2 audit mode                      |     0 |
| clr enabled                        |     0 |
| common criteria compliance enabled |     0 |
| contained database authentication  |     0 |
| cost threshold for parallelism     |     5 |
| cross db ownership chaining        |     0 |
| cursor threshold                   |    -1 |
| Database Mail XPs                  |     1 |
| default full-text language         |  1033 |
| default language                   |     0 |
| default trace enabled              |     1 |
| disallow results from triggers     |     0 |
| EKM provider enabled               |     0 |
| filestream access level            |     0 |
| fill factor (%)                    |     0 |
| ft crawl bandwidth (max)           |   100 |
| ft crawl bandwidth (min)           |     0 |
| ft notify bandwidth (max)          |   100 |
| ft notify bandwidth (min)          |     0 |
| index create memory (KB)           |     0 |
| in-doubt xact resolution           |     0 |
| lightweight pooling                |     0 |
| locks                              |     0 |
| max degree of parallelism          |     1 |
| max full-text crawl range          |     4 |
| max server memory (MB)             | 65536 |
| max text repl size (B)             | 65536 |
| max worker threads                 |     0 |
| media retention                    |     0 |
| min memory per query (KB)          |  1024 |
| min server memory (MB)             |     0 |
| nested triggers                    |     1 |
| network packet size (B)            |  4096 |
| Ole Automation Procedures          |     0 |
| open objects                       |     0 |
| optimize for ad hoc workloads      |     1 |
| PH timeout (s)                     |    60 |
| precompute rank                    |     0 |
| priority boost                     |     0 |
| query governor cost limit          |     0 |
| query wait (s)                     |    -1 |
| recovery interval (min)            |     0 |
| remote access                      |     1 |
| remote admin connections           |     0 |
| remote login timeout (s)           |    10 |
| remote proc trans                  |     0 |
| remote query timeout (s)           |   600 |
| Replication XPs                    |     0 |
| scan for startup procs             |     1 |
| server trigger recursion           |     1 |
| set working set size               |     0 |
| show advanced options              |     1 |
| SMO and DMO XPs                    |     1 |
| transform noise words              |     0 |
| two digit year cutoff              |  2049 |
| user connections                   |     0 |
| user options                       |     0 |
| xp_cmdshell                        |     0 |
+------------------------------------+-------+

আমি কিছুক্ষণের জন্য সার্ভারের সাইড ট্রেস চালিয়েছি এবং আমি বর্ধিত ইভেন্টগুলি ব্যবহার করার মতো ট্রেস ফাইলে একই ফাঁকা নোডগুলি পাই।
এই ব্লক করা প্রক্রিয়া প্রতিবেদনটি ডায়নামিক্স এক্স দ্বারা চালিত অন্য সার্ভারে একটি সার্ভার সাইড ট্রেস ব্যবহার করে ধরা হয়েছিল, সুতরাং এটি এই সার্ভার বা বিল্ডের সাথে নির্দিষ্ট নয়।

<blocked-process-report monitorLoop="1327922">
 <blocked-process>
  <process id="processbd9839848" taskpriority="0" logused="1044668" waitresource="KEY: 5:72057597098328064 (1d7966fe609a)" waittime="316928" ownerId="3415555263" transactionname="user_transaction" lasttranstarted="2017-03-27T07:59:29.290" XDES="0x1c1c0c3b0" lockMode="U" schedulerid="3" kpid="25236" status="suspended" spid="165" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-03-27T07:59:47.873" lastbatchcompleted="2017-03-27T07:59:47.873" lastattention="2017-03-27T07:58:01.490" clientapp="Microsoft Dynamics AX" hostname="***" hostpid="11072" loginname="***" isolationlevel="read committed (2)" xactid="3415555263" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame line="1" stmtstart="236" stmtend="676" sqlhandle="0x020000004d6830193d42a167edd195c201f40bb772e9ece20000000000000000000000000000000000000000"/>
   </executionStack>
   <inputbuf>
(@P1 numeric(32,16),@P2 int,@P3 bigint,@P4 nvarchar(5),@P5 nvarchar(36),@P6 int,@P7 numeric(32,16),@P8 bigint,@P9 int)UPDATE PRODCALCTRANS SET REALCOSTAMOUNT=@P1,RECVERSION=@P2 WHERE (((((((PARTITION=@P3) AND (DATAAREAID=@P4)) AND (COLLECTREFPRODID=@P5)) AND (COLLECTREFLEVEL=@P6)) AND (LINENUM=@P7)) AND (RECID=@P8)) AND (RECVERSION=@P9))   </inputbuf>
  </process>
 </blocked-process>
 <blocking-process>
  <process/>
 </blocking-process>
</blocked-process-report>

এই প্রতিবেদনের জন্য কারও কি ব্যাখ্যা আছে? কোয়েরি ব্লক করছে কি?

লকগুলি দীর্ঘক্ষণ যাওয়ার পরে আমি যদি প্রতিবেদনগুলি দেখছি তবে কী ঘটছিল তা জানার কোনও উপায় আছে?

যুক্ত করতে কার্যকর হতে পারে এমন একটি জিনিস হ'ল এই কোয়েরিগুলি sp_cursorprepareএবং মাধ্যমে চালিত হয়sp_cursorexecute

এখন পর্যন্ত আমি এটি পুনরুত্পাদন করতে সক্ষম হইনি, এটি এলোমেলোভাবে হলেও খুব প্রায়ই ঘটে বলে মনে হচ্ছে।

এটি ডাইনামিক্স এক্স-এর সাথে সম্পর্কিত, বেশ কয়েকটি উদাহরণে (বিভিন্ন বিল্ডের) এবং বেশ কয়েকটি টেবিল / কোয়েরিতে ঘটে happens

সেই সময়ে ব্যাকগ্রাউন্ডে কোনও সূচক বা অন্যান্য ডাটাবেস রক্ষণাবেক্ষণ কাজ নেই।

শ্রুতজকির উত্তরে প্রদত্ত কোডটি ব্যবহার করে আমি এই ব্লক করা প্রক্রিয়া রিপোর্ট সম্পর্কিত কিছু লগিং ক্যাপচার করতে সক্ষম হয়েছি:

<blocked-process-report monitorLoop="1621637">
 <blocked-process>
  <process id="processd06909c28" taskpriority="0" logused="0" waitresource="KEY: 5:72057597585719296 (d2d87c26d920)" waittime="78785" ownerId="4436575948" transactionname="user_transaction" lasttranstarted="2017-04-13T07:39:17.590" XDES="0x3219d034e0" lockMode="U" schedulerid="3" kpid="133792" status="suspended" spid="106" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-04-13T07:39:17.657" lastbatchcompleted="2017-04-13T07:39:17.657" lastattention="1900-01-01T00:00:00.657" clientapp="Microsoft Dynamics AX" hostname="****" hostpid="11800" loginname="****" isolationlevel="read committed (2)" xactid="4436575948" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame line="1" stmtstart="72" stmtend="256" sqlhandle="0x0200000076a6a92ab1256af09321b056ab243f187342f9960000000000000000000000000000000000000000"/>
    <frame line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"/>
   </executionStack>
   <inputbuf>
(@P1 int,@P2 int,@P3 bigint,@P4 int)UPDATE PRODROUTEJOB SET JOBSTATUS=@P1,RECVERSION=@P2 WHERE ((RECID=@P3) AND (RECVERSION=@P4))   </inputbuf>
  </process>
 </blocked-process>
 <blocking-process>
  <process/>
 </blocking-process>
</blocked-process-report>

এটি সেই সময়ে প্রায় একই সংস্থার জন্য লগিং টেবিলগুলিতে পাওয়া যায়: অক্ষরের সীমাবদ্ধতার কারণ ist

আরও তদন্তে দেখা যায় যে খালি ব্লকিং প্রক্রিয়া সহ রিপোর্টের ঠিক আগে এবং পরে আমার কাছে একই রিসোর্সিডির জন্য প্রতিবেদন রয়েছে যাতে ব্লকিং প্রক্রিয়া নোড রয়েছে:

<blocked-process-report monitorLoop="1621636">
 <blocked-process>
  <process id="processd06909c28" taskpriority="0" logused="0" waitresource="KEY: 5:72057597585719296 (d2d87c26d920)" waittime="73765" ownerId="4436575948" transactionname="user_transaction" lasttranstarted="2017-04-13T07:39:17.590" XDES="0x3219d034e0" lockMode="U" schedulerid="3" kpid="133792" status="suspended" spid="106" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-04-13T07:39:17.657" lastbatchcompleted="2017-04-13T07:39:17.657" lastattention="1900-01-01T00:00:00.657" clientapp="Microsoft Dynamics AX" hostname="***" hostpid="11800" loginname="***" isolationlevel="read committed (2)" xactid="4436575948" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame line="1" stmtstart="72" stmtend="256" sqlhandle="0x0200000076a6a92ab1256af09321b056ab243f187342f9960000000000000000000000000000000000000000"/>
    <frame line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"/>
   </executionStack>
   <inputbuf>
(@P1 int,@P2 int,@P3 bigint,@P4 int)UPDATE PRODROUTEJOB SET JOBSTATUS=@P1,RECVERSION=@P2 WHERE ((RECID=@P3) AND (RECVERSION=@P4))   </inputbuf>
  </process>
 </blocked-process>
 <blocking-process>
  <process status="sleeping" spid="105" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2017-04-13T07:40:31.417" lastbatchcompleted="2017-04-13T07:40:31.423" lastattention="1900-01-01T00:00:00.423" clientapp="Microsoft Dynamics AX" hostname="**" hostpid="11800" loginname="**" isolationlevel="read committed (2)" xactid="4436165115" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack/>
   <inputbuf>
(@P1 bigint,@P2 nvarchar(5),@P3 bigint,@P4 bigint,@P5 nvarchar(11),@P6 int,@P7 nvarchar(21),@P8 datetime2)SELECT T1.REGDATETIME,T1.REGDATETIMETZID,T1.WORKERPILOT,T1.WORKER,T1.WRKCTRIDPILOT,T1.REGTYPE,T1.PROFILEDATE,T1.JOBID,T1.JOBIDABS,T1.MATCHRECIDSTARTSTOP,T1.JOBACTIVE,T1.RESNO,T1.STARTITEMS,T1.GOODITEMS,T1.SCRAPITEMS,T1.FINISHEDCODE,T1.TMPGOODITEMS,T1.TMPSCRAPITEMS,T1.SYSMRPUPDATEREQUEST,T1.ERROR,T1.ERRORTXT,T1.TMPSTARTITEMS,T1.AUTOSTAMP,T1.ERRORSPECIFICATION,T1.COSTCATEGORY,T1.ONCALLACTIVITY,T1.TERMINALID,T1.PDSCWGOODITEMS,T1.PDSCWSCRAPITEMS,T1.PDSCWSTARTITEMS,T1.RETAILTERMINALID,T1.MODIFIEDDATETIME,T1.RECVERSION,T1.PARTITION,T1.RECID FROM JMGTERMREG T1 WHERE (((PARTITION=@P1) AND (DATAAREAID=@P2)) AND (((((WORKER=@P3) OR ((WORKER=@P4) AND (WRKCTRIDPILOT=@P5))) AND (REGTYPE=@P6)) AND (JOBID=@P7)) AND (REGDATETIME&gt;=@P8))) ORDER BY T1.REGDATETIME   </inputbuf>
  </process>
 </blocking-process>
</blocked-process-report>

শ্রুতজকির দেওয়া নতুন স্ক্রিপ্ট ব্যবহার করে নতুন ডেটা সংগ্রহ করা হয়েছে। সর্বাধিক পোস্ট দৈর্ঘ্যের কারণে এটি গিথুবে পোস্ট করা হয়েছে

যেহেতু মূলত পোস্ট করা ডেটাতে উভয়ই সেশন আইডির কিছু নতুন ডেটা গিথুবে আবার পোস্ট করা হয়েছে

গিথুবের সংযোগগুলি সহ নতুন ডেটা

উত্তর:


6

আমি এই তত্ত্বটি এই মুহুর্তে পরীক্ষা করতে পারছি না, তবে গিটহাবকে পোস্ট করা সাম্প্রতিক ক্যাপচারের তথ্যের উপর ভিত্তি করে আমি বলব যে আপনি <process>নোড খালি থাকার কারণ এটি বর্তমানে চলমান অনুরোধের প্রয়োজন (অনেকগুলি বৈশিষ্ট্যে পাওয়া গেছে sys.dm_exec_requestsএবং এতে নেই sys.dm_exec_sessions) এবং বর্তমানে চলমান অনুরোধ ব্যতীত এটি কোনও বিবরণ জানাতে পারে না, এটির INNER JOINমধ্যে কীভাবে করা হয় sys.dm_exec_requestsএবং sys.dm_exec_sessionsসেশনটি সক্রিয় যেখানে সারিগুলি সক্রিয় রাখে তবে বর্তমান অনুরোধের কারণে নিষ্ক্রিয় থাকে তা সরিয়ে দেয়।

ডেটা শীর্ষ সেট ( monitorLoopমান: 1748823, 1748824, 1748825, এবং 1748827) তাকিয়ে আমরা নিম্নলিখিত দেখতে পারেন:

  • idএর blocked-processপ্রতিটি ক্ষেত্রে একই: process2552c1fc28 , এবং শুধুমাত্র গুণ যা বিভিন্ন হয় waittime(ঠিক যে)।
  • blocking-processনোডের বৈশিষ্ট্যগুলি উভয় lastbatchstartedএবং মধ্যে পার্থক্য দেখায়lastbatchcompleted
  • গুণাবলীর blocking-processনোড দেন জন্য অভিন্ন মূল্যবোধ spidএবংxactid

সুতরাং, ব্লকিং প্রক্রিয়াটির সেশনআইডি এবং লেনদেনআইডি 4 টি পৃথক ক্যোয়ারী ব্যাচগুলিতে কীভাবে এক হতে পারে? সহজ, একটি স্পষ্ট লেনদেন শুরু হয়েছিল এবং তারপরে এই ব্যাচগুলি কার্যকর করা হয়েছিল। এবং যেহেতু এগুলি পৃথক ব্যাচ, তাই তাদের মধ্যে সময় জমা দেওয়া হচ্ছে, কোন পর্যায়ে কোনও বর্তমান অনুরোধ নেই, সুতরাং প্রদর্শন করার জন্য কোনও প্রক্রিয়া সম্পর্কিত তথ্য নেই (তবে সেশন এবং লেনদেন এখনও রয়েছে)।

এই অতিরিক্ত গবেষণা করতে, আপনাকে থেকে সহায়ক তথ্য ক্যাপচার করতে পারেন sys.dm_exec_requestsএবং sys.dm_tran_locksএকটি SQL সার্ভার এজেন্ট "লেনদেন-SQL স্ক্রিপ্ট (টি-এসকিউএল)" চাকরির ধাপ নিম্নলিখিত টি-এসকিউএল স্থাপন দ্বারা, "ডেটাবেস" হতে সেটিং আপনি যেটি গবেষণা করছেন (এই ক্ষেত্রে এটি হ'ল একটি আইডি 6) এবং প্রতি 10 সেকেন্ডে চালানোর জন্য এই কাজটি নির্ধারিত করে। নীচের টি-এসকিউএল একই ডিবিতে দুটি টেবিল তৈরি করবে যদি সেগুলি উপস্থিত না থাকে এবং তারপরে যদি কোনও অনুরোধ নিজেই অবরুদ্ধ করে থাকে, বা যদি এটি মুছে ফেলা বা আপডেট অপারেশন হয় যা অবরুদ্ধ হচ্ছে । কোনও অনুরোধ পাওয়া গেলে, এটি ক্যাপচার চেষ্টা করবে:

  • অবরুদ্ধকরণ প্রক্রিয়া সম্পর্কিত সেশন এবং অনুরোধের তথ্য (এই অংশটি ধরে নেই যে একটি সক্রিয় অনুরোধ রয়েছে, সুতরাং RIGHT JOINকমপক্ষে সেশন তথ্যটি পাবেন)
  • অবরুদ্ধ এবং (আশা) ব্লকিং প্রক্রিয়াগুলির জন্য সংযোগের তথ্য।
  • সেই একই সেশন_আইডির জন্য বর্তমান লকগুলি (কেবল মনে রাখবেন যে লক তথ্যটি 100% নির্ভুল হওয়ার গ্যারান্টিযুক্ত নয় কারণ সেই তথ্য দুটি কার্যকর করার সময় সেই সময়ের মধ্যে পরিবর্তিত হতে পারে; তথাপি, তথ্যটি যথেষ্ট পরিমাণে যথেষ্ট যথেষ্ট থাকে ক্যাপচারিং মূল্য)। এই বিভাগটি বর্তমানে মন্তব্য করা হয়।

এসকিউএল সার্ভার এজেন্ট টি-এসকিউএল কাজের পদক্ষেপ:

-- !! Remember to set the "Database" for the T-SQL Job Step to
--    the DB that has database_id = 6 !!
SET NOCOUNT ON;
IF (OBJECT_ID(N'dbo.tmpBlockingResearch_Requests') IS NULL)
BEGIN
  -- Create requests capture table
  SELECT SYSDATETIME() AS [CaptureTime], req.*,
         ses.login_time, ses.[host_name], ses.[program_name], ses.host_process_id,
         ses.client_version, ses.client_interface_name, ses.security_id,
         ses.login_name, ses.nt_domain, ses.nt_user_name, ses.memory_usage,
         ses.total_scheduled_time, ses.endpoint_id, ses.last_request_start_time,
         ses.last_request_end_time, ses.is_user_process, ses.original_security_id,
         ses.original_login_name, ses.last_successful_logon, ses.last_unsuccessful_logon,
         ses.unsuccessful_logons, ses.authenticating_database_id
  INTO   dbo.tmpBlockingResearch_Requests
  FROM   sys.dm_exec_requests req
  INNER JOIN sys.dm_exec_sessions ses
          ON ses.[session_id] = req.[session_id]
  WHERE  1 = 0;
END;

IF (OBJECT_ID(N'dbo.tmpBlockingResearch_Connections') IS NULL)
BEGIN
  -- Create connections capture table
  SELECT SYSDATETIME() AS [CaptureTime], con.*
  INTO   dbo.tmpBlockingResearch_Connections
  FROM   sys.dm_exec_connections con
  WHERE  1 = 0;
END;

IF (OBJECT_ID(N'dbo.tmpBlockingResearch_Locks') IS NULL)
BEGIN
  -- Create locks capture table
  SELECT SYSDATETIME() AS [CaptureTime], loc.*
  INTO   dbo.tmpBlockingResearch_Locks
  FROM   sys.dm_tran_locks loc
  WHERE  1 = 0;
END;
---------------------------------
DECLARE @SessionIDs TABLE (SessionID SMALLINT NOT NULL,
                           BlockingSessionID SMALLINT NOT NULL);

INSERT INTO dbo.tmpBlockingResearch_Requests
OUTPUT inserted.[session_id], inserted.[blocking_session_id]
INTO   @SessionIDs ([SessionID], [BlockingSessionID])
  SELECT SYSDATETIME() AS [CaptureTime], req.*,
         ses.login_time, ses.[host_name], ses.[program_name], ses.host_process_id,
         ses.client_version, ses.client_interface_name, ses.security_id,
         ses.login_name, ses.nt_domain, ses.nt_user_name, ses.memory_usage,
         ses.total_scheduled_time, ses.endpoint_id, ses.last_request_start_time,
         ses.last_request_end_time, ses.is_user_process, ses.original_security_id,
         ses.original_login_name, ses.last_successful_logon, ses.last_unsuccessful_logon,
         ses.unsuccessful_logons, ses.authenticating_database_id
  FROM   sys.dm_exec_requests req
  INNER JOIN sys.dm_exec_sessions ses
          ON ses.[session_id] = req.[session_id]
  WHERE ses.[is_user_process] = 1
  AND   req.[database_id] = DB_ID()
  AND   (
          req.blocking_session_id IN (req.[session_id], -2, -3, -4)
    OR   (req.[command] IN (N'DELETE', N'UPDATE') AND req.[blocking_session_id] > 0)
        );

-- Get at least session info, if not also request info, on blocking process
INSERT INTO dbo.tmpBlockingResearch_Requests
  SELECT SYSDATETIME() AS [CaptureTime], req.*,
         ses.login_time, ses.[host_name], ses.[program_name], ses.host_process_id,
         ses.client_version, ses.client_interface_name, ses.security_id,
         ses.login_name, ses.nt_domain, ses.nt_user_name, ses.memory_usage,
         ses.total_scheduled_time, ses.endpoint_id, ses.last_request_start_time,
         ses.last_request_end_time, ses.is_user_process, ses.original_security_id,
         ses.original_login_name, ses.last_successful_logon, ses.last_unsuccessful_logon,
         ses.unsuccessful_logons, ses.authenticating_database_id
  FROM   sys.dm_exec_requests req
  RIGHT JOIN sys.dm_exec_sessions ses
          ON ses.[session_id] = req.[session_id]
  WHERE ses.[session_id] IN (SELECT DISTINCT [BlockingSessionID] FROM @SessionIDs);

-- If any rows are captured this time, try to capture their connection info
INSERT INTO dbo.tmpBlockingResearch_Connections
  SELECT SYSDATETIME() AS [CaptureTime], con.*
  FROM   sys.dm_exec_connections con
  WHERE  con.[session_id] IN (
                              SELECT [SessionID]
                              FROM @SessionIDs
                              UNION -- No "ALL" so it does DISTINCT
                              SELECT [BlockingSessionID]
                              FROM @SessionIDs
                             );

/*
-- If any rows are captured this time, try to capture their lock info
INSERT INTO dbo.tmpBlockingResearch_Locks
  SELECT SYSDATETIME() AS [CaptureTime], loc.*
  FROM   sys.dm_tran_locks loc
  WHERE  loc.[request_session_id] IN (
                                      SELECT [SessionID]
                                      FROM @SessionIDs
                                      UNION -- No "ALL" so it does DISTINCT
                                      SELECT [BlockingSessionID]
                                      FROM @SessionIDs
                                     );
 */

আমি মনে করি আপনার একটি কোয়েরি ট্যাব খোলার মাধ্যমে এবং নিম্নলিখিতগুলি সম্পাদন করে এটি পুনরুত্পাদন করতে সক্ষম হওয়া উচিত:

CREATE TABLE dbo.tmp (Col1 INT);
BEGIN TRAN;
INSERT INTO dbo.tmp (Col1) VALUES (1);

তারপরে, দ্বিতীয় ক্যোয়ারী ট্যাবটি খুলুন এবং নিম্নলিখিতগুলি সম্পাদন করুন:

UPDATE dbo.tmp
SET    Col1 = 2
WHERE  Col1 = 1;

পিএস কেবল এটি বলা আছে, একমাত্র যে বিষয়টি বোঝায় না তা হ'ল অনুরোধ এবং সেশন তথ্য - dbo.tmpBlockingResearch_Requests- এখনও অবরুদ্ধ সেশনের জন্য সারি থাকে না। তবুও আমি জানি যে টেবিল ভেরিয়েবলের এতে ব্লকিং সেশন আইডি রয়েছে যেহেতু এটি উভয় সেশনআইডির জন্য লকগুলিতে টানছিল। এটি এমন দৃশ্যের দিকে ইঙ্গিত করতে পারে যেখানে ক্লায়েন্টের "সংযোগ" বন্ধ হওয়ার পরে কোনও লেনদেনকে খোলা থাকার অনুমতি দেওয়া হয় তবে সংযোগ পুলিংয়ের কারণে সংযোগটি এখনও বজায় রাখা হয়।


@ টমভি আমি নতুন গবেষণামূলক ডেটা পর্যালোচনা করেছি এবং আমার কাছে বেশ শক্ত তত্ত্ব আছে। আমি আমার উত্তর অনুসারে আমার গবেষণামূলক প্রশ্নগুলিতে একটি বিভাগ যুক্ত করে আপডেট করেছি, সুতরাং দয়া করে এখানে নতুন প্রশ্নগুলির সাথে কাজের পদক্ষেপ এসকিউএলকে প্রতিস্থাপন করুন (আমি "লকস" কোয়েরিটিও মন্তব্য করেছি যেহেতু আমাদের এখনই সেই ডেটার প্রয়োজন নেই এবং এটি অনেক তথ্য)। আমি স্ক্র্যাচ থেকে শুরু করার জন্য বিদ্যমান গবেষণা টেবিলগুলি ছাঁটাই / বাদ দেওয়ার পরামর্শ দিচ্ছি।
সলোমন রুটজকি

@ টমভি ঠিক আছে এবং আমি আমার রেপো কোয়েরিটি একটি নির্বাচনের পরিবর্তে আপডেট হওয়ার জন্য আপডেট করেছি যাতে এটি আপনার পরিস্থিতির আরও প্রতিনিধি হওয়া উচিত। আমি অনুরোধ সারণীতে সারণী হারিয়ে যাওয়া সম্পর্কে শেষে একটি নোটও যুক্ত করেছি। আশা করি নতুন সংযোগ সারণী কমপক্ষে অবরুদ্ধ সেশনআইডির অবিচ্ছিন্ন অস্তিত্ব নিশ্চিত করবে confirm (পিএস, আমি উপরে আমার মন্তব্যগুলি পরিষ্কার করতে শুরু করেছি)।
সলোমন রুটজকি

আপনার কাজ সক্রিয়।
টম ভি - টিম মনিকা

হাই সলোমন 2 নতুন উদাহরণ গিথুব পোস্ট করা হয়েছে। দুর্ভাগ্যক্রমে আমি সরবরাহিত কেসটি ব্যবহার করে একটি খালি ব্লকিং প্রক্রিয়া বিপিআর ট্রিগার করতে পারিনি।
টম ভী - টিম মনিকা

আমার খুব বেশি সময় নেই বলে খুব তাত্ক্ষণিক চেহারা নিয়েছেন। দেখে মনে হচ্ছে সংযোগগুলির তথ্য ব্লকিং সেশন আইডিটি এখনও সক্রিয় দেখায় তবে এটি সেশনের টেবিলে নেই। আমি এটি পরে পরীক্ষা করতে পারি, তবে আমি নিশ্চিত যে সংযোগ পুলিং (সংযোগ এখনও রয়েছে) এবং কমান্ডের মধ্যে সংযোগটি বন্ধ থাকা সত্ত্বেও একটি লেনদেন স্পষ্টভাবে খোলা রয়েছে (যেহেতু লেনদেন_আইডি সর্বদা আমরা গতবারের মতো দেখেছি)। পরে আরও
ঘুরে দেখব

4

লক বাড়ানোর কারণে অবরুদ্ধ লেনদেনগুলি ঘটতে পারে।

মাইক্রোসফ্ট সমর্থন নিবন্ধে এটি ব্যাখ্যা করা হয়েছে:

এসকিউএল সার্ভারে লক বাড়ানোর ফলে সৃষ্ট অবরুদ্ধ সমস্যাগুলি কীভাবে সমাধান করা যায়

...
লক বর্ধন বেশিরভাগ অবরুদ্ধ সমস্যা তৈরি করে না। আপনি যখন ব্লকিংয়ের সমস্যাগুলির মুখোমুখি হন তখন লকটি বাড়ানো হয় কিনা তা নির্ধারণ করতে, একটি এসকিউএল প্রোফাইলার ট্রেস শুরু করুন যাতে লক: বর্ধন ইভেন্ট অন্তর্ভুক্ত রয়েছে। যদি আপনি কোনও লক না দেখেন: বর্ধন ইভেন্টগুলি, আপনার সার্ভারে লক বিস্তৃতি ঘটছে না এবং এই নিবন্ধের তথ্যগুলি আপনার পরিস্থিতির জন্য প্রযোজ্য নয়।

যদি লক বৃদ্ধির ঘটনা ঘটে থাকে তবে যাচাই করুন যে বর্ধিত টেবিল লকটি অন্য ব্যবহারকারীদের ব্লক করছে
...

অবরুদ্ধ প্রক্রিয়া ইভেন্টের আগে ঘটে যাওয়া লক এসকেলেশন ইভেন্টগুলির জন্য বর্ধিত ইভেন্টগুলি (শারীরিক ফাইল) পরীক্ষা করুন ।

ব্যাখ্যা

একটি মাইক্রোসফ্ট ব্লগ নিবন্ধ আছে যা আরও বিশদে যায়:

এসকিউএল সার্ভার লক ছাড় এবং ব্লক করা

...
দ্বিতীয় ধাপ: লক বর্ধন এবং ব্লক করা প্রক্রিয়া প্রতিবেদন ইভেন্টগুলি সংগ্রহ করুন।

লক বৃদ্ধি এবং অবরুদ্ধ প্রক্রিয়া প্রতিবেদন ইভেন্টগুলি এসকিউএল সার্ভার দ্বারা স্বয়ংক্রিয়ভাবে ক্যাপচার করা হয় না। এই ইভেন্টগুলি ঘটছে কিনা তা জানতে, আমাদের এসকিউএল সার্ভারকে সেগুলি রেকর্ড করার জন্য বলতে হবে। আমাদের দলটি তথ্য সংগ্রহের জন্য মাইক্রোসফ্ট ডায়নামিক্স সরঞ্জামটির পারফরম্যান্স অ্যানালাইজার ব্যবহার করে। সরঞ্জামটি এবং এটির সাথে কীভাবে ব্লকিংয়ের বিশদ সংগ্রহ করা যায় সে সম্পর্কে আরও তথ্যের জন্য রড হ্যানসেনের এই পোস্টটি দেখুন। আপনি যদি কেবল এসকিউএল সার্ভার প্রোফাইলার ব্যবহার করতে চান তবে আপনার যে ইভেন্টগুলি সংগ্রহ করতে হবে সেগুলি নীচে দেখানো হয়েছে: ...

আপনি লক এসকেলেশন এবং অবরুদ্ধ প্রক্রিয়াগুলি ক্যাপচার করার পরে আপনাকে তা নির্ধারণ করতে হবে লক এসকেলেশনগুলি ব্লক করা প্রক্রিয়ার মূল কারণ কিনা:

...
পদক্ষেপ 3: এসকিউএল সার্ভার প্রোফাইলারারের ট্রেস পর্যালোচনা করুন।

দুটি প্রধান সূচক রয়েছে যা আপনাকে বলবে যে ব্লকিং লক বৃদ্ধির সাথে সম্পর্কিত কিনা।

প্রথমত, আপনি অবরুদ্ধ প্রক্রিয়া প্রতিবেদনের ইভেন্টগুলির তত্ক্ষণাত্ তালাবদ্ধ এসকেলেশন ইভেন্টগুলির একটি সিরিজ দেখতে পান। নীচে মাইক্রোসফ্ট ডায়নামিক্স সরঞ্জামটির জন্য পারফরম্যান্স অ্যানালাইজার দ্বারা উত্পাদিত একটি ট্রেস থেকে নেওয়া উদাহরণ is ট্রেসটি অনুসন্ধান করার জন্য এটি একটি জিনিস, তবে এর একার অর্থ এই নয় যে লক বিস্তৃতি অবরুদ্ধকরণ ঘটায়। ...

এবং আরও

অবরুদ্ধকরণটি আসলে লক বর্ধনের সাথে সম্পর্কিত কিনা তা যাচাই করতে আপনার অবরুদ্ধ প্রক্রিয়া রিপোর্টের বিবরণটি দেখতে হবে। টেক্সটডাটা বিভাগে ওয়েটারসোর্সের সন্ধান করুন (নীচের স্ক্রিনশটটি দেখুন)। ওয়েটারসোর্স যদি ওবিজেইসিটি দিয়ে শুরু হয়, আমরা জানি যে অবরুদ্ধ বিবৃতিটি এগিয়ে যাওয়ার আগে টেবিল স্তরের লকটি প্রকাশের অপেক্ষায় রয়েছে। সঙ্গে waitresource শুরু হয়, তাহলে মূল বা PAG পরিবর্তে বস্তু, তারপর লক উদ্দীপন নির্দিষ্ট ব্লক জড়িত নয় । লক বাড়ানো সর্বদা লকটি যেখানে শুরু হয় তা বিবেচনা না করেই ওজেবিইসিটি-তে বাড়িয়ে দেবে

সমাধান

(কেবলমাত্র উপরে বর্ণিত মিলগুলি)

সমাধানটি স্পষ্টতই ট্রেস পতাকা 1224 চালু করার জন্য যা লক বর্ধন বন্ধ করে দেবে:

এসকিউএল সার্ভার লক ছাড় এবং ব্লক করা

আপনি যদি এই দুটি জিনিস একসাথে দেখতে পান তবে এটি খুব ভাল বাজি যে লকটি বৃদ্ধি রোধ করে এবং আপনার সম্ভবত এসকিউএল সার্ভারের ট্রেস পতাকা 1224 প্রয়োগ করে উপকৃত হতে পারে।

ডায়নামিক্স এক্স এর জন্য এসকিউএল সার্ভার ট্রেস ফ্ল্যাগ

তালিকার পতাকা 1224 লকের সংখ্যার ভিত্তিতে লক এসক্লেশন অক্ষম করে। এই ট্রেস পতাকাটি সক্ষম করা লক বর্ধনের কারণে অবরুদ্ধ হওয়ার সম্ভাবনা হ্রাস করতে পারে - এমন কিছু যা আমি বেশ কয়েকটি এক্স বাস্তবায়নের সাথে দেখেছি। যখন মাস্টার প্ল্যানিংয়ের জন্য দিনের বেলা চালানোর প্রয়োজন হয় তখন এই সমস্যাটি সবচেয়ে সাধারণ পরিস্থিতি হয়ে ওঠে

উত্তর

শেষ পর্যন্ত এটি হতে পারে যে লক এসকেলেশন অবরুদ্ধ প্রক্রিয়াগুলির মূল কারণ।


বিকল্প সমাধান (প্রক্রিয়া নোড খালি)

কিছু ব্লকড_প্রসেস_রেপোর্টগুলি আরও তদন্তের পরে নিম্নলিখিত বিকল্প ব্যাখ্যা করা যেতে পারে।

বর্ধিত ইভেন্টগুলি ব্লকড_প্রসেস_পোর্টগুলি ক্যাপচার করছে যা সেই সময়ে অন্য কোনও প্রক্রিয়ার সাথে সম্পর্কিত নয়।

এরগো: অন্য কোনও কারণে তাদের অবশ্যই অবরুদ্ধ করতে হবে

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার এসকিউএল সার্ভারে sys.dm_os_wait_stats ভিউ থেকে অপেক্ষা ধরণের টাইম ফ্রেম ক্যাপচার করুন এবং আপনার পরিমাপের সময় সংঘটিত ব্লক_প্রসেস_সোর্টগুলি সংখ্যার সাথে সম্পর্কিত করুন। পল র্যান্ডাল একটি দুর্দান্ত স্ক্রিপ্ট আছে: আমাকে আপনার অপেক্ষা পরিসংখ্যান প্রেরণ করুন এবং আমার পরামর্শ এবং 30 দিনের ফ্রি বহুবচনের জন্য পান

স্ক্রিপ্টগুলি বর্তমান কাউন্টারগুলি ক্যাপচার করে, ২৩ ঘন্টা অপেক্ষা করে (পরিবর্তিত হতে পারে), আবার বর্তমান কাউন্টারগুলিকে পুনরুদ্ধার করে এবং তাদের তুলনা করে আপনাকে শীর্ষের ৯৯% অপেক্ষা করতে give আপনি 1 ঘন্টা বলার জন্য এটি চেষ্টা করে দেখতে পারেন এবং এক্সইএল ফাইলটি ব্যবহার করতে পারেন।

আপনি একটি অপেক্ষার প্রকার (যেমন এলসিকে_এম_এসএইচ,…) পেতে পারেন যা আপনাকে জানায় যে আপনার স্টোরেজটি লেখায় মন্থর। অথবা আপনার অন্য কোনও ওভারহেড রয়েছে (যেমন CX_PACKET_WAITS,…।)। আপনার আপডেটগুলি কিছুটা কমিয়ে দিচ্ছে। তারপরে আপনি দেখতে পাচ্ছেন যে sys.dm_os_wait_stats খালি নোডের সাথে অবরুদ্ধ_প্রসেস_বন্দরগুলি সম্পর্কিত।

এমন কিছু ক্ষেত্রে আছে যখন একই এসপিআইডি দ্বারা একটি ব্লকড এসপিআইডি ব্লক করা হচ্ছে:

সিসপ্রসেসেস টেবিলের মধ্যে অবরুদ্ধ কলামটি আপনি এসকিউএল সার্ভার 2000 এসপি 4 ইনস্টল করার পরে ল্যাচ অপেক্ষা করতে পপুলেট হয়

যখন একটি এসপিআইডি একটি আই / ও পৃষ্ঠার ল্যাচটির জন্য অপেক্ষা করে, আপনি খেয়াল করতে পারেন যে অবরুদ্ধ কলামটি সংক্ষেপে জানিয়েছে যে এসপিআইডি নিজেকে ব্লক করছে। এই আচরণটি ডেটা পৃষ্ঠাগুলিতে আই / ও ক্রিয়াকলাপের জন্য ল্যাচগুলি যেভাবে ব্যবহৃত হয় তার একটি পার্শ্ব প্রতিক্রিয়া। যখন কোনও থ্রেড একটি আই / ও অনুরোধ জারি করে, এসপিআইডি যা I / O অনুরোধ জারি করে পৃষ্ঠায় একটি ল্যাচ অর্জন করে। সমস্ত এসকিউএল সার্ভার 2000 আই / ও অপারেশনগুলি অবিচ্ছিন্ন। সুতরাং, এসপিআইডি একই পৃষ্ঠায় আরেকটি ল্যাচ অর্জন করার চেষ্টা করবে যদি আইপি / ও অনুরোধ জারি করা এসপিআইডি অনুরোধটি শেষ হওয়ার জন্য অপেক্ষা করে থাকে। এই দ্বিতীয় ল্যাচটি প্রথম ল্যাচ দ্বারা অবরুদ্ধ। সুতরাং, অবরুদ্ধ কলামটি জানিয়েছে যে এসপিআইডি নিজেকে ব্লক করে দিচ্ছে। I / O অনুরোধটি শেষ হলে, প্রথম ল্যাচটি প্রকাশ করা হয়। তারপরে, দ্বিতীয় ল্যাচ অনুরোধ অনুমোদিত হয়।

বিকল্প উত্তর

এটি আরও ইঙ্গিত দেয় যে আপনার আইও সমস্যা হতে পারে। এই সমস্যাগুলির ফলে "অবরুদ্ধ প্রক্রিয়াগুলি" হয় তবে সম্পর্কিত বিদেশী এসপিআইডি ছাড়াই। প্রসারিত ইভেন্টগুলি পৃথক নোডে প্রক্রিয়া / এসপিআইডিটি প্রতিবেদন করতে পারে না।


আমি এই অশুদ্ধ পাঠ করা যায়নি, কিন্তু এই তথ্য প্রমাণ করে না যে বিষয় না লক উদ্দীপন? একটি উদ্ধৃত অংশ বলে "look at the blocked process report details.", এবং প্রশ্নের শীর্ষস্থানীয় এক্সএমএল হ'ল ব্লক করা প্রক্রিয়া প্রতিবেদন process এর পরে, একই উদ্ধৃত অংশটি বলে "If waitresource starts with KEY or PAG instead of OBJECT, then lock escalation isn’t involved in that specific block.", এবং অবরুদ্ধ-প্রক্রিয়া-রিপোর্ট এক্সএমএল দেখায় waitresource="KEY: 6:72057....। সুতরাং এর অর্থ এই যে এখানে "লক বাড়ানো জড়িত নয়"।
সলোমন রুটজকি

না, আপনি এটি ভুলভাবে পড়ছেন না। প্রশ্নটিতে যে বিভাগটি সরবরাহ করা হয়েছে তা এই সার্ভারে একটি সমস্যা। আমার উত্তর হ'ল সমস্যাগুলির প্রতি বিশ্বব্যাপী দৃষ্টিভঙ্গি যা অবরুদ্ধকরণ এবং লক বাড়ানোর কারণে ঘটতে পারে। আপনি যদি কিছু বড় সমস্যা (ওবিজেইসিটি স্তর লক করার জন্য ব্লকড_প্রসেস_পোর্টস) ঠিক করতে পারেন তবে ছোট সমস্যাগুলি (অন্য স্তরের ব্লকড_প্রসেস_রেপোটস) নিজেরাই সমাধান করতে পারে। এই কারণেই আমি দ্বিতীয় বিকল্প উত্তরও যুক্ত করেছি।
জন ওরফে হট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.