INF: วิธีการตรวจสอบการบล็อกของ sql SERVER 7.0

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 251004 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

สรุป

บทความนี้เอกสารที่ใช้งานและการออกแบบของที่เก็บไว้ ขั้นตอนที่คุณสามารถใช้ในการวินิจฉัยปัญหาการบล็อกและประสิทธิภาพการทำงาน สำหรับการ อธิบายวิธีการทำความเข้าใจ และการแก้ปัญหาการบล็อก โปรดดู บทความในฐานความรู้ของ Microsoft:
224453INF: ทำความเข้าใจ และการแก้ไขปัญหาการบล็อกของ SQL Server 7.0
สำหรับข้อมูลเกี่ยวกับปัญหาเหล่านี้เหมือนกับใน SQL Server 2000 ดูบทความในฐานความรู้ของ Microsoft ต่อไปนี้:
271509INF: วิธีการตรวจสอบการบล็อคของ SQL Server 2000

ข้อมูลเพิ่มเติม

ที่sp_blocker_pss70กระบวนงานที่เก็บ การอธิบายไว้ในส่วนนี้ จับตัว ข้อมูลต่อไปนี้:
  • เวลาเริ่มต้น (ตามที่คอมพิวเตอร์ที่มี เรียกใช้ SQL Server) ดังนั้นการสุ่มตัวอย่างนี้ของบล็อกสามารถถูกจัดตำแหน่งชิดเวลาด้วย ข้อมูลประสิทธิภาพอื่น ๆ เช่นประสิทธิภาพการทำงาน Microsoft Windows NT ตรวจสอบแฟ้มบันทึกหรือแฟ้มบันทึกของผู้สร้างโปรไฟล์ของ SQL

  • ข้อมูลเกี่ยวกับการเชื่อมต่อกับ SQL Server ด้วยการสอบถาม ที่sysprocessesตารางระบบ

  • ข้อมูลเกี่ยวกับการล็อคทรัพยากร ด้วยการสอบถามsyslockinfoตารางระบบ

  • ข้อมูลเกี่ยวกับทรัพยากรรอ ด้วยการเรียกใช้การ DBCC SQLPERF(WAITSTATS)

  • ชุด SQL กำลังทำงานอยู่ที่ปัจจุบันสำหรับการเชื่อมต่อที่มี ถูกบล็อก โดยผู้ใช้คนอื่น หรือบล็อกผู้อื่น โดยการเรียกใช้การ DBCC INPUTBUFFER

  • เวลาสิ้นสุด ตามไปยังคอมพิวเตอร์ ที่กำลังเรียกใช้ SQL Server
สร้างกระบวนงานที่เก็บไว้กับข้อความต่อไปนี้ optimizations เพื่อลดผลกระทบต่อประสิทธิภาพการทำงานและการบล็อค โดยการทำงานนี้ กระบวนงานที่เก็บไว้:
  • ไม่มีผลผลิตไม่มีการสร้างขึ้นเว้นแต่ว่าอย่างน้อยหนึ่งการเชื่อมต่อ กำลังรอทรัพยากร

  • ที่sysprocessesและsyslockinfoระบบตารางจากนั้นต้นแบบฐานข้อมูลจะสอบถามโดยตรง การเพิ่มประสิทธิภาพการทำงาน และการ ป้องกันไม่ให้กระบวนงานที่เก็บไว้นี้กลายเป็นบล็อก ดังนั้น ซึ่งถูกเก็บไว้ ขั้นตอนเป็นข้อมูลเฉพาะของ Microsoft SQL Server 7.0

  • Worktable ที่ขนาดเล็กถูกสร้างขึ้น ด้วยเคอร์เซอร์เพื่อขอรับการ DBCC INPUTBUFFER ผลผลิต ซึ่งจะมีลักษณะพิเศษไม่สามารถใช้ในการtempdbฐานข้อมูล

  • เนื่องจากบล็อกสามารถเปลี่ยนได้ในขณะที่กำลังรวบรวม รายละเอียด โหมดรวดเร็วอยู่ ซึ่งเพิ่มประสิทธิภาพ โดยการลดการ ผลลัพธ์ไปยังแถวที่เกี่ยวข้องของการsysprocessesและsyslockinfoตารางระบบ

  • ถ้าพยายามติดตามไม่ใช่การล็อคทรัพยากร waits โหมด latch มีอยู่ ซึ่งทำให้ล็อกการแสดงผลจะถูกเว้นไว้
