หากฐานข้อมูล temp DB ของ SQL Server พื้นที่หมดอาจทำให้เกิดการหยุดชะงักที่สำคัญในสภาพแวดล้อมการผลิตของคุณและสามารถขัดขวางแอปพลิเคชันของผู้ใช้ไม่ให้เสร็จสมบูรณ์ หากคุณกำลังใช้สคริปต์เพื่อติดตามขนาด DB ชั่วคราวให้ต่อท้ายสคริปต์จากบทความนี้เพื่อระบุสาเหตุหลักของการเติม temp DB
Tempdb เต็ม - สถานการณ์ทั่วไป
การเขียนคำสั่ง SQL ที่ไม่ดีอาจสร้างอ็อบเจ็กต์ชั่วคราวจำนวนมาก ส่งผลให้ฐานข้อมูล tempdb มีขนาดใหญ่ขึ้นเรื่อยๆ ซึ่งจะทำให้เกิดการแจ้งเตือนพื้นที่ดิสก์ไม่เพียงพอและอาจทำให้เกิดปัญหาเซิร์ฟเวอร์ได้ เมื่อมีจำนวนมากเกินไป SQL Server ผู้ดูแลระบบฐานข้อมูลมักพบว่าการลดขนาดฐานข้อมูล tempdb นั้นทำได้ยากมาก พวกเขาจึงเลือกวิธีการรีสตาร์ทเซิร์ฟเวอร์ทันที หากได้ลองใช้วิธีการลดขนาดฐานข้อมูล tempdb ทุกวิธีแล้ว และยังไม่สามารถลดขนาดได้ วิธีสุดท้ายคือการรีสตาร์ท SQL Service ผ่านทาง Configuration Manager วิธีนี้จะช่วยหยุดการแจ้งเตือนพื้นที่ดิสก์ไม่เพียงพอ และปัญหาของเซิร์ฟเวอร์ก็จะหยุดลงด้วย อย่างไรก็ตาม การรีสตาร์ท tempdb อาจไม่สามารถทำได้หากปัญหาเกิดขึ้นบนเซิร์ฟเวอร์ที่ใช้งานจริง
ดีบีซีซี
ในกรณีเช่นนี้มีคำสั่ง DBCC หลายคำสั่งซึ่งเมื่อรันจะอนุญาตให้คุณลดขนาด tempdb หากคุณตั้งค่าสคริปต์เพื่อตรวจสอบขนาด tempdb ในเชิงรุกคุณสามารถใช้สคริปต์นี้เพื่อค้นหาฟิลเลอร์ของ tempdb ณ ตอนนี้สคริปต์นี้จะถูกเรียกใช้กับเซิร์ฟเวอร์ลิงค์ทั้งหมด คุณสามารถควบคุมได้อย่างง่ายดายโดยใส่ where clause คุณสามารถทำให้สคริปต์ทำงานได้ก็ต่อเมื่อมีปัญหากับ tempdb ของคุณ ตาราง @Tserver ใช้เพื่อเก็บชื่อเซิร์ฟเวอร์ที่เชื่อมโยงทั้งหมดของคุณ สำหรับฐานข้อมูล tempdb ความเสียหายของ SQL จะเปลี่ยนสถานะของฐานข้อมูลเป็น SUSPECT และสิ่งนี้จะขัดจังหวะ 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
บทนำผู้เขียน:
Neil Varley เป็นผู้เชี่ยวชาญด้านการกู้คืนข้อมูลใน DataNumen, Inc. ซึ่งเป็นผู้นำระดับโลกด้านเทคโนโลยีการกู้คืนข้อมูล ได้แก่ กู้คืน Outlook และผลิตภัณฑ์ซอฟต์แวร์กู้คืน excel ดูข้อมูลเพิ่มเติมได้ที่ wwwdatanumenด้วย.