1

SQL Server 2008 R2 を使用している運用データベース サーバーのディスク容量が不足しています。tempdb51Gにサイズアップしました。静的テーブルが含まれています。テーブルを見ると、tempdb複数のテーブルがあります。これらのテーブルのほとんどには 0 レコードがありましたが、2 つのテーブルには

select COUNT(*) from t102523_2E2CF266AB2F457E888427A000F5D2F3; --820310

select COUNT(*) from t102523_BB4717747002489CBD001E91669C3967; --1051323

これらのテーブルが作成される理由とシナリオを知りたいです。サーバーを再起動すると、ディスク領域が解放されることを知っています。また、これが発生したシナリオまたはアクションを追跡したいと考えています。この問題は、1 か月に 1 回発生することが常態化しています。

4

2 に答える 2

7

これらのテーブルがどのように作成されたかはわかりません。実行しているサードパーティまたは他のアプリケーションのコードを確認するか、仲間の開発者や DBA に、これらの特定のオブジェクトを何らかの理由で作成したかどうかを確認する必要があります。SQL Server は、指示しtempdbない限り、ユーザー テーブルを自動的に作成するだけではありません。

これらのテーブルが最近作成されたものであれば、デフォルト トレースでこれらのテーブルの作成者を見つけることができる場合があります。

DECLARE @path NVARCHAR(260);

SELECT 
   @path = REVERSE(SUBSTRING(REVERSE([path]), 
   CHARINDEX(CHAR(92), REVERSE([path])), 260)) + N'log.trc'
FROM    sys.traces
WHERE   is_default = 1;

SELECT ObjectName, HostName, ApplicationName, LoginName, StartTime
FROM sys.fn_trace_gettable(@path, DEFAULT) AS t
WHERE DatabaseName = N'tempdb'
AND ObjectName LIKE N't102523[_]%'
AND EventClass = 46 AND EventSubClass = 0
--AND EXISTS (SELECT 1 FROM tempdb.sys.tables WHERE name = t.ObjectName)
ORDER BY StartTime DESC;

運がない?ログを直接読んでみてください

まだ運がない?データベースにユーザー テーブルが存在するかどうかを確認しmodel、それらの犯人を追跡することをお勧めしmodelますtempdb

原因が見つからない場合は、サーバー側のトレースを実行して (Profiler でトレースを積極的に実行するのではなく)、キャプチャobject:createdして tempdb およびwhere name not like '#%';. 拡張イベント、DDL トリガー、監査なども検討できます。

于 2013-11-14T12:58:51.980 に答える
1

次のように、tempdb 内に DDL トリガーを作成して、誰がそれを実行したかを追跡できます。

USE tempdb;
GO

CREATE TABLE dbo.AuditCreateTable(
    LoginName sysname,
    DateCreation datetime2(0),
    App sysname,
    Host sysname,
    Info xml
)
GO

CREATE TRIGGER AuditCreateTable ON DATABASE
FOR CREATE_TABLE
AS
    INSERT INTO dbo.AuditCreateTable (LoginName, DateCreation, App, Host, Info)
    VALUES (SUSER_SNAME(), SYSDATETIME(), APP_NAME(), HOST_NAME(), EVENTDATA())
GO

インスタンスを再起動すると消えてしまうので注意してください。

于 2013-11-14T13:28:06.720 に答える