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.

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

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

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

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

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

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

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

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

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

Команда VACUUM INTO транзакционная в том смысле, что создаваемая база данных является согласованной копией исходной базы данных. Однако, если команда VACUUM INTO прервана непредвиденным завершением работы или отключением электропитания, создаваемая база данных может быть неполной и поврежденной. Кроме того, SQLite не вызывает fsync() или FlushFileBuffers() для создаваемой базы данных, чтобы убедиться, что она достигла нелетучей памяти перед завершением.

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

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

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

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

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

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

Эта страница была последней изменёна 2023-12-05 14:43:20 UTC

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

Spec-Zone.ru

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