Поделиться через


Сжатие базы данных

Каждый файл базы данных может быть сжат с помощью удаления неиспользуемых страниц. Хотя компонент Database Engine эффективно использует дисковое пространство, возникают ситуации, когда файлам больше не требуется такой объем, как раньше. Это может привести к необходимости сжатия файла. Файлы данных и журналов транзакций можно уменьшать (сжимать). Предусмотрена возможность сжатия файлов базы данных вручную (как группы или по отдельности) или автоматически через определенные промежутки времени.

Сжатие файлов всегда ведется с конца. Например, если имеется файл размером 5 ГБ и при этом в качестве значения аргумента target_size инструкции DBCC SHRINKFILE задано 4 ГБ, компонент Database Engine освободит максимальный объем дискового пространства из последнего гигабайта файла. Если в освобождаемой части файла имеются занятые страницы, компонент Database Engine сначала переместит их в сохраняемую часть. Сжать базу данных можно только до той степени, пока в ней не останется свободного места. Например, если база данных размером 5 ГБ содержит 4 ГБ данных, а в качестве значения аргумента target_size инструкции DBCC SHRINKFILE задано 3 ГБ, будет освобожден только 1 ГБ.

Автоматическое сжатие базы данных

Если параметр базы данных AUTO_SHRINK установлен в значение ON, компонент Database Engine автоматически сжимает базы данных, в которых имеется свободное место. Этот параметр настраивается с помощью инструкции ALTER DATABASE. По умолчанию этот параметр имеет значение OFF. Компонент Database Engine периодически проверяет использование дискового пространства в каждой базе данных. Если параметру AUTO_SHRINK в базе данных присвоено значение ON, компонент Database Engine уменьшает размер файлов этой базы данных. Эта операция выполняется в фоновом режиме и не влияет на действия пользователя в базе данных.

Задание режима автоматического сжатия базы данных

ALTER DATABASE (Transact-SQL)

Сжатие базы данных вручную

Базу данных или ее файлы можно сжимать вручную с помощью инструкции DBCC SHRINKDATABASE или DBCC SHRINKFILE. Если инструкция DBCC SHRINKDATABASE или DBCC SHRINKFILE не может зарезервировать все заданное дисковое пространство в файле журнала, должно быть выдано информационное сообщение с указанием того действия, которое следует выполнить для обеспечения возможности освобождения дискового пространства. Дополнительные сведения о сжатии файлов журнала см. в разделе Сжатие журнала транзакций.

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

С помощью инструкции DBCC SHRINKDATABASE нельзя сжимать всю базу данных до размера, который меньше исходного. Поэтому, если база данных была создана с размером 10 МБ и потом увеличилась до 100 МБ, ее можно сжать только до 10 МБ, даже если все данные удалены из базы данных.

Однако с помощью инструкции DBCC SHRINKFILE можно сжимать отдельные файлы базы данных до размера, который меньше начального. При этом каждый файл следует сжимать по отдельности.

ПримечаниеПримечание

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

Сжатие базы данных

Сжатие файла данных или файла журнала

Сжатие журнала транзакций

Предусмотрены фиксированные крайние значения, до которых можно сжимать файл журнала транзакций. Размер виртуальных файлов журнала в журнале определяет пределы сжатия. Поэтому файл журнала нельзя сжать до размера, меньшего, чем размер виртуального файла журнала. Кроме того, уменьшать объем файла журнала можно только с шагом, равным размеру виртуального файла журнала. Например, файл журнала транзакций размером 1 ГБ может состоять из пяти виртуальных файлов журнала по 200 МБ каждый. При сжатии файла журнала транзакций неиспользуемые виртуальные файлы журнала удаляются, однако должно остаться как минимум два таких файла. Поскольку каждый виртуальный файл журнала в данном примере занимает 200 МБ, журнал транзакций можно сжать не менее чем до 400 МБ с шагом в 200 МБ. Чтобы иметь возможность сильнее сжать файл журнала транзакций, следует создать небольшой журнал и задать автоматический режим увеличения его размера вместо того, чтобы сразу создавать объемный файл журнала транзакций.

Команды DBCC SHRINKDATABASE или DBCC SHRINKFILE пытаются немедленно уменьшить размер файла журнала транзакций до требуемого (после округления). Перед сжатием следует выполнить резервирование файла журнала, чтобы уменьшить размер логического журнала, а также пометить как неактивные все виртуальные журналы, которые не содержат какой-либо части логического журнала. Дополнительные сведения см. в разделе Сжатие журнала транзакций.

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

При планировании сжатия базы данных или файла следует учитывать следующие соображения.

  • Наибольший эффект от операции сжатия достигается в том случае, если она выполняется после операции, создающей много неиспользуемого места (усечения или удаления таблицы).

  • Большинству баз данных для выполнения обычных ежедневных операций требуется некоторый объем свободного места. Если сжатие базы данных производится регулярно, но она снова увеличивается в размерах, это означает, что освобожденное при сжатии место требуется для регулярных операций. В таких случаях повторное сжатие базы данных бессмысленно.

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

  • Не следует устанавливать параметр базы данных AUTO_SHRINK в значение ON без достаточных на то оснований.

Уровни изоляции на основе управления версиями строк и операции сжатия

Возможно блокирование операций сжатия транзакцией, которая выполняется с уровнем изоляции на основе управления версиями строк. Например, если при выполнении масштабной операции удаления с уровнем изоляции на основе версий строк выполнить инструкцию DBCC SHRINK DATABASE, то, прежде чем приступить к сжатию файлов, она будет ожидать завершения операции удаления. В этом случае операции DBCC SHRINKFILE и DBCC SHRINKDATABASE выводят в журнал ошибок SQL Server информационное сообщение (5202 для SHRINKDATABASE и 5203 для SHRINKFILE), делая это каждые 5 минут в течение первого часа, а затем по одному сообщению каждый час.  Дополнительные сведения см. в разделе DBCC SHRINKDATABASE (Transact-SQL).