TempDB sizning kompyuteringizda to'liq bo'lishining sababini qanday topish mumkin SQL Server

Hozir ulashing:

Vaqtinchalik JB ma'lumotlar bazasi bo'lsa SQL Server bo'sh joy tugasa, u ishlab chiqarish muhitida katta uzilishlarga olib kelishi va foydalanuvchi ilovalarini muvaffaqiyatli yakunlanishiga xalaqit berishi mumkin. Vaqtinchalik JB hajmini kuzatish uchun skriptdan foydalanayotgan bo'lsangiz, vaqtinchalik ma'lumotlar bazasini to'ldirishning asosiy sababini aniqlash uchun ushbu maqoladagi skriptni qo'shing.

Tempdb to'liq - umumiy stsenariy

Tempdb Yomon yozilgan so'rovlar bir nechta vaqtinchalik obyektlarni yaratishi mumkin, natijada tempdb ma'lumotlar bazasi o'sib boradi. Bu disk maydoni haqida ogohlantirishlarga olib keladi va server muammolariga olib kelishi mumkin. Ko'p bo'lganda SQL Server Ma'lumotlar bazasi ma'murlari tempdb faylini kichraytirishni juda qiyin deb bilishadi, ular darhol serverni qayta ishga tushirishni tanlaydilar. Agar tempdb ma'lumotlar bazasini kichraytirishning barcha usullarini sinab ko'rgan bo'lsangiz va u hali ham kichraymasa, oxirgi variant SQL Service-ni konfiguratsiya menejeri orqali qayta ishga tushirishdir. Shunday qilib, disk maydoni haqidagi ogohlantirishlar to'xtaydi va server muammolari ham to'xtaydi. Biroq, agar muammo ishlab chiqarish serverida yuzaga kelgan bo'lsa, tempdb-ni qayta ishga tushirish siz uchun mavjud bo'lmasligi mumkin.

DBCC

DBCCBunday hollarda bir nechta DBCC buyruqlari mavjud bo'lib, ular ishga tushirilganda tempdb ni qisqartirishga imkon beradi. Agar siz tempdb o'lchamini faol ravishda kuzatish uchun skriptlarni o'rnatgan bo'lsangiz, tempdb to'ldiruvchilarini topish uchun ushbu skriptdan foydalanishingiz mumkin. Hozircha ushbu skript barcha bog'langan serverlarda bajariladi. Qaerda bandini qo'yish orqali uni osongina boshqarishingiz mumkin. Skriptni faqat tempdb bilan bog'liq muammo yuzaga kelganda bajarilishi mumkin. @Tserver jadvali barcha bog'langan server nomlarini saqlash uchun ishlatiladi. tempdb ma'lumotlar bazasi uchun, SQL buzilishi ma'lumotlar bazasi holatini SUSPECT sifatida o'zgartiradi va bu to'xtatiladi SQL Server boshidanoq xizmat.

DECLARE @Tserver TABLE 
  ( 
     cserver VARCHAR(200) 
  ) 

INSERT INTO @Tserver 
VALUES      ('SERVERNAME') 

DECLARE @LogTable TABLE 
  ( 
     cservername VARCHAR(200), 
     cssionid    SMALLINT, 
     callocmb    BIGINT, 
     cdeallocmb  BIGINT, 
     ctext       VARCHAR(4000), 
     cstatement  VARCHAR(4000) 
  ) 
DECLARE c1 CURSOR FOR 
  SELECT * 
  FROM   @Tserver 
DECLARE @cmd    NVARCHAR(4000), 
        @server VARCHAR(200) 

OPEN c1 

FETCH next FROM c1 INTO @server 

WHILE @@FETCH_STATUS = 0 
  BEGIN 
      SET @cmd = 'EXEC(''use tempdb Declare @Table1 table  ( cdeallopages bigint, callopages bigint, cssionid smallint, creqstid int ) insert into @Table1 SELECT SUM(internal_objects_dealloc_page_count), SUM(internal_objects_alloc_page_count), session_id, request_id  FROM sys.dm_db_task_space_usage WITH (NOLOCK) WHERE session_id <> @@SPID GROUP BY session_id, request_id declare @Table2 table ( cssionid smallint, callocmb bigint, cdeallocmb bigint, ctext varchar(4000), cstatement varchar(4000) ) insert into @Table2 SELECT TBL1.cssionid, TBL1.callopages * 1.0 / 128 , TBL1.cdeallopages * 1.0 / 128 , TBL3.text, ISNULL( NULLIF( SUBSTRING( TBL3.text,  TBL2.statement_start_offset / 2,  CASE WHEN TBL2.statement_end_offset < TBL2.statement_start_offset  THEN 0  ELSE( TBL2.statement_end_offset - TBL2.statement_start_offset ) / 2 END ), '''''''' ), TBL3.text ) FROM @Table1 AS TBL1 INNER JOIN sys.dm_exec_requests TBL2 WITH (NOLOCK) ON  TBL1.cssionid = TBL2.session_id AND TBL1.creqstid = TBL2.request_id OUTER APPLY sys.dm_exec_sql_text(TBL2.sql_handle) AS TBL3 OUTER APPLY sys.dm_exec_query_plan(TBL2.plan_handle) AS TBL4 WHERE TBL3.text IS NOT NULL OR TBL4.query_plan IS NOT NULL ORDER BY 3 DESC; Select * from @Table2'') at [' + @server + ']' 

      PRINT @cmd 

      INSERT INTO @LogTable 
                  (cssionid, 
                   callocmb, 
                   cdeallocmb, 
                   ctext, 
                   cstatement) 
      EXEC(@cmd) 

      UPDATE @LogTable 
      SET    cservername = @server 
      WHERE  cservername IS NULL 

      FETCH next FROM c1 INTO @server 
  END 

CLOSE c1 

DEALLOCATE c1 

SELECT * 
FROM   @LogTable

Muallif kirish:

Neil Varli - ma'lumotlarni qayta tiklash bo'yicha mutaxassis DataNumenMa'lumotlarni qayta tiklash texnologiyalari bo'yicha jahon yetakchisi bo'lgan , Inc Outlook-ni tiklash va excel tiklash dasturiy mahsulotlar. Qo'shimcha ma'lumot olish uchun tashrif buyuring www.datanumen.com

Hozir ulashing:

Comments are closed.