กระบวนงานที่เก็บไว้นี้เป็นประโยชน์ โดยการเรียกใช้จากแบบสอบถามใด ๆ เครื่องมือ อย่างไรก็ตาม Microsoft แนะนำให้ คุณทำตามขั้นตอนเหล่านี้จะทำให้ บล็อกการวิเคราะห์:
  1. สร้างกระบวนงานที่เก็บไว้sp_blocker_pss70ซึ่งมีการรวมในตอนท้ายของบทความนี้ จากแบบสอบถามใด ๆ เครื่องมือในขณะที่คุณเชื่อมต่อกับการเข้าสู่ระบบที่ไม่มีสิทธิ์ sysadmin บนเครื่อง เซิร์ฟเวอร์ SQL Server หรืออินสแตนซ์ของ SQL Server ที่คุณวางแผนที่จะ ตรวจสอบ
  2. สร้างแฟ้มสคริปต์กับแบบสอบถามต่อไปนี้เพื่อเรียกใช้ กระบวนงานที่เก็บไว้ในการวนรอบ โปรดสังเกตว่า การหน่วงเวลาระหว่าง 5 และ 60 วินาที:
    WHILE 1=1
    BEGIN
       EXEC master.dbo.sp_blocker_pss70
       -- Or for fast mode 
       -- EXEC master.dbo.sp_blocker_pss70 @fast=1
       -- Or for latch mode 
       -- EXEC master.dbo.sp_blocker_pss70 @latch=1
       WAITFOR DELAY '00:00:15'
    END
    GO
    					
  3. การแสดงผลนี้เป็นประโยชน์อย่างมากเมื่อรวมกับ Microsoft แฟ้มบันทึกการตรวจสอบประสิทธิภาพของ Windows NT และแฟ้มบันทึกของผู้สร้างโปรไฟล์ของ SQL ดังนั้นให้ สร้างทั้งสองที่ ระบบจะแนะนำในเวลาเดียวกัน สำหรับรายละเอียดเกี่ยวกับการใดของผู้สร้างโปรไฟล์ และ เหตุการณ์การตรวจสอบประสิทธิภาพการทำงานเพื่อจับภาพ และ สำหรับข้อมูลเกี่ยวกับวิธีการ แปลผล ดูบทความต่อไปนี้ในความรู้ของ Microsoft ฐาน:
    224453INF: ทำความเข้าใจ และการแก้ไขปัญหาการบล็อกของ SQL Server 7.0
  4. การเรียกใช้แฟ้มสคริปต์ที่สร้างขึ้นในขั้นตอนที่ 2 จากการ Isql.exe หรือ Osql.exe มือสอบถามจากพรอมต์คำสั่งของ Windows บนคอมพิวเตอร์ ที่กำลังเรียกใช้ SQL Server ที่คุณต้องการตรวจสอบเพื่อป้องกันระบบเครือข่าย ปัญหาจากการหยุดการเชื่อมต่อของเครื่องมือในการสอบถาม ต่อไปนี้เป็นคำสั่งตัวอย่าง บรรทัดเพื่อเริ่มการทำงานของ Osql.exe ซึ่งสันนิษฐานว่า ไคลเอนต์ที่มีการเรียกใช้จากคอมพิวเตอร์ ที่กำลังเรียกใช้ SQL Server และแฟ้มสคริปต์มีชื่อ Checkblk.sql ตรวจสอบให้แน่ใจว่าได้แก้ไข-Sพารามิเตอร์ แทน "server" ด้วยชื่อของ SQL Server ของคุณ เซิร์ฟเวอร์ ถูกต้อง-ฉันพารามิเตอร์ และแทน "checkblk.sql" กับเส้นทางและชื่อเพื่อ แฟ้มสคริปต์ที่สร้างขึ้นในขั้นตอนที่ 2
    osql -E -Sserver -icheckblk.sql -ocheckblk.out -w2000
    						
    หมายเหตุว่า คุณต้องใช้อื่น ๆ สวิตช์บรรทัดคำสั่งสำหรับการ ด้วยเหตุผลดังต่อไปนี้:

    • เพื่อป้องกันการตัดบรรทัดในผลลัพธ์แฟ้ม ซึ่ง ทำให้ง่ายต่อการอ่าน
    • การส่งผลลัพธ์ไปยังไฟล์ ระบุด้วย-oพารามิเตอร์ แทนที่จะไปยังหน้าจอเพื่อให้มีเครื่องมือในการสอบถามว่าถ้า ปัญหา คุณยังคงมีผลจนกว่าเครื่องมือแบบสอบถามที่ล้มเหลว
