Работа команды DBCCSHRINKDATABASE




DBCCSHRINKDATABASE (Transact-SQL)

Сокращает размер файлов данных и файлов журнала в указанной базе данных.

Синтаксис

DBCC SHRINKDATABASE

(database_name | database_id | 0

[, target_percent ]

[, { NOTRUNCATE | TRUNCATEONLY } ]

)

[ WITH NO_INFOMSGS ]

Аргументы

database_name | database_id | 0

Имя или идентификатор базы данных, которая должна быть сжата. Если указано значение 0, используется текущая база данных.

target_percent

Процент свободного пространства, которое должно остаться в базе данных после сжатия.

NOTRUNCATE

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

Свободное место в конце файла операционной системе не возвращается, и физический размер файла не изменяется. Следовательно, если указан аргумент NOTRUNCATE, сжатие файлов данных незначительно.

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

TRUNCATEONLY

Освобождает все свободное пространство в конце файла операционной системе, но не перемещает страницы внутри файла. Файл данных сокращается только до последнего выделенного экстента. Аргумент target_percent не обрабатывается, если указан аргумент TRUNCATEONLY.

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

WITHNO_INFOMSGS

Подавляет все информационные сообщения со степенями серьезности от 0 до 10.

Результирующие наборы

В следующей таблице отображены столбцы результирующего набора.

Имястолбца Описание
DbId Идентификатор базы данных, файл которой компонент КомпонентDatabaseEngine пытался сжать.
FileId Идентификатор файла, который компонент КомпонентDatabaseEngine пытался сжать.
CurrentSize Количество 8-килобайтных страниц, занятых файлом в настоящее время.
MinimumSize Минимальное количество 8-килобайтных страниц, которое может занимать файл. Оно соответствует минимальному размеру или размеру файла, указанному при создании.
UsedPages Количество 8-килобайтных страниц, используемых файлом в настоящее время.
EstimatedPages Количество 8-килобайтных страниц, до которого можно было бы сжать файл по оценке компонента Компонент DatabaseEngine.
Примечание
Компонент КомпонентDatabaseEngine не отображает строки для файлов, размер которых не был сокращен.

Замечания

Чтобы сжать все файлы данных и журналов указанной базы данных, выполните команду DBCCSHRINKDATABASE. Чтобы сжать один файл данных или файл журнала в указанной базе данных, выполните команду DBCCSHRINKFILE.

Чтобы просмотреть количество свободного (нераспределенного) пространства в базе данных, выполните процедуру sp_spaceused.

Операции DBCCSHRINKDATABASE могут быть остановлены на любом этапе процесса, при этом вся выполненная работа сохраняется.

Размер базы данных нельзя сделать меньше минимального размера базы данных. Минимальный размер — это размер, указанный при создании базы данных, или последний размер, явно установленный операцией изменения размера файла, такой как DBCCSHRINKFILE или ALTERDATABASE. Например, если база данных была создана с размером 10 МБ и потом увеличилась до 100 МБ, ее можно сжать только до 10 МБ, даже если все данные удалены из базы данных.

Выполнение операции DBCCSHRINKDATABASE без указания параметра NOTRUNCATE или TRUNCATEONLY равносильно выполнению операции DBCCSHRINKDATABASE с параметром NOTRUNCATE после выполнения операции DBCCSHRINKDATABASE с параметром TRUNCATEONLY.

Сжимаемая база данных не обязательно должна находиться в однопользовательском режиме. Другие пользователи могут работать с базой данных при ее сжатии. Это касается и системных баз данных.

Невозможно сжать базу данных во время создания ее резервной копии. И наоборот, нельзя создать резервную копию базы данных во время операции сжатия.

Работа команды DBCCSHRINKDATABASE

Инструкция DBCCSHRINKDATABASE сжимает файлы данных по одному, а файлы журнала так, как будто все они представляют один непрерывный пул журнала. Сжатие файлов всегда ведется с конца.

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

Компонент КомпонентDatabaseEngine вычисляет целевой размер каждого файла. Это размер, до которого файл данных должен быть сжат. Если инструкция DBCCSHRINKDATABASE указана с аргументом target_percent, то компонент КомпонентDatabaseEngine вычисляет целевой размер таким образом, чтобы в файле после сжатия было target_percent процентов свободного пространства. Например, если указать аргумент target_percent со значением 25 для сжатия базы данных mydb, компонент КомпонентDatabaseEngine рассчитает целевой размер для файла 8 МБ (6 МБ данных и 2 МБ свободного пространства). Поэтому компонент КомпонентDatabaseEngine перемещает все данные из последних 2 МБ файла данных в любое свободное пространство в первых 8 МБ файла данных, а затем сжимает файл.

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

Для файлов журнала компонент КомпонентDatabaseEngine использует аргумент target_percent для вычисления целевого размера всего журнала. Поэтому аргумент target_percent является количеством свободного пространства в журнале после операции сжатия. Целевой размер всего журнала затем пересчитывается в целевой размер каждого файла журнала.

Инструкция DBCCSHRINKDATABASE пытается немедленно сжать каждый физический файл журнала до его целевого размера. Если ни одна часть логического журнала не размещается в виртуальных файлах журнала, размер которых превосходит целевой размер файла журнала, то файл будет успешно усечен и инструкция DBCCSHRINKDATABASE завершится без каких-либо сообщений. Однако если часть логического журнала хранится в виртуальных журналах за пределами заданного размера, то компонент DatabaseEngine освобождает как можно больше места, а затем формирует информационное сообщение. Сообщение описывает действия, которые необходимо предпринять, чтобы переместить логический журнал из виртуальных журналов в конец файла. После выполнения всех действий инструкция DBCCSHRINKDATABASE может быть использована для освобождения оставшегося пространства.

Так как файл журнала может быть сжат только до границы виртуального файла журнала, сжатие файла журнала к размеру, меньшему, чем размер виртуального файла журнала, невозможно, даже если он не используется. Размер виртуального файла журнала динамически выбирается компонентом DatabaseEngine при создании или расширении файлов журнала.

Рекомендации

Обратите внимание на следующие сведения при планировании сжатия базы данных.

  • Наибольший эффект от операции сжатия достигается при ее применении после операции, создающей много неиспользуемого пространства, например после усечения таблицы или удаления таблицы.
  • Большинству баз данных требуется некоторое свободное пространство для выполнения обычных ежедневных операций. Если сжатие базы данных производится регулярно, но она снова увеличивается в размерах, это означает, что место, освобожденное при сжатии, необходимо для нормальной работы. В такихслучаяхповторноесжатиебазыданныхбессмысленно.
  • Операция сжатия не избавляет от фрагментации индексов в базе данных и обычно приводит к еще более сильной фрагментации. Это еще одна причина, по которой не стоит выполнять регулярное сжатие базы данных.
  • Не следует устанавливать параметр базы данных AUTO_SHRINK в значение ON без достаточных на то оснований.

Устранение неполадок

Операции сжатия могут быть блокированы транзакцией, запущенной с уровнем изоляции, основанном на управлении версиями строк. Например, если при выполнении масштабной операции удаления с уровнем изоляции, основанном на управлении версиями строк, выполнить инструкцию DBCCSHRINKDATABASE, то, прежде чем приступить к сжатию файлов, она будет ожидать завершения операции удаления. В этом случае операции DBCCSHRINKFILE и DBCCSHRINKDATABASE выводят информационное сообщение (5202 для SHRINKDATABASE и 5203 для SHRINKFILE) в журнале ошибок SQLServer каждые 5 минут в течение первого часа, а затем по одному сообщению каждый час. Например, журнал ошибок содержит следующее сообщение об ошибке:

DBCCSHRINKDATABASEfordatabaseID 9 iswaitingforthesnapshot

transaction with timestamp 15 and other snapshot transactions linked to

timestamp 15 or with timestamps older than 109 to finish.

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

Разрешить эту проблему можно одним из следующих способов.

  • Прервите выполнение транзакции, блокирующей операцию сжатия.
  • Прервите операцию сжатия. Вся завершенная работа будет сохранена.
  • Пока операция сжатия ожидает завершения блокирующей транзакции, ничего делать не нужно.

Разрешения

Необходимо быть членом предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner.

Примеры



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-28 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: