用户表在tempdb中?

时间:2013-11-14 12:52:40

标签: sql sql-server database database-administration

我在使用SQL Server 2008 R2的生产数据库服务器上获得的磁盘空间不足。 tempdb大小已增加到51G。它包含静态表,我的意思是当我查看tempdb中的表时,它有多个表。这些表中的大多数都有0条记录,但在两个表中

select COUNT(*) from t102523_2E2CF266AB2F457E888427A000F5D2F3; --820310

select COUNT(*) from t102523_BB4717747002489CBD001E91669C3967; --1051323

我想知道为什么以及在哪种情况下创建这些表。我知道如果我重新启动服务器磁盘空间将被释放。我还想跟踪发生了哪种情况或行动。这个问题在一个月内变得正常。

2 个答案:

答案 0 :(得分: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;

没有运气? Try reading the log directly

还没运气?您可能想要检查model数据库中是否存在任何用户表,并追踪这些罪魁祸首,因为您在model中创建的任何内容都将在tempdb中以及随后的重新启动时结束。

如果找不到原因,可以run a server-side trace(不在Profiler中主动运行跟踪),捕获object:created并过滤到tempdb和where name not like '#%';。您还可以考虑Extended Events,DDL触发器,审核等

答案 1 :(得分: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

请注意,如果重新启动实例,它将会消失。