vacío-stmt:

ASPIRADORAnombre-esquemaDENTROnombre del archivo

El comando VACUUM reconstruye el archivo de la base de datos y lo vuelve a empaquetar en una cantidad mínima de espacio en disco. Hay varias razones por las que una aplicación puede hacer esto:

  • A menos que SQLite se esté ejecutando en modo “auto_vacuum = FULL”, cuando se elimina una gran cantidad de datos del archivo de base de datos, deja un espacio vacío o páginas de base de datos “libres”. Esto significa que el archivo de la base de datos puede ser más grande de lo estrictamente necesario. La ejecución de VACUUM para reconstruir la base de datos recupera este espacio y reduce el tamaño del archivo de la base de datos.

  • Las inserciones, actualizaciones y eliminaciones frecuentes pueden hacer que el archivo de la base de datos se fragmente, donde los datos de una sola tabla o índice se encuentran dispersos por el archivo de la base de datos. La ejecución de VACUUM garantiza que cada tabla e índice se almacene en gran medida de forma contigua dentro del archivo de base de datos. En algunos casos, VACUUM también puede reducir el número de páginas parcialmente llenas en la base de datos, reduciendo aún más el tamaño del archivo de la base de datos.

  • Cuando se elimina contenido de una base de datos SQLite, el contenido generalmente no se borra, sino que el espacio utilizado para guardar el contenido se marca como disponible para su reutilización. Esto puede permitir que un pirata informático o un análisis forense recuperen el contenido eliminado. La ejecución de VACUUM limpiará la base de datos de todos los rastros de contenido eliminado, evitando así que un adversario recupere el contenido eliminado. Usar VACUUM de esta manera es una alternativa a configurar PRAGMA secure_delete = ON.

  • Normalmente, la base de datos page_size y si la base de datos admite o no auto_vacuum deben configurarse antes de que se cree realmente el archivo de base de datos. Sin embargo, cuando no está en modo de registro de escritura anticipada, las propiedades page_size y / o auto_vacuum de una base de datos existente pueden cambiarse usando los pragmas page_size y / o pragma auto_vacuum y luego VACUUM inmediatamente la base de datos. En el modo de registro de escritura anticipada, solo se puede cambiar la propiedad de soporte de auto_vacuum mediante VACUUM.

De forma predeterminada, VACUUM solo funciona en la base de datos principal. Las bases de datos adjuntas se pueden aspirar agregando el nombre-esquema a la sentencia VACUUM.

Advertencia de compatibilidad: La capacidad de aspirar bases de datos adjuntas se agregó en versión 3.15.0 (14 de octubre de 2016). Antes de eso, un nombre-esquema agregado a la instrucción VACUUM sería ignorado silenciosamente y el esquema “principal” sería vacío.

2.1. VACÍO con una cláusula INTO

Si se incluye la cláusula INTO, el archivo de base de datos original no se modifica y se crea una nueva base de datos con el nombre de archivo dado por el argumento de la cláusula INTO. La nueva base de datos contendrá el mismo contenido lógico que la base de datos original, completamente vacía.

El comando VACUUM con una cláusula INTO es una alternativa a la API de respaldo para generar copias de respaldo de una base de datos en vivo. La ventaja de usar VACUUM INTO es que la base de datos de respaldo resultante tiene un tamaño mínimo y, por lo tanto, la cantidad de E / S del sistema de archivos puede reducirse. Además, todo el contenido eliminado se elimina de la copia de seguridad, sin dejar rastros forenses. Por otro lado, la API de respaldo usa menos ciclos de CPU y se puede ejecutar de forma incremental.

El nombre de archivo en la cláusula INTO puede ser una expresión SQL arbitraria que se evalúa como string. El archivo nombrado por la cláusula INTO no debe existir previamente, o de lo contrario debe ser un archivo vacío, o el comando VACUUM INTO fallará con un error.

El argumento de INTO puede ser un nombre de archivo URI si los nombres de archivo URI están habilitados. Los nombres de archivo de URL están habilitados si alguno de los siguientes true:

  • La biblioteca SQLite se compiló con -DSQLITE_USE_URI = 1.
  • Las interfaces sqlite3_config (SQLITE_CONFIG_URI, 1) se invocaron en el momento de inicio.
  • La conexión de base de datos que ejecuta la instrucción VACUUM INTO se abrió originalmente con el indicador SQLITE_OPEN_URI.

El comando VACUUM INTO es transaccional en el sentido de que la base de datos de salida generada es una instantánea consistente de la base de datos original. Sin embargo, si el comando VACUUM INTO se interrumpe por un apagado no planificado o una pérdida de energía, entonces la base de datos de salida generada puede estar incompleta y dañada. Además, SQLite no invoca fsync () o FlushFileBuffers () en la base de datos generada para garantizar que haya alcanzado el almacenamiento no volátil antes de completarse.

El comando VACUUM funciona copiando el contenido de la base de datos en un archivo de base de datos temporal y luego sobrescribiendo el original con el contenido del archivo temporal. Al sobrescribir el original, se usa un diario de reversión o un archivo WAL de registro de escritura anticipada, tal como se usaría para cualquier otra transacción de base de datos. Esto significa que al aspirar una base de datos, se requiere hasta el doble del tamaño del archivo de base de datos original en espacio libre en disco.

El comando VACUUM INTO funciona de la misma manera excepto que usa el archivo nombrado en la cláusula INTO en lugar de la base de datos temporal y omite el paso de copiar la base de datos al vacío sobre la base de datos original.

El comando VACUUM puede cambiar los ROWID de las entradas en cualquier tabla que no tenga una CLAVE PRIMARIA INTEGER explícita.

VACUUM fallará si hay una transacción abierta en la conexión de la base de datos que está intentando ejecutar VACUUM. Las sentencias SQL no finalizadas normalmente mantienen abierta una transacción de lectura, por lo que VACUUM puede fallar si hay sentencias SQL no finalizadas en la misma conexión. VACUUM (pero no VACUUM INTO) es una operación de escritura y, por lo tanto, si otra conexión de base de datos tiene un bloqueo que impide las escrituras, VACUUM fallará.

Una alternativa al uso del comando VACUUM para recuperar espacio después de que se hayan eliminado los datos es el modo de vacío automático, que se habilita mediante el pragma auto_vacuum. Cuando auto_vacuum está habilitado para una base de datos, las páginas libres se pueden recuperar después de eliminar los datos, lo que hace que el archivo se reduzca, sin reconstruir toda la base de datos usando VACUUM. Sin embargo, el uso de auto_vacuum puede generar una fragmentación adicional del archivo de la base de datos. Y auto_vacuum no compacta las páginas parcialmente llenas de la base de datos como lo hace VACUUM.