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

select COUNT(*) from t102523_2E2CF266AB2F457E888427A000F5D2F3; --820310

select COUNT(*) from t102523_BB4717747002489CBD001E91669C3967; --1051323

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

最佳答案

我们无法告诉你这些表是如何创建的。您需要检查正在运行的任何第三方或其他应用程序的代码,或者询问其他开发人员/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触发器、审计等。

关于sql - 用户表在tempdb中吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19978145/

10-09 10:02