あなたの一時的なDBデータベースの場合 SQL Server スペースが不足すると、本番環境に大きな混乱を引き起こし、ユーザーアプリケーションの正常な完了を妨げる可能性があります。 スクリプトを使用して一時DBのサイズを追跡している場合は、この記事のスクリプトを追加して、一時DBがいっぱいになる根本的な原因を特定してください。
Tempdb full –一般的なシナリオ
不適切なクエリは、一時オブジェクトを多数作成し、tempdb データベースの肥大化を招く可能性があります。これはディスク容量不足の警告につながり、サーバーの問題を引き起こす可能性があります。 SQL Server データベース管理者はtempdbの縮小が非常に困難だと感じ、すぐにサーバーの再起動を選択します。tempdbデータベースを縮小するためのあらゆる方法を試しても縮小しない場合は、構成マネージャーを使用してSQLサービスを再起動するのが最後の手段となります。これにより、ディスク容量に関する警告が停止し、サーバーの問題も解消されます。ただし、本番サーバーで問題が発生した場合は、tempdbの再起動は利用できない可能性があります。
DBCC
このような場合、実行時にtempdbを縮小できるDBCCコマンドがいくつかあります。 tempdbのサイズをプロアクティブに監視するスクリプトを設定した場合は、このスクリプトを使用してtempdbのフィラーを見つけることができます。 現在のところ、このスクリプトはすべてのリンクサーバーで実行されます。 where句を付けることで簡単に制御できます。 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を回復する と優れた回復ソフトウェア製品。 詳細については、次のWebサイトをご覧ください。 WWW。datanumen.com