Dbcc shrinkdatabase (transact-sql)

database_name | database_id | 0

Ім'я або ідентифікатор бази даних, яка повинна бути стиснута. Якщо вказано значення 0, використовується поточна база даних.

Відсоток вільного простору, яке повинно залишитися в базі даних після стиснення.

Стискає дані в файлах за допомогою переміщення розподілених сторінок з кінця файлу на місце нерозподілених сторінок на початку файлу. Аргумент target_percent є необов'язковим.

Вільне місце в кінці файлу операційної системі не повертається, і фізичний розмір файлу не змінюється. Отже, якщо зазначений аргумент NOTRUNCATE, стиснення файлів даних незначно.

Аргумент NOTRUNCATE застосуємо тільки до файлів даних. Файл журналу не зачіпається.

Звільняє весь вільний простір в кінці файлу операційній системі, але не переміщує сторінки всередині файлу. Файл даних скорочується тільки до останнього виділеного екстента. Аргумент target_percent не обробляється, якщо зазначений аргумент TRUNCATEONLY.

Аргумент TRUNCATEONLY впливає на файл журналу. Для усічення тільки файлу даних використовуйте інструкцію DBCC SHRINKFILE.

Пригнічує всі інформаційні повідомлення зі ступенями серйозності від 0 до 10.

Щоб стиснути всі файли даних і журналів зазначеної бази даних, виконайте команду DBCC SHRINKDATABASE. Щоб стиснути один файл даних або файл журналу в зазначеній базі даних, виконайте команду DBCC SHRINKFILE.

Операції DBCC SHRINKDATABASE можуть бути зупинені на будь-якому етапі процесу, при цьому вся виконана робота зберігається.

Розмір бази даних не можна зробити менше мінімального розміру бази даних. Мінімальний розмір - це розмір, зазначений при створенні бази даних, або останній розмір, явно встановлений операцією зміни розміру файлу, такий як DBCC SHRINKFILE або ALTER DATABASE. Наприклад, якщо база даних була створена з розміром 10 МБ і потім збільшилася до 100 МБ, її можна стиснути тільки до 10 МБ, навіть якщо всі дані видалені з бази даних.

Рятувальна операція DBCC SHRINKDATABASE без вказівки параметра NOTRUNCATE або TRUNCATEONLY рівносильно виконання операції DBCC SHRINKDATABASE з параметром NOTRUNCATE після виконання операції DBCC SHRINKDATABASE з параметром TRUNCATEONLY.

Стислива база даних не обов'язково повинна перебувати в режимі одного. Інші користувачі можуть працювати з базою даних при її стисненні. Це стосується і системних баз даних.

Неможливо стиснути базу даних під час створення її резервної копії. І навпаки, не можна створити резервну копію бази даних під час операції стиснення.

Робота команди DBCC SHRINKDATABASE

Інструкція DBCC SHRINKDATABASE стискає файли даних по одному, а файли журналу так, як ніби всі вони представляють один безперервний пул журналу. Стиснення файлів завжди ведеться з кінця.

Припустимо, що існує база даних з ім'ям mydb. має один файл даних і два файли журналу. Кожен файл даних і журналу має розмір 10 МБ, а файл даних містить 6 МБ даних.

Компонент Компонент Database Engine обчислює цільової розмір кожного файлу. Це розмір, до якого файл даних повинен бути стиснутий. Якщо інструкція DBCC SHRINKDATABASE вказана з аргументом target_percent. то компонент Компонент Database Engine обчислює цільової розмір таким чином, щоб у файлі після стиснення було target_percent відсотків вільного простору. Наприклад, якщо вказати аргумент target_percent зі значенням 25 для стиснення бази даних mydb. компонент Компонент Database Engine розрахує цільової розмір для файлу 8 МБ (6 МБ даних і 2 МБ вільного простору). Тому компонент Компонент Database Engine переміщує всі дані з останніх 2 МБ файлу даних в будь-який вільний простір в перших 8 МБ файлу даних, а потім стискає файл.

