Bagaimana Mencari Sebab Mengapa TempDB Penuh dalam Anda SQL Server

Kongsi Sekarang:

Sekiranya pangkalan data temp DB anda SQL Server kehabisan ruang, ia boleh menyebabkan gangguan besar dalam persekitaran pengeluaran anda dan boleh mengganggu aplikasi pengguna dari penyelesaian yang berjaya. Jika anda menggunakan skrip untuk melacak ukuran DB temp, tambahkan skrip dari artikel ini untuk mengenal pasti akar penyebab pengisian DB temp.

Tempdb penuh - senario biasa

Tempdb Pertanyaan yang ditulis dengan buruk mungkin menghasilkan beberapa objek sementara yang mengakibatkan pangkalan data tempdb yang semakin meningkat. Ini akan berakhir dengan amaran ruang cakera dan mungkin menyebabkan masalah pelayan. Apabila ramai SQL Server Pentadbir pangkalan data mendapati sangat sukar untuk mengecilkan tempdb, mereka segera memilih untuk memulakan semula pelayan. Jika semua kaedah telah dicuba untuk mengecilkan pangkalan data tempdb dan jika ia masih tidak mengecil, pilihan terakhir adalah memulakan semula Perkhidmatan SQL melalui pengurus konfigurasi. Oleh itu, amaran ruang cakera anda akan berhenti dan masalah pelayan juga akan berhenti. Walau bagaimanapun, memulakan semula tempdb mungkin tidak tersedia untuk anda jika masalah itu berlaku pada pelayan pengeluaran.

DBCC

DBCCDalam kes seperti itu, ada beberapa perintah DBCC yang ketika dijalankan memungkinkan Anda mengecilkan tempdb. Sekiranya anda telah menyiapkan skrip untuk memantau ukuran tempdb secara proaktif, Anda dapat menggunakan skrip ini untuk mengetahui pengisi tempdb. Setakat ini, skrip ini akan dilaksanakan di semua server linkeds. Anda boleh mengawalnya dengan mudah dengan meletakkan klausa mana. Anda boleh membuat skrip untuk dilaksanakan hanya apabila ada masalah dengan tempdb anda. Jadual @Terver digunakan untuk menyimpan semua nama pelayan terpaut anda. Untuk pangkalan data tempdb, Rasuah SQL akan mengubah status pangkalan data sebagai SUSPEK dan ini akan mengganggu SQL Server perkhidmatan dari awal.

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

Pengenalan Pengarang:

Neil Varley adalah pakar pemulihan data di DataNumen, Inc., yang merupakan pemimpin dunia dalam teknologi pemulihan data, termasuk pulihkan Outlook dan produk perisian pemulihan yang unggul. Untuk maklumat lebih lanjut, lawati www.datanumen.com

Kongsi Sekarang:

Ruangan komen telah ditutup.