Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿Terminó la copia de SQLite? Reábrala y verifíquela antes de rotar

Que la copia termine solo demuestra que acabó el proceso. Reabra el archivo exacto en modo lectura, ejecute controles de SQLite y de la aplicación, promuévalo de forma segura y rote después la última copia válida.

Ilustración técnica original del flujo de creación, reapertura, controles SQLite y de aplicación, promoción y rotación posterior.
Ilustración técnica original: el archivo exacto sigue siendo candidato hasta superar los controles estructurales, foráneos y de aplicación. Watch at Ease

Una llamada de copia de SQLite correcta es el inicio de la aceptación de restauración. Cree una ruta candidata única, cierre bien el destino y reabra ese archivo exacto en modo de solo lectura para no comprobar por error la base activa.

La aceptación necesita pruebas del motor y de la aplicación. Promueva la candidata solo tras superar todos los controles en el sistema de archivos previsto y conserve la copia válida anterior hasta reabrir con éxito el archivo promovido.

1. Cree una candidata, no el destino final

Use la API de copia en línea si la fuente sigue abierta o si importan el progreso y los lotes de páginas. Python la ofrece como Connection.backup(). VACUUM INTO también crea una instantánea coherente y compacta, pero el archivo debe ser nuevo o estar vacío; una interrupción puede dejarlo incompleto o corrupto.

Escriba la candidata en el directorio donde será promovida. Copiar solo el .db principal no es la opción predeterminada para una base WAL activa. Si el procedimiento usa copias de archivos, debe detener la base de forma segura o incluir todos los archivos auxiliares necesarios.

2. Reabra la candidata exacta en modo lectura

Cierre la conexión de destino y abra la propia candidata mediante un URI de solo lectura. No ejecute los controles mediante la conexión de origen ni con un alias que pueda apuntar a la base activa. Registre ruta, tamaño, hash, versiones de SQLite y Python, método y resultado antes de promover.

En la prueba Linux con CPython 3.12.14 y SQLite 3.53.1, la candidata de Connection.backup() se abrió en modo lectura y la ruta promovida se reabrió en un paso separado. Esa separación detecta errores de ruta que no muestra una bandera de éxito en memoria.

3. Combine controles estructurales, foráneos y de aplicación

Exija que PRAGMA quick_check devuelva exactamente una fila con ok, o use integrity_check si cabe el análisis más largo. Ninguno comprueba claves foráneas: SQLite indica que integrity_check no detecta esos errores, así que ejecute foreign_key_check por separado y exija un resultado vacío.

Después valide el contrato real: user_version o tabla de migraciones, tablas e índices obligatorios, un registro centinela, recuentos o invariantes críticos y una lectura representativa. La prueba de cuatro filas obtuvo quick_check=ok, ninguna fila foránea y sentinel=(sentinel, 3); una copia con los primeros 16 bytes dañados fue rechazada al abrirla.

4. Promueva primero y rote la copia antigua al final

Si falla un control, mantenga la candidata fuera del conjunto de rotación, conserve la última copia válida y registre la consulta exacta. No repare la candidata y la declare aceptada: cree otra instantánea para mantener clara la procedencia. Un control estructural verde tampoco prueba que los datos empresariales sean completos o actuales.

Tras superar todo, promueva con cambio de nombre o reemplazo en el mismo sistema de archivos. Python documenta que os.replace es atómico si funciona, pero puede fallar entre sistemas de archivos. Reabra la ruta promovida y repita el centinela mínimo antes de retirar la copia anterior; pruebe además la restauración completa en un entorno aislado.

Ilustración técnica original que compara API en línea, VACUUM INTO y copia controlada antes de una puerta de aceptación común.
Ilustración técnica original: cambian los métodos de creación, pero toda candidata terminada necesita la misma reapertura y verificación. Watch at Ease