1

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

select COUNT(*) from t102523_2E2CF266AB2F457E888427A000F5D2F3; --820310

select COUNT(*) from t102523_BB4717747002489CBD001E91669C3967; --1051323

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

4

2 回答 2

7

我们无法告诉您这些表是如何创建的。您需要检查任何第 3 方或您正在运行的其他应用程序的代码,或者询问您的开发人员/DBA 同事是否出于某种原因创建了这些特定对象。tempdb除非您告诉它,否则SQL Server 不会自动在其中创建用户表。

如果这些表是最近创建的,您可能能够在默认跟踪中找到谁创建了这些表:

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数据库中是否存在任何用户表,并追查那些罪魁祸首,因为您在其中创建的任何内容都modeltempdb在随后的重新启动时结束。

如果找不到原因,可以运行服务器端跟踪(不在 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 回答