ต่อไปนี้เป็นสคริปต์ที่คุณสามารถใช้เพื่อสร้างการsp_blocker_pss70กระบวนงานที่เก็บไว้:

use master
GO

if exists (select * from sysobjects where id = object_id('dbo.sp_blocker_pss70') and sysstat & 0xf = 4)
   drop procedure dbo.sp_blocker_pss70
GO

create proc sp_blocker_pss70 (@latch int = 0, @fast int = 1)
as 
--version 13
set nocount on
declare @spid varchar(6)
declare @blocked varchar(6)
declare @time datetime
declare @time2 datetime
declare @time3 datetime
declare @dbname nvarchar(128)
declare @IsDetached tinyint
declare @IsEmergencyMode tinyint
declare @IsInLoad tinyint
declare @IsInRecovery tinyint
declare @IsNotRecovered tinyint
declare @IsOffline tinyint
declare @IsShutDown tinyint
declare @IsSingleUser tinyint
declare @IsSuspect tinyint

set @time = getdate()

select spid, ecid, blocked, waittype, dbid, 'ignore_app' = case 
  when convert(varchar(128),hostname) = 'PSSDIAG' then 1 else 0 end into #probclients
  from master..sysprocesses where blocked!=0 or waittype != 0x0000
create unique clustered index pc on #probclients (blocked, spid, ecid)
set @time3 = getdate()

if exists (select spid from #probclients where ignore_app != 1 or waittype != 0x020B)
begin
   set @time2 = getdate()
   print ''
   print '7 Start time: ' + convert(varchar(26), @time, 121) + ' ' 
     + convert(varchar(12), datediff(ms,@time,@time2)) + ' ' + convert(varchar(12), datediff(ms,@time,@time3))

   insert #probclients select distinct blocked, 0, 0, 0x0000, 0, 0 from #probclients
   where blocked not in (select spid from #probclients) and blocked != 0

   if (@fast = 1)
   begin
      print ''
      print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)
      select spid, status, blocked, open_tran, waitresource, waittype, 
         waittime, cmd, lastwaittype, cpu, physical_io,
         memusage,last_batch=convert(varchar(26), last_batch,121),
         login_time=convert(varchar(26), login_time,121), net_address,
         net_library, dbid, ecid, kpid, hostname, hostprocess,
         loginame, program_name, nt_domain, nt_username, uid, sid
      from master..sysprocesses
      where blocked!=0 or waittype != 0x0000
         or spid in (select blocked from #probclients where blocked != 0)
         or spid in (select spid from #probclients where blocked != 0)

      print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate())) 


      print ''
      print 'SYSPROC FIRST PASS'
      select spid, ecid, waittype from #probclients where waittype != 0x0000

      if exists(select blocked from #probclients where blocked != 0)
      begin
         print 'Blocking via locks at ' + convert(varchar(26), @time, 121)
         print ''
         print 'SPIDs at the head of blocking chains'

         select spid from #probclients
         where blocked = 0 and spid in (select blocked from #probclients where spid != 0)
         if @latch = 0
         begin
            print 'SYSLOCKINFO'
            set @time2 = getdate()

            select spid = convert (smallint, req_spid),
               ecid = convert (smallint, req_ecid),
               rsc_dbid As dbid,
               rsc_objid As ObjId,
               rsc_indid As IndId,
               Type = case rsc_type when 1 then 'NUL'
                                    when 2 then 'DB'
                                    when 3 then 'FIL'
                                    when 4 then 'IDX'
                                    when 5 then 'TAB'
                                    when 6 then 'PAG'
                                    when 7 then 'KEY'
                                    when 8 then 'EXT'
                                    when 9 then 'RID' end,
               Resource = substring (rsc_text, 1, 16),
               Mode = case req_mode + 1 when 1 then NULL
                                        when 2 then 'Sch-S'
                                        when 3 then 'Sch-M'
                                        when 4 then 'IS'
                                        when 5 then 'SIU'
                                        when 6 then 'IS-S'
                                        when 7 then 'IX'
                                        when 8 then 'SIX'
                                        when 9 then 'S'
                                        when 10 then 'U'
                                        when 11 then 'IIn-Nul'
                                        when 12 then 'IS-X'
                                        when 13 then 'IU'
                                        when 14 then 'IS-U'
                                        when 15 then 'X'
                                        when 16 then 'BU' end,
               Status = case req_status when 1 then 'GRANT'
                                        when 2 then 'CNVT'
                                        when 3 then 'WAIT' end
            from master.dbo.syslockinfo s,
               #probclients p
            where p.spid = s.req_spid

            print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate())) 
         end -- latch not set
      end -- blocking via locks
      else
         print 'No blocking via locks at ' + convert(varchar(26), @time, 121)
   end  -- fast set

   else  
   begin  -- Fast not set
      print ''
      print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)

      select spid, status, blocked, open_tran, waitresource, waittype, 
         waittime, cmd, lastwaittype, cpu, physical_io,
         memusage,last_batch=convert(varchar(26), last_batch,121),
         login_time=convert(varchar(26), login_time,121), net_address,
         net_library, dbid, ecid, kpid, hostname, hostprocess,
         loginame, program_name, nt_domain, nt_username, uid, sid
      from master..sysprocesses

      print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate())) 

      print ''
      print 'SYSPROC FIRST PASS'
      select spid, ecid, waittype from #probclients where waittype != 0x0000

      if exists(select blocked from #probclients where blocked != 0)
      begin 
         print 'Blocking via locks at ' + convert(varchar(26), @time, 121)
         print ''
         print 'SPIDs at the head of blocking chains'
         select spid from #probclients
         where blocked = 0 and spid in (select blocked from #probclients where spid != 0)
         if @latch = 0 
         begin
            print 'SYSLOCKINFO'
            set @time2 = getdate()

            select spid = convert (smallint, req_spid),
               ecid = convert (smallint, req_ecid),
               rsc_dbid As dbid,
               rsc_objid As ObjId,
               rsc_indid As IndId,
               Type = case rsc_type when 1 then 'NUL'
                                    when 2 then 'DB'
                                    when 3 then 'FIL'
                                    when 4 then 'IDX'
                                    when 5 then 'TAB'
                                    when 6 then 'PAG'
                                    when 7 then 'KEY'
                                    when 8 then 'EXT'
                                    when 9 then 'RID' end,
               Resource = substring (rsc_text, 1, 16),
               Mode = case req_mode + 1 when 1 then NULL
                                        when 2 then 'Sch-S'
                                        when 3 then 'Sch-M'
                                        when 4 then 'IS'
                                        when 5 then 'SIU'
                                        when 6 then 'IS-S'
                                        when 7 then 'IX'
                                        when 8 then 'SIX'
                                        when 9 then 'S'
                                        when 10 then 'U'
                                        when 11 then 'IIn-Nul'
                                        when 12 then 'IS-X'
                                        when 13 then 'IU'
                                        when 14 then 'IS-U'
                                        when 15 then 'X'
                                        when 16 then 'BU' end,
               Status = case req_status when 1 then 'GRANT'
                                        when 2 then 'CNVT'
                                        when 3 then 'WAIT' end
            from master.dbo.syslockinfo

            print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate())) 
         end -- latch not set

      end
      else
         print 'No blocking via locks at ' + convert(varchar(26), @time, 121)

   end -- Fast not set

   print ''
   print 'DBCC SQLPERF(WAITSTATS)'
   dbcc sqlperf(waitstats)
   print ''

   print ''
   Print '*********************************************************************'
   Print 'Print out DBCC INPUTBUFFER for all blocked or blocking spids.'
   Print '*********************************************************************'

   declare ibuffer cursor fast_forward for
   select cast (spid as varchar(6)) as spid, cast (blocked as varchar(6)) as blocked
   from #probclients
   where (spid <> @@spid) and (blocked!=0
      or (waittype != 0x0000 and ignore_app = 0)
      or spid in (select blocked from #probclients where blocked != 0))

   open ibuffer
   fetch next from ibuffer into @spid, @blocked
   while (@@fetch_status != -1)
   begin
      print ''
      exec ('print ''DBCC INPUTBUFFER FOR SPID ' + @spid + '''')
      exec ('dbcc inputbuffer (' + @spid + ')')

      fetch next from ibuffer into @spid, @blocked
   end
   deallocate ibuffer

   Print ''
   Print '*******************************************************************************'
   Print 'Print out DBCC OPENTRAN for active databases for all blocked or blocking spids.'
   Print '*******************************************************************************'
   declare ibuffer cursor fast_forward for
   select distinct cast (dbid as varchar(6)) from #probclients
   where dbid != 0
   open ibuffer
   fetch next from ibuffer into @spid
   while (@@fetch_status != -1)
   begin
      print ''
      set @dbname = db_name(@spid)
      select @IsDetached = DATABASEPROPERTY(@dbname,'IsDetached')
      select @IsEmergencyMode = DATABASEPROPERTY(@dbname,'IsEmergencyMode')
      select @IsInLoad = DATABASEPROPERTY(@dbname,'IsInLoad')
      select @IsInRecovery = DATABASEPROPERTY(@dbname,'IsInRecovery')
      select @IsNotRecovered = DATABASEPROPERTY(@dbname,'IsNotRecovered')
      select @IsOffline = DATABASEPROPERTY(@dbname,'IsOffline')
      select @IsShutDown = DATABASEPROPERTY(@dbname,'IsShutDown')
      select @IsSingleUser = DATABASEPROPERTY(@dbname,'IsSingleUser')
      select @IsSuspect = DATABASEPROPERTY(@dbname,'IsSuspect')

      print 'DBCC OPENTRAN FOR DBID ' + @spid + ' ['+ @dbname + ']'
      if @IsDetached + @IsEmergencyMode + @IsInLoad + @IsInRecovery + @IsNotRecovered + @IsOffline
         + @IsShutDown + @IsSingleUser + @IsSuspect = 0
         dbcc opentran(@dbname)
      else
         print 'Skipped: Status=ID=' + str(@IsDetached,1) + ' IEM=' + str(@IsEmergencyMode,1) + ' IIL=' 
           + str(@IsInLoad,1) + ' IIR=' + str(@IsInRecovery,1) + ' INR' + str(@IsNotRecovered,1) + ' IO=' 
           + str(@IsOffline,1) + ' ISD=' + str(@IsShutDown,1) + ' ISU=' + str(@IsSingleUser,1) + ' IS='
           + str(@IsSuspect,1) 
      print ''
      if @spid = '2' select @blocked = 'Y'
      fetch next from ibuffer into @spid
   end
   deallocate ibuffer
   if @blocked != 'Y' 
   begin
      print ''
      print 'DBCC OPENTRAN FOR DBID  2 [tempdb]'
      dbcc opentran ('tempdb')
   end

   print ''
   print 'End time: ' + convert(varchar(26), getdate(), 121)
end -- All
else
  print '7 No Waittypes: ' + convert(varchar(26), @time, 121) + ' '
    + convert(varchar(12), datediff(ms,@time,@time3)) + ' ' + ISNULL (@@servername,'(null)')
GO 
	

คุณสมบัติ

หมายเลขบทความ (Article ID): 251004 - รีวิวครั้งสุดท้าย: 28 มกราคม 2554 - Revision: 3.0
ใช้กับ
  • Microsoft SQL Server 7.0 Standard Edition
Keywords: 
kbhowto kbinfo kbsqlserv700 kbmt KB251004 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:251004

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com