У меня слишком много вторичных файлов данных (.ndf), созданных для tempdb
. Чтобы удалить лишние файлы, мне нужно очистить файл (содержимое будет перемещено в другие файлы):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
а затем удалите файл:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
Но EMPTYFILE
команда возвращает ошибку:
DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page.
Msg 2555, Level 16, State 1, Line 2
Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation.
Не волнуйтесь, мне просто нужно найти объект, который использует эту страницу, чтобы что-то с этим сделать:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
Команда возвращает много информации, в том числе object_id. Но:
Metadata: ObjectId = 0
Я понятия не имею, что с этим делать. Какая кошка мешает перемещению этой страницы? Как найти этот объект, процесс, сессию или что-то еще? Любая помощь будет принята с благодарностью, но, пожалуйста, обратите внимание, что оставить все как есть или удалить другой файл вместо этого не является правильным решением этой проблемы;).
РЕДАКТИРОВАТЬ:
Я удаляю файлы, потому что мы следовали «лучшей практике» создания одного файла на ядро процессора (тот же начальный размер, та же скорость роста). Но, насколько мне известно, до тех пор, пока вы не столкнетесь с проблемами конкуренции, нет смысла создавать дополнительные файлы tempdb на одном устройстве. В нашем случае это имеет смысл, потому что у нас включен MPIO , и устройство хранения может обрабатывать 4 пути. Но произошла ошибка, и мы получили всего 5 файлов с 6-ядерным процессором. Это больше, чем пути MPIO, меньше, чем ядра процессора, и это не четное число. Это может не вызывать никаких проблем, но просто не кажется правильным :).
Я наконец смог очистить и удалить файл без перезапуска сервера, установив одну из баз данных (которую я подозревал в возникновении проблемы) в однопользовательский режим (немедленный откат). Это сработало, но мне повезло. Что я действительно хочу, так это всегда быть в состоянии отследить страницу :).
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
О вашем решении: оно будет работать, но я бы очень хотел сделать это, не останавливая экземпляр.