Jika database DB temp Anda SQL Server kehabisan ruang, hal ini dapat menyebabkan gangguan besar dalam lingkungan produksi Anda dan dapat mengganggu aplikasi pengguna dari penyelesaian yang berhasil. Jika Anda menggunakan skrip untuk melacak ukuran DB suhu, tambahkan skrip dari artikel ini untuk mengidentifikasi akar penyebab pengisian DB suhu.
Tempdb full - skenario umum
Kueri yang ditulis dengan buruk dapat membuat beberapa objek sementara yang mengakibatkan basis data tempdb terus bertambah. Hal ini akan berujung pada peringatan ruang disk dan dapat menyebabkan masalah pada server. Ketika banyak SQL Server Administrator basis data merasa sangat sulit untuk mengecilkan tempdb, mereka langsung memilih untuk me-restart server. Jika telah mencoba semua metode untuk mengecilkan basis data tempdb dan masih belum berhasil, pilihan terakhir adalah me-restart Layanan SQL melalui pengelola konfigurasi. Dengan demikian, peringatan ruang disk Anda akan berhenti dan masalah server juga akan berhenti. Namun, me-restart tempdb mungkin tidak tersedia jika masalah tersebut terjadi pada server produksi.
DBCC
Dalam kasus seperti itu, ada beberapa perintah DBCC yang ketika dijalankan akan memungkinkan Anda untuk mengecilkan tempdb. Jika Anda telah mengatur skrip untuk secara proaktif memantau ukuran tempdb, Anda dapat menggunakan skrip ini untuk mengetahui pengisi tempdb. Sekarang, skrip ini akan dijalankan pada semua server tertaut. Anda dapat mengontrolnya dengan mudah dengan meletakkan klausa where. Anda dapat membuat script tersebut dieksekusi hanya jika ada masalah dengan tempdb Anda. Tabel @Tserver digunakan untuk menyimpan semua nama server Anda yang ditautkan. Untuk database tempdb, Kerusakan SQL akan mengubah status database sebagai SUSPECT dan ini akan mengganggu SQL Server layanan 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
Pengantar Penulis:
Neil Varley adalah pakar pemulihan data di DataNumen, Inc., yang merupakan pemimpin dunia dalam teknologi pemulihan data, termasuk memulihkan Outlook dan unggul dalam produk perangkat lunak pemulihan. Untuk informasi lebih lanjut kunjungi www.datanumen.com