INF: Jak monitor blokování SQL Server 7.0

Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.

Projděte si také anglickou verzi článku:251004
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Souhrn
Tento článek dokumenty, použití a návrhu uložené procedury, které lze využít k diagnostice problémů blokování a výkonu. Popis jak porozumět a vyřešit blokování naleznete v následujícím článku databáze Microsoft Knowledge Base:
224453INF: Princip a řešení problémů blokování SQL Server 7.0
Informace o těchto stejné problémy SQL Server 2000 naleznete v následujícím článku databáze Microsoft Knowledge Base:
271509INF: Jak monitor SQL Server 2000 blokování
Další informace
Postup sp_blocker_pss70 uloženy popsaný v této části digitalizuje následující informace:
  • Počáteční čas (podle počítač je spuštěn SQL Server) tak, aby tento vzorkování z blokování může být čas zarovnány ostatní informace o výkonu, jako například sledování výkonu WINDOWSNT Microsoft protokolu nebo protokolu SQL Profiler.

  • Informace o připojení k serveru SQL pomocí dotazu na systémové tabulky sysprocesses.

  • Informace o uzamčení zdroje podle dotazování systémové tabulky syslockinfo.

  • Informace o prostředku čeká spuštěním DBCC SQLPERF(WAITSTATS).

  • Aktuální spuštěna dávková SQL pro připojení, které jsou blokovány ostatním nebo blokování ostatním, spuštěním DBCC INPUTBUFFER.

  • Koncový čas podle k počítači, který je spuštěn SQL Server.
Uložená procedura byl vytvořen s následující optimalizace snížit vliv na výkon a blokování spuštěním uložené procedury:
  • Je žádný výstup generovaný Pokud alespoň jeden připojení čeká na prostředek.

  • Systémové tabulky z hlavní databáze sysprocesses a syslockinfo jsou dotazovány přímo, zvýšení výkonu a zabránit stala blokovány uložené procedury. Proto je tato uložená procedura konkrétní 7.0 Microsoft SQL Server.

  • Malé worktable vytvořen podle kurzor získat výstup INPUTBUFFER DBCC; to bude mít znatelný vliv na používání v databázi tempdb.

  • Protože blokování můžete změnit při shromažďování informací, existuje rychlého režimu, což zvyšuje výkon snížením výsledky pro příslušné řádky systémových tabulek sysprocesses a syslockinfo.

  • Pokud se pokoušíte sledovat-uzamčení prostředku čeká, existuje latch režimu, což způsobí uzamčení výstup být vynechán.
Uložená procedura je užitečné spuštěním z libovolného nástroje dotazu. Microsoft však navrhne postupujte takto provést blokování analýzy:
  1. Uložené procedury sp_blocker_pss70, která je součástí na konci tohoto článku vytvořit z libovolné nástroje dotazu při připojení s přihlášením, který má oprávnění sysadmin na SQL serveru nebo instance serveru SQL, který chcete sledovat.
  2. Vytvoření souboru skriptu s následující dotaz spustit uložené procedury smyčku. Poznámka je zpoždění mezi 5 a 60 sekund:
    WHILE 1=1BEGIN   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'ENDGO					
  3. Je navržené tento výstup je velmi užitečné v kombinaci s sledování výkonu WINDOWSNT Microsoft protokolu a protokolu SQL Profiler, takže vytváření oba současně. Informace týkající se sledování výkonu a Profiler události zachytit a informace o interpretaci výsledků naleznete v následujícím článku databáze Microsoft Knowledge Base:
    224453INF: Princip a řešení problémů blokování SQL Server 7.0
  4. Spustit soubor skriptu vytvořené v kroku 2 z buď isql.exe nebo Osql.exe dotazu nástroj z příkazového řádku systému Windows v počítači je spuštěn server SQL, které hodláte sledování potíží se sítí zabránit odpojení nástroj dotazu. Následuje příklad příkazového řádku Osql.exe, která předpokládá, že klient spustit z počítače, který je spuštěn SQL Server a soubor skriptu názvem Checkblk.sql spustit. Zkontrolujte opravit-parametr S "server" nahraďte název serveru SQL server správné parametr-i a nahradit "checkblk.sql" s cestu a název souboru skriptu vytvořené v kroku 2.
    osql -E -Sserver -icheckblk.sql -ocheckblk.out -w2000						
    Poznámka, musíte použít na příkazovém řádku přepne z následujících důvodů:

    • Zabránění zalamování řádek v výstupní soubory, které usnadňuje čtení.
    • K odeslání výstupu do souboru zadanou s - o parametr, místo na obrazovku tak, aby nástroj dotazu má problémy, můžete stále mít výstupní dokud nástroj dotaz selže.
Skript můžete použít k vytvoření sp_blocker_pss70 uložené procedury je následující:

use masterGOif exists (select * from sysobjects where id = object_id('dbo.sp_blocker_pss70') and sysstat & 0xf = 4)   drop procedure dbo.sp_blocker_pss70GOcreate proc sp_blocker_pss70 (@latch int = 0, @fast int = 1)as --version 13set nocount ondeclare @spid varchar(6)declare @blocked varchar(6)declare @time datetimedeclare @time2 datetimedeclare @time3 datetimedeclare @dbname nvarchar(128)declare @IsDetached tinyintdeclare @IsEmergencyMode tinyintdeclare @IsInLoad tinyintdeclare @IsInRecovery tinyintdeclare @IsNotRecovered tinyintdeclare @IsOffline tinyintdeclare @IsShutDown tinyintdeclare @IsSingleUser tinyintdeclare @IsSuspect tinyintset @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 != 0x0000create 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 -- Allelse  print '7 No Waittypes: ' + convert(varchar(26), @time, 121) + ' '    + convert(varchar(12), datediff(ms,@time,@time3)) + ' ' + ISNULL (@@servername,'(null)')GO 	
performance

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 251004 - Poslední kontrola: 12/05/2015 18:15:12 - Revize: 3.2

Microsoft SQL Server 7.0 Standard Edition

  • kbnosurvey kbarchive kbmt kbhowto kbinfo kbsqlserv700 KB251004 KbMtcs
Váš názor