我在使用SQL Server 2008 R2的生产数据库服务器上获得的磁盘空间不足。 tempdb
大小已增加到51G。它包含静态表,我的意思是当我查看tempdb
中的表时,它有多个表。这些表中的大多数都有0条记录,但在两个表中
select COUNT(*) from t102523_2E2CF266AB2F457E888427A000F5D2F3; --820310
select COUNT(*) from t102523_BB4717747002489CBD001E91669C3967; --1051323
我想知道为什么以及在哪种情况下创建这些表。我知道如果我重新启动服务器磁盘空间将被释放。我还想跟踪发生了哪种情况或行动。这个问题在一个月内变得正常。
答案 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
请注意,如果重新启动实例,它将会消失。