როგორ მოვძებნოთ მიზეზი, რის გამოც TempDB სავსეა თქვენში SQL Server

გააზიარე ახლა:

თუ დრო DB მონაცემთა ბაზა თქვენი SQL Server ამოიწურება სივრცე, ამან შეიძლება გამოიწვიოს მნიშვნელოვანი შეფერხებები თქვენს წარმოების გარემოში და შეაფერხოს მომხმარებლის აპლიკაციები წარმატებით დასრულებიდან. თუ თქვენ იყენებთ სკრიპტს დროებითი DB ზომის დასაკვირვებლად, დაამატეთ სკრიპტი ამ სტატიიდან, რათა დაადგინოთ დროებითი DB შევსების ძირითადი მიზეზი.

Tempdb full – ჩვეულებრივი სცენარი

Tempdb ცუდად დაწერილმა შეკითხვებმა შეიძლება შექმნას რამდენიმე დროებითი ობიექტი, რაც tempdb მონაცემთა ბაზის ზრდას გამოიწვევს. ეს გამოიწვევს დისკზე სივრცის შესახებ შეტყობინებებს და შესაძლოა სერვერის პრობლემები გამოიწვიოს. როდესაც ბევრი SQL Server მონაცემთა ბაზის ადმინისტრატორებს ძალიან უჭირთ tempdb-ის შემცირება, ამიტომ ისინი მაშინვე სერვერის გადატვირთვას ირჩევენ. თუ tempdb მონაცემთა ბაზის შესამცირებლად ყველა მეთოდი ვცადეთ და თუ ის მაინც არ მცირდება, ბოლო ვარიანტია SQL სერვისის გადატვირთვა კონფიგურაციის მენეჯერის მეშვეობით. ამრიგად, თქვენი დისკის სივრცის შეტყობინებები შეწყდება და სერვერის პრობლემებიც შეწყდება. თუმცა, tempdb-ის გადატვირთვა შეიძლება ხელმისაწვდომი არ იყოს თქვენთვის, თუ პრობლემა საწარმოო სერვერზე წარმოიშვა.

DBCC

DBCCასეთ შემთხვევებში, არსებობს რამდენიმე DBCC ბრძანება, რომელიც გაშვებისას საშუალებას მოგცემთ შეამციროთ tempdb. თუ თქვენ დაყენებული გაქვთ სკრიპტები tempdb ზომის პროაქტიულად მონიტორინგისთვის, შეგიძლიათ გამოიყენოთ ეს სკრიპტი tempdb-ის შემავსებლების გასარკვევად. ამ დროისთვის, ეს სკრიპტი შესრულდება ყველა დაკავშირებულ სერვერზე. თქვენ შეგიძლიათ მარტივად გააკონტროლოთ ის, სადაც პუნქტის დაყენებით. თქვენ შეგიძლიათ გააკეთოთ სკრიპტის შესრულება მხოლოდ მაშინ, როდესაც თქვენს tempdb-სთან დაკავშირებით პრობლემაა. ცხრილი @Tserver გამოიყენება თქვენი ყველა დაკავშირებული სერვერის სახელების შესანახად. tempdb მონაცემთა ბაზისთვის, SQL კორუფცია შეცვლიდა მონაცემთა ბაზის სტატუსს, როგორც საეჭვო და ეს შეწყვეტს SQL Server მომსახურება დაწყებიდან.

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

ავტორი შესავალი:

ნილ ვარლი არის მონაცემთა აღდგენის ექსპერტი DataNumen, Inc., რომელიც მსოფლიო ლიდერია მონაცემთა აღდგენის ტექნოლოგიებში, მათ შორის Outlook-ის აღდგენა და Excel-ის აღდგენის პროგრამული პროდუქტები. დამატებითი ინფორმაციისთვის ეწვიეთ www.datanumen. ერთად

გააზიარე ახლა:

კომენტარები დახურულია.