2013-11-14 3 views
1

Я получаю небольшое дисковое пространство на сервере производственной базы данных с SQL Server 2008 R2. Размер tempdb увеличился до 51G. Он содержит статические таблицы, я имею в виду, когда я смотрю на таблицы в tempdb, он имеет несколько таблиц. Большинство из этих таблиц было 0 записей, но в двух из таблицТаблица пользователей В tempdb?

select COUNT(*) from t102523_2E2CF266AB2F457E888427A000F5D2F3; --820310 

select COUNT(*) from t102523_BB4717747002489CBD001E91669C3967; --1051323 

Я хочу знать, почему и по какому сценарию этих таблиц получает created.I знать, если я перезагрузить дисковое пространство сервера освобождаются от блокировки. Я также хочу отслеживать, по какому сценарию или действию это произошло. Этот вопрос стал нормальным раз в месяц.

ответ

7

Мы не можем сказать вам, как эти таблицы были созданы. Вам нужно будет проверить код любых сторонних или других приложений, которые вы используете, или попросите своих коллег-разработчиков/администраторов баз данных, если они создали эти конкретные объекты по какой-либо причине. 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 триггеры, аудит и т.д.

+0

Как это не часто, это происходит раз в месяц. Могу ли я использовать аудит для этого на tempdb. Будет ли аудит решить мою проблему. –

+0

@Nitesh да, я думаю, вы могли бы использовать аудит для этого, но трассировка на стороне сервера (если она легка!) Или расширенные события, возможно, кажутся намного более простыми способами захвата этой активности. –

+0

Также можно отбросить эти таблицы? Будет ли это влиять на производительность или запуск баз данных? –

1

Вы можете создать триггер DDL внутри данных TempDb проследить, кто это сделал, что-то вроде этого:

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 

Имейте в виду, что она исчезнет, ​​если вам перезапустите экземпляр.

+0

Thankx. Это тоже нормально. –

+0

@Nitesh, как это поможет вам найти информацию о таблицах, которые вы уже создали? –

+0

Нет, это не поможет в уже созданных таблицах, но для дальнейшего, когда это происходит случайным образом раз в месяц, тогда трассировка или аудит будут накладными расходами. Это спокойная альтернатива. –

Смежные вопросы