Cách tìm lý do tại sao TempDB có đầy trong của bạn SQL Server

Chia sẻ ngay bây giờ:

Nếu cơ sở dữ liệu DB tạm thời của bạn SQL Server hết dung lượng, nó có thể gây ra sự gián đoạn lớn trong môi trường sản xuất của bạn và có thể làm gián đoạn các ứng dụng của người dùng khi hoàn tất thành công. Nếu bạn đang sử dụng tập lệnh để theo dõi kích thước DB tạm thời, hãy nối thêm tập lệnh từ bài viết này để xác định nguyên nhân gốc rễ của việc điền DB tạm thời.

Tempdb full – một tình huống phổ biến

tạm thời Các truy vấn được viết kém có thể tạo ra nhiều đối tượng tạm thời, dẫn đến cơ sở dữ liệu tempdb ngày càng lớn. Điều này sẽ dẫn đến cảnh báo về dung lượng ổ đĩa và có thể gây ra sự cố cho máy chủ. Khi có nhiều đối tượng tạm thời như vậy. SQL Server Các quản trị viên cơ sở dữ liệu thường gặp khó khăn trong việc thu nhỏ tempdb, và họ thường chọn phương án khởi động lại máy chủ. Nếu đã thử mọi phương pháp để thu nhỏ cơ sở dữ liệu tempdb mà vẫn không được, lựa chọn cuối cùng là khởi động lại dịch vụ SQL thông qua trình quản lý cấu hình. Như vậy, cảnh báo về dung lượng ổ đĩa sẽ biến mất và các sự cố máy chủ cũng sẽ chấm dứt. Tuy nhiên, việc khởi động lại tempdb có thể không khả thi nếu sự cố xảy ra trên máy chủ sản xuất.

ĐBCC

ĐBCCTrong những trường hợp như vậy, có một số lệnh DBCC mà khi chạy sẽ cho phép bạn thu nhỏ tempdb. Nếu bạn đã thiết lập các tập lệnh để chủ động giám sát kích thước tempdb, thì bạn có thể sử dụng tập lệnh này để tìm ra các bộ đệm của tempdb. Hiện tại, tập lệnh này sẽ được thực thi trên tất cả các máy chủ được liên kết. Bạn có thể kiểm soát nó dễ dàng bằng cách đặt mệnh đề where. Bạn có thể làm cho tập lệnh chỉ được thực thi khi có sự cố với tempdb của bạn. Bảng @Tserver được sử dụng để lưu trữ tất cả các tên máy chủ được liên kết của bạn. Đối với cơ sở dữ liệu tempdb, tham nhũng SQL sẽ thay đổi trạng thái của cơ sở dữ liệu thành SUSPECT và điều này sẽ làm gián đoạn SQL Server dịch vụ từ đầu.

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

Giới thiệu tác giả:

Neil Varley là một chuyên gia phục hồi dữ liệu trong DataNumen, Inc., công ty hàng đầu thế giới về công nghệ khôi phục dữ liệu, bao gồm phục hồi Outlook và các sản phẩm phần mềm phục hồi excel. Để biết thêm thông tin, hãy truy cập www.datanumennăm

Chia sẻ ngay bây giờ:

Được đóng lại.