Sql tempdb中的用户表?

Sql tempdb中的用户表?,sql,sql-server,database,database-administration,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;

使用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;
不走运

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


如果找不到原因,您可以(不在探查器中主动运行跟踪),捕获
对象:created
,并过滤到tempdb和
,其中名称不象“#%”。您也可以考虑DDL触发器、审计等。

< P>我们不能告诉您这些表是如何创建的。您需要检查正在运行的任何第三方或其他应用程序的代码,或者询问您的开发人员/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
结束


如果找不到原因,您可以(不在探查器中主动运行跟踪),捕获
对象:created
,并过滤到tempdb和
,其中名称不象“#%”。你也可以考虑,DDL触发器,审计等。

< P>你可以在TEMPDB中创建一个DDL触发器来跟踪谁做了这个,例如:< /P>
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

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

您可以在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


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

因为它并不频繁,所以它每月发生一次。我可以在tempdb上使用audit吗。Will audit将解决我的问题。@Nitesh是的,我认为您可以使用audit来解决这个问题,但是服务器端跟踪(只要它是轻量级的!)或扩展事件似乎是捕获此活动更简单的方法。我还可以删除这些表吗?它会影响性能或数据库的运行吗?@Nitesh这里没有人能回答这个问题。如果您不知道创建这些表的原因,您如何知道这些表没有被任何人使用?当然,没有人应该依赖它们,因为它们在服务重新启动时会被丢弃,因为每次tempdb都是从头创建的。您可能需要检查
模型
数据库中是否存在任何用户表,并追查那些罪犯,因为您在
模型
中创建的任何内容在随后的重新启动时都将在tempdb中结束。@NiteshKumar如果表上的创建日期是最近的,则可能会显示在中,因为它不经常发生,所以它会在一个月内发生一次。我可以在tempdb上使用audit吗。Will audit将解决我的问题。@Nitesh是的,我认为您可以使用audit来解决这个问题,但是服务器端跟踪(只要它是轻量级的!)或扩展事件似乎是捕获此活动更简单的方法。我还可以删除这些表吗?它会影响性能或数据库的运行吗?@Nitesh这里没有人能回答这个问题。如果您不知道创建这些表的原因,您如何知道这些表没有被任何人使用?当然,没有人应该依赖它们,因为它们在服务重新启动时会被丢弃,因为每次tempdb都是从头创建的。您可能需要检查
model
数据库中是否存在任何用户表,并追查那些罪魁祸首,因为在
model
中创建的任何内容在随后的重新启动时都会在tempdb中结束。@NiteshKumar如果表上的创建日期是最近的,则可能会显示在Thankx中。这也没关系。@NiteshKumar这如何帮助您找到有关已创建表的任何信息?不,这对已创建的表没有帮助,但对于下一个表,因为它每月随机发生一次,跟踪或审核将是一项开销。这是一种安静的替代方法。@NiteshKumar所以您的最佳解决方案是手动创建一个表每次启动SQL Server服务时,都要在tempdb中审核表和DDL触发器?那么,每次启动SQL Server时,如何在该表上创建DDL触发器、表和触发器?也许你可以用另一个扳机?谢谢。这也没关系。@NiteshKumar这如何帮助您找到有关已创建表的任何信息?不,这对已创建的表没有帮助,但对于下一个表,因为它每月随机发生一次,跟踪或审核将是一项开销。这是一种安静的替代方法。@NiteshKumar所以您的最佳解决方案是手动创建一个表每次启动SQL Server服务时,都要在tempdb中审核表和DDL触发器?那么,每次启动SQL Server时,如何在该表上创建DDL触发器、表和触发器?也许你可以用另一个扳机?