Spec-Zone.ru › SQLite

VACUUM

1. Синтаксис

vacuum-stmt:

VACUUM schema-name INTO filename

2. Описание

Команда VACUUM перестраивает файл базы данных, упаковывая его и сводя занимаемое дисковое пространство к минимуму. Приложение может выполнять эту команду по нескольким причинам:

  • Если SQLite работает не в режиме "auto_vacuum=FULL", после удаления большого объёма данных из файла базы данных в нём остаётся пустое пространство, или «свободные» страницы базы данных. Из-за этого файл базы данных может оказаться больше, чем это действительно необходимо. Выполнение VACUUM для перестройки базы данных позволяет освободить это пространство и уменьшить размер файла базы данных.

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

  • При удалении содержимого из базы данных SQLite оно обычно не стирается, а пространство, занятое этим содержимым, помечается как доступное для повторного использования. Это может позволить хакеру или специалисту-криминалисту восстановить удалённое содержимое. Выполнение VACUUM очищает базу данных от всех следов удалённого содержимого и тем самым не позволяет злоумышленнику его восстановить. Использование VACUUM с этой целью является альтернативой установке PRAGMA secure_delete=ON.

  • Обычно размер страницы базы данных и поддержка базой данных режима auto_vacuum должны быть настроены до фактического создания файла базы данных. Однако вне режима журнала предварительной записи свойства page_size и/или auto_vacuum существующей базы данных можно изменить с помощью прагм page_size и/или pragma auto_vacuum, а затем немедленно выполнить VACUUM для базы данных. В режиме журнала предварительной записи с помощью VACUUM можно изменить только свойство поддержки auto_vacuum.

По умолчанию VACUUM выполняется для основной базы данных. Присоединённые базы данных можно вакуумировать, добавив соответствующий schema-name в инструкцию VACUUM.

Предупреждение о совместимости: Возможность вакуумировать присоединённые базы данных появилась в версии 3.15.0 (2016-10-14). До этого добавленный в инструкцию VACUUM schema-name без предупреждения игнорировался, а вакуумировалась схема "main".

2.1. VACUUM с предложением INTO

Если указано предложение INTO, исходный файл базы данных не изменяется, а новая база данных создаётся в файле, имя которого задаётся аргументом предложения INTO. Аргумент представляет собой скалярное выражение, например текстовый литерал. Новая база данных будет содержать те же логические данные, что и исходная, и будет полностью вакуумирована.

Команда VACUUM с предложением INTO является альтернативой API резервного копирования для создания резервных копий работающей базы данных. Преимущество VACUUM INTO в том, что полученная резервная база данных имеет минимальный размер, поэтому объём операций ввода-вывода файловой системы может быть меньше. Кроме того, из резервной копии удаляется всё удалённое содержимое, не оставляя криминалистических следов. С другой стороны, API резервного копирования требует меньше циклов процессора и может выполняться инкрементально.

Имя файла в предложении INTO может быть произвольным выражением SQL, результатом вычисления которого является строка. Файл, указанный в предложении INTO, не должен существовать заранее или должен быть пустым; в противном случае команда VACUUM INTO завершится с ошибкой.

Аргумент INTO может быть именем файла URI, если включена поддержка имён файлов URI. Имена файлов URL включены, если выполняется любое из следующих условий:

  • Библиотека SQLite скомпилирована с параметром -DSQLITE_USE_URI=1.
  • При запуске был вызван интерфейс sqlite3_config(SQLITE_CONFIG_URI,1).
  • Подключение к базе данных, выполняющее инструкцию VACUUM INTO, изначально было открыто с флагом SQLITE_OPEN_URI.

Команда VACUUM INTO является транзакционной в том смысле, что созданная выходная база данных представляет собой согласованный снимок исходной базы данных. Однако если выполнение команды VACUUM INTO прервётся из-за непредвиденного отключения или потери питания, созданная выходная база данных может оказаться неполной и повреждённой.

Однако если для исходной базы данных установлено значение NORMAL или FULL параметра PRAGMA synchronous, SQLite вызывает fsync() или FileFlushBuffers(), чтобы синхронизировать выходную базу данных с диском после её записи. Это означает, что в таких случаях сбой питания или непредвиденное отключение после завершения команды VACUUM INTO не должны повредить базу данных (при условии, что ОС, файловая система и оборудование работают правильно).

3. Как работает VACUUM

Команда VACUUM работает, копируя содержимое базы данных во временный файл базы данных, а затем перезаписывая исходный файл содержимым временного файла. При перезаписи исходного файла используется журнал отката или файл WAL — журнал предварительной записи, как и при любой другой транзакции базы данных. Это означает, что для выполнения VACUUM базы данных на диске должно быть свободно место размером до двух исходных файлов базы данных.

Команда VACUUM INTO работает так же, но использует файл, указанный в предложении INTO, вместо временной базы данных и пропускает этап копирования вакуумированной базы данных поверх исходной.

Команда VACUUM может изменить ROWID записей в любых таблицах, у которых нет явного INTEGER PRIMARY KEY.

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

Альтернативой команде VACUUM для освобождения пространства после удаления данных является режим auto-vacuum, включаемый с помощью прагмы auto_vacuum. Если для базы данных включён режим auto_vacuum, после удаления данных свободные страницы могут быть освобождены, что приведёт к уменьшению размера файла без перестройки всей базы данных с помощью VACUUM. Однако использование auto_vacuum может привести к дополнительной фрагментации файла базы данных. Кроме того, auto_vacuum, в отличие от VACUUM, не уплотняет частично заполненные страницы базы данных.

Последнее обновление этой страницы: 2025-07-12 15:11:36Z

SQLite is in the Public Domain.
https://sqlite.org/lang_vacuum.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API