DBCC SHRINKFILE (Transact-SQL), Microsoft Docs
Зменшує розмір вказаного файлу даних або журналу для поточної бази даних або звільняє файл, переміщуючи дані з вказаного файла в інші файли з тієї ж файлової групи, дозволяючи видалення файлу з бази даних. Можна стиснути файл до розміру, який буде меншим, ніж розмір, вказаний під час його створення. В результаті буде встановлено нове значення мінімального розміру файлу.
Застосовується для таких об'єктів : SQL Server (починаючи з SQL Server 2008 до поточної версії).
Cінтаксичні позначення Transact-SQL
file_name Логічна назва файлу, призначеного для стиснення.
file_id Ідентифікаційний номер (ідентифікатор) файлу, призначеного для стиснення. Для отримання ідентифікатора файлу використовуйте функцію FILE_IDEX або виконайте запит на представлення каталогу sys.database_files поточної бази даних.
target_size Розмір файлу (у мегабайтах), що виражається цілим числом. Якщо не вказано, інструкція DBCC SHRINKFILE зменшує файл до розміру файлу за промовчанням. Розмір за замовчуванням є розміром, вказаним у момент створення файлу.
Можна зменшити розмір порожнього файлу, заданий за замовчуванням, за допомогою інструкції DBCC SHRINKFILE target_size. Наприклад, при створенні файлу з розміром 5 МБ і подальшому зменшенні розміру до 3 МБ, тоді як файл залишається порожнім, розмір файлу за замовчуванням дорівнює 3 МБ .Це правило застосовується лише до порожніх файлів, у яких ніколи не містилися дані.
Цей параметр не підтримується для контейнерів файлових груп FILESTREAM.
Якщо аргумент target_size вказаний, інструкція DBCC SHRINKFILE намагається стиснути файл до заданого розміру. Використовувані сторінки в частині файлу, що звільняється, переміщаються ввільне місце частини файлу, що зберігається. Наприклад, якщо розмір файлу даних становить 10 МБ, інструкція DBCC SHRINKFILE зі значенням аргументу target_size, рівним 8, переміщає всі сторінки, що використовуються останніх 2 МБ файлу, на місце будь-яких нерозподілених сторінок у перших 8 МБ файлу. Інструкція DBCC SHRINKFILE не стискає файл менше, ніж потрібно для зберігання даних у файлі. Наприклад, якщо для файлу даних, розмір якого становить 10 МБ, необхідно стиснення до 7 МБ, інструкція DBCC SHRINKFILE зі значенням аргументу target_size, що дорівнює 6, стискає файл до розміру 7 МБ, а не 6 МБ.
EMPTYFILE Виконує міграцію всіх даних із зазначеного файлу до інших файлів у тій самій файловій групі. Оскільки компонент компонент Database Engine більше не дозволяє розміщувати дані в порожньому файлі, цей файл може бути видалений інструкцією ALTER DATABASE.
Для контейнерів файлових груп FILESTREAM файл не можна видалити за допомогою ALTER DATABASE до тих пір, поки збирач сміття FILESTREAM не виконає та не видаляє всі непотрібні файли контейнерів файлових груп, які були скопійовані в інший контейнер за допомогою EMPTYFILE. Для отримання додаткових відомостей див. sp_filestream_force_garbage_collection (Transact-SQL).
Відомості про видалення контейнера FILESTREAM див. у розділі Параметри інструкції ALTER DATABASE для файлів і файлових груп (Transact-SQL).
NOTRUNCATE Переміщує розподілені сторінки з кінця файлу на місце нерозподілених сторінок на початку файлу даних із параметром target_percent або без нього. Вільне місце в кінці файлу операційній системі не повертається і фізичний розмір файлу не змінюється. Отже, якщо вказаний аргумент NOTRUNCATE файл стискається незначно.
Аргумент NOTRUNCATE застосовуєтьсялише до файлів даних. Він не впливає на файли журналу.
Цей параметр не підтримується для контейнерів файлових груп FILESTREAM.
TRUNCATEONLY Звільняє весь вільний простір в кінці файлу операційної системи, але не переміщує сторінки всередині файлу. Файл даних скорочується лише до останнього виділеного екстенту.
Аргумент target_size не обробляється, якщо вказано аргумент TRUNCATEONLY.
Параметр TRUNCATEONLY не переносить інформацію в журналі, але видаляє неактивні VLF наприкінці файлу журналу. Цей параметр не підтримується для контейнерів файлових груп FILESTREAM.
WITH NO_INFOMSGS Пригнічує виведення всіх інформаційних повідомлень.
Результуючі набори
У наступній таблиці відображаються стовпці результуючого набору.
DbId
Ідентифікатор бази даних, файл якої компонент Компонент Database Engine намагався стиснути.
FileId
Ідентифікаційний номер файлу, стиснення якого було зроблено компонентом Компонент Database Engine.
CurrentSize
Кількість 8-кілобайтних сторінок, зайнятих файлом нині.
MinimumSize
Мінімальна кількість 8-кілобайтних сторінок, яка може займати файл. Він відповідає мінімальному розміру або розміру файлу, вказаному під час створення.
UsedPages
Кількість 8-кілобайтних сторінок, які використовуються файлом зараз.
ЧастинийPages
Кількість 8-кілобайтних сторінок, до якого можна було б стиснути файл за оцінкою компонента Компонент Database Engine.
Інструкція DBCC SHRINKFILE застосовується до файлів у поточній базі даних. Для отримання додаткових відомостей про зміну поточної бази даних див. USE (Transact-SQL).
Операції DBCC SHRINKFILEможуть бути зупинені будь-якому етапі процесу, у своїй вся виконана робота зберігається.
У разі збою операції DBCC SHRINKFILE виникає помилка.
Стискаема база даних необов'язково повинна перебувати в режимі одного користувача; під час виконання стиснення файлу у базі даних можуть працювати інші користувачі. Для стиснення системних баз даних також не обов'язково запускати екземпляр SQL Server в режимі одного користувача.
Стиснення файлу журналу
Компонент Database Engine використовує аргумент target_size для обчислення цільового розміру всього журналу. Тому аргумент target_size є кількістю вільного простору журналу після операції стиснення. Потім за заданим розміром журналу розраховуються задані розміри кожного файлу журналу. Інструкція DBCC SHRINKFILE відразу намагається стиснути кожен фізичний файл журналу до наміченого розміру. Однак якщо частина логічного журналу зберігається у віртуальних журналах за межами заданого розміру, то компонент Компонент Database Engine звільняє якнайбільше місця, а потім формує інформаційне повідомлення. Повідомлення описує дії, які потрібно зробити, щоб перемістити логічний журнал з віртуальних журналів на кінець файлу. Після виконання всіх дій інструкція DBCC SHRINKFILE може бути використана для звільнення простору, що залишився.
Так як файл журналу може бути стиснутий лише до межі віртуального файлу журналу, стиснення файлу журналу до розміру, меншого, ніж розмір віртуального файлу журналу, неможливе, навіть якщо він не використовується. Розмір віртуального файлу журналу динамічно вибирається компонентом Компонент Database Engine під час створення чи розширення файлів журналу.
Рекомендації
Приймітьдо уваги наступні відомості під час планування стиснення файлу.
Найбільший ефект від операції стиснення досягається при її застосуванні після операції, що створює багато простору, що не використовується, наприклад після усічення таблиці або видалення таблиці.
Більшість баз даних потребує певного вільного простору для виконання звичайних щоденних операцій. Якщо стиснення бази даних проводиться регулярно, але вона знову збільшується в розмірах, це означає, що місце, звільнене під час стиснення, необхідне нормальної роботи. У разі повторне стиснення бази даних безглуздо.
Операція стиснення не позбавляє фрагментації індексів у базі даних і зазвичай призводить до ще більш сильної фрагментації. Це ще одна причина, через яку не варто виконувати регулярне стиснення бази даних.
Усунення несправностей
Цей розділ описує методи діагностики та усунення проблем, які можуть виникнути під час виконання команди DBCC SHRINKFILE:
Файл не вдалося стиснути
Якщо операція стиснення виконується без помилки, але файл не змінюється у розмірі, переконайтеся, що він має вільний простір для видалення, виконавши одну з таких операцій.
Виконайте наступний запит.
Виконайте команду DBCC SQLPERF, щоб звільнити простір, що використовується журналом транзакцій.
Якщо вільного простору недостатньо, операція стиснення не зможе зменшити розмір файлу надалі.
Зазвичай це файл журналу, який незначно стискається. Це характерно для журнального файлу, який не був усічений. Можна усікти файл журналу, встановивши значення SIMPLE для моделі відновлення бази даних або створивши резервну копію журналу, а потім виконавши операцію DBCC SHRINKFILE знову.
Операцію стиснення заблоковано
Операції стиснення можуть бути блоковані транзакцією, запущеною з рівнем ізоляції, що базується на керуванні версіями рядків. Наприклад, якщо при виконанні масштабної операції видалення з рівнем ізоляції, заснованому на керуванні версіями рядків, виконати інструкцію DBCC SHRINK DATABASE, то, перш ніж приступити до стиснення файлів, вона буде очікувати на завершення операції видалення. У цьому випадку операції DBCC SHRINKFILE та DBCC SHRINKDATABASE виводять інформаційне повідомлення (5202 для SHRINKDATABASE і 5203 для SHRINKFILE) у журнал помилок SQL Server кожні 5 хвилин протягом першої години, а потім по одному повідомленню щогодини. Наприклад, якщо журнал помилок містить таке повідомлення про помилку, буде наступна помилка.
Це означає, що операція стиснення блокується транзакціями моментального знімка, які мають позначки часу старше, ніж мітка 109, що представляє останню транзакцію, що завершує операцію стиснення. Це також показує, що стовпціtransaction_sequence_num абоfirst_snapshot_sequence_num у динамічному поданні управління sys.dm_tran_active_snapshot_database_transactions містять значення 15. Якщо стовпціtransaction_sece m в поданні містять менше число, ніж остання транзакція, виконана операцією стиснення (109), то операція стиснення буде чекати завершення цих транзакцій.
Вирішити цю проблему можна одним із таких способів.
Перервіть виконання транзакції, яка блокує операцію стиснення.
Перервіть операцію стиснення. Якщо операцію стиснення перервано, будь-яка завершена робота збережена.
Поки операція стиснення чекає на завершення блокуючої транзакції, нічого робити не потрібно.
Дозволи
Необхідно бути членом певної ролісервераsysadmin або визначеної ролі бази данихdb_owner.
А.Стискання файлу даних до вказаного цільового розміру
У наступному прикладі розмір файлу даних з ім'ям DataFile1 в базі даних користувача UserDB стискається до 7 МБ.
Б.Стискання файлу журналу до вказаного цільового розміру
У цьому прикладі файл журналу в базі даних AdventureWorks стискається до 1 МБ. Щоб дозволити команді DBCC SHRINKFILE стиснути файл, спочатку необхідно врізати його, встановивши значення SIMPLE у моделі відновлення бази даних.
В.Усічення файлу даних
У цьому прикладі усікається первинний файл даних у базі даних AdventureWorks. Виконується запит на представлення каталогу sys.database_files для отримання ідентифікатора файлу даних file_id.
Г.Очищення файлу
Наступний приклад демонструє процедуру звільнення файлу його видалення з бази даних. Для цього прикладу створено файл даних, який містить дані.