Припустимо, що файл даних бази даних mydb містить 7 МБ даних. При завданні значення 30 для target_percent можна стиснути цей файл даних до 30%. Однак завдання значення 40 для target_percent не дозволить стиснути файл даних, оскільки Компонент Database Engine не може зменшити файл до розміру, меншого, ніж займають дані зараз. Дану ситуацію можна уявити і іншим способом: 40 відсотків бажаного вільного простору + 70 відсотків від повного файлу даних (7 МБ з 10 МБ) більше, ніж 100 відсотків. Так як сума бажаного вивільняється відсотка і поточного відсотка, займаного файлом даних, перевищує 100 (на 10 відсотків), будь-яке значення target_size. яке більше 30, не призведе до стиснення файлу даних.

Для файлів журналу компонент Компонент Database Engine використовує аргумент target_percent для обчислення цільового розміру всього журналу. Тому аргумент target_percent є кількістю вільного простору в журналі після операції стиснення. Цільовий розмір всього журналу потім перераховується в цільової розмір кожного файлу журналу.

Інструкція DBCC SHRINKDATABASE намагається негайно стиснути кожен фізичний файл журналу до його цільового розміру. Якщо жодна частина логічного журналу не розміщується в віртуальних файлах журналу, розмір яких перевищує цільовий розмір файлу журналу, то файл буде успішно усічений і інструкція DBCC SHRINKDATABASE завершиться без будь-яких повідомлень. Однак якщо частина логічного журналу зберігається в віртуальних журналах за межами заданого розміру, то компонент Database Engine звільняє якомога більше місця, а потім формує інформаційне повідомлення. Повідомлення описує дії, які необхідно зробити, щоб перемістити логічний журнал з віртуальних журналів в кінець файлу. Після виконання всіх дій інструкція DBCC SHRINKDATABASE може бути використана для звільнення простору, що залишилося.

Так як файл журналу може бути стиснутий тільки до кордону віртуального файлу журналу, стиснення файлу журналу до розміру, меншого, ніж розмір віртуального файлу журналу, неможливо, навіть якщо він не використовується. Розмір віртуального файлу журналу динамічно вибирається компонентом Database Engine при створенні або розширенні файлів журналу.

рекомендації

Зверніть увагу на такі відомості при плануванні стиснення бази даних.

Найбільший ефект від операції стиснення досягається при її застосуванні після операції, що створює багато невикористаного простору, наприклад після усічення таблиці або видалення таблиці.

Більшості баз даних потрібен якийсь вільний простір для виконання звичайних щоденних операцій. Якщо стиснення бази даних проводиться регулярно, але вона знову збільшується в розмірах, це означає, що місце, звільнене при стисненні, необхідно для нормальної роботи. У таких випадках повторне стиснення бази даних безглуздо.

Операція стиснення не рятує від фрагментації індексів в базі даних і зазвичай призводить до ще більш сильної фрагментації. Це ще одна причина, по якій не варто виконувати регулярне стиснення бази даних.

Не слід встановлювати параметр бази даних AUTO_SHRINK в значення ON без достатніх на те підстав.

Усунення несправностей

Операції стиснення можуть бути блоковані транзакцією, запущеної з рівнем ізоляції, заснованому на управлінні версіями рядків. Наприклад, якщо при виконанні масштабної операції видалення з рівнем ізоляції, заснованому на управлінні версіями рядків, виконати інструкцію 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 (Transact-SQL) містять значення 15. Якщо стовпці transaction_sequence_num або first_snapshot_sequence_num в поданні містять меншу кількість, ніж остання транзакція, виконана операцією стиснення (109), то операція стиснення чекатиме завершення цих транзакцій.

Вирішити цю проблему можна одним з таких способів.

Перервіть виконання транзакції, яка блокує операцію стиснення.

Перервіть операцію стиснення. Вся завершена робота буде збережена.

Поки операція стиснення очікує завершення блокує транзакції, нічого робити не потрібно.