Inspector de bases de datos SQLite
Lee un archivo de base de datos SQLite como lo hace SQLite: directamente de los bytes, sin motor SQL y sin que nada salga de tu equipo. La cabecera de 100 bytes da el tamaño de página, la codificación del texto, si la base está en modo rollback o WAL, cuántas páginas hay en la lista de libres, el user_version y el application_id que guarda la aplicación, y con qué versión de SQLite se escribió por última vez. Después se recorre el árbol b de sqlite_schema en la página uno para listar cada tabla, índice, vista y disparador con la sentencia CREATE que lo definió, y el árbol de cada tabla se recorre hasta las hojas, de modo que las filas se cuentan en lugar de estimarse. Conviene conocer dos límites antes de fiarse de una cifra. En modo WAL las confirmaciones más recientes suelen estar en el archivo -wal y no en el principal, así que una base sin checkpoint informará de menos filas de las que ve la aplicación; copia también el -wal o ejecuta un checkpoint si la diferencia importa. Y una tabla WITHOUT ROWID guarda sus filas en un árbol de índice, por lo que su cuenta aparece como desconocida en vez de inventada. Los nombres de columna, los tipos declarados y las marcas PRIMARY KEY y NOT NULL se extraen del texto de la sentencia CREATE, lo que cubre los esquemas corrientes pero puede fallar con un DDL poco habitual: la sentencia siempre se muestra para que la compruebes. Las bases cifradas, SQLCipher incluida, se rechazan en lugar de leerse a medias, porque su cabecera también está cifrada y no empieza por la cadena mágica. Los datos de las filas no se muestran a propósito: esto responde qué hay en el archivo y cuánto ocupa, no qué dice un registro concreto.
Cómo usar
- Suelta el archivo .sqlite, .db o .sqlite3 sobre el recuadro, o haz clic para elegirlo. Se queda en el navegador.
- Lee primero la cabecera: el tamaño de página por el número de páginas da el tamaño del archivo, y las páginas libres son lo que devolvería un VACUUM.
- Comprueba el modo de diario. Si es WAL, las confirmaciones que sigan en el -wal no están aquí, así que toma las filas como un mínimo.
- Repasa la lista de tablas para ver las filas, las columnas con su tipo declarado y los índices de cada tabla.
- Abre la sentencia CREATE de una tabla cuando la lista de columnas parezca rara: el DDL original manda.
Preguntas frecuentes
- ¿Por qué el número de filas no coincide con el que muestra mi aplicación?
- Casi siempre por el registro de escritura anticipada. En modo WAL, SQLite añade las páginas nuevas y modificadas a un archivo -wal aparte y solo las integra en la base principal en un checkpoint, así que una base copiada sin su archivo acompañante es una instantánea del último checkpoint. Esta herramienta lee solo el archivo que le das, de modo que pueden faltar inserciones recientes. Ejecuta PRAGMA wal_checkpoint(TRUNCATE) antes de copiar, o copia también los archivos -wal y -shm. La otra causa es una tabla WITHOUT ROWID, cuya cuenta se muestra como desconocida en lugar de equivocada.
- ¿Puede abrir una base cifrada, por ejemplo con SQLCipher?
- No, y lo dirá en vez de enseñarte cualquier cosa. SQLCipher cifra la cabecera junto con las páginas, así que un archivo cifrado no empieza por los bytes "SQLite format 3" y no hay nada que analizar sin la clave. Esa comprobación es además lo que distingue un archivo cifrado de uno corrupto: una base truncada pero sin cifrar conserva una cabecera legible, y entonces se lee lo que se puede y se avisa de que el número de páginas no cuadra con la longitud del archivo.
- ¿Qué son las páginas libres? ¿Debo ejecutar VACUUM?
- Borrar filas no encoge el archivo: las páginas que las contenían pasan a la lista de libres para reutilizarse en inserciones futuras. Las páginas libres son, por tanto, espacio que el archivo ya posee y volverá a usar. VACUUM reconstruye la base sin ellas y devuelve el espacio al sistema de archivos, lo que compensa tras un borrado grande o antes de distribuir la base, pero reescribe el archivo entero e invalida las conexiones abiertas, así que no es algo que se ejecute a la ligera en producción.
- ¿Qué significan user_version y application_id?
- Son dos huecos de 32 bits en la cabecera que SQLite nunca toca y que las aplicaciones usan como quieran. Lo habitual es emplear user_version como contador de migraciones del esquema — la aplicación lo compara con la versión que espera su código y ejecuta las migraciones intermedias — y application_id como número mágico que identifica el formato del archivo, para que file(1) y herramientas similares distingan un tipo de base SQLite de otro. Ambos valen cero si nadie los ha fijado.
- ¿En qué se diferencian la versión y el formato del esquema?
- La versión del esquema, que SQLite llama cookie del esquema, es un contador que sube cada vez que cambia el esquema; las sentencias preparadas lo comparan para saber que deben recompilarse. El formato del esquema es la generación de la disposición del archivo, entre 1 y 4, e indica qué funciones puede usar: 4 permite índices descendentes y literales booleanos, y es lo que escribe cualquier SQLite de las últimas dos décadas.
- ¿Se sube el archivo a algún sitio?
- No. La base se lee con la File API del propio navegador y la analiza JavaScript en la página; no se envía nada a un servidor y no hay componente de servidor al que enviarlo. Puedes comprobarlo abriendo la página, desconectando la red e inspeccionando un archivo igualmente: todo sigue funcionando porque la herramienta entera ya está en la página.
Herramientas relacionadas
Inspector de .npy y .npz de NumPy
Lee la cabecera de un .npy o .npz en el navegador: dtype, shape, orden de bytes, campos y una vista de valores, sin NumPy y sin subir nada.
Inspector de contenedor Ogg
Recorre un .ogg, .oga u .opus página por página: posiciones de gránulo, tablas de segmentos, comprobación de CRC32 y los flujos lógicos del contenedor.
Inspector de archivos gzip (.gz)
Lee la cabecera de un .gz campo por campo, recorre todos sus miembros y verifica el tráiler recalculando el CRC32 y el tamaño real en tu navegador.
Inspector de archivos TZif (zoneinfo)
Abre un archivo zoneinfo compilado en el navegador: cabecera, tipos de hora local, transiciones, segundos intercalares y el pie POSIX TZ.
Inspector de binarios ELF
Abre un ejecutable de Linux, un .so o un .o en tu navegador: arquitectura, bibliotecas que necesita, Build ID y si trae PIE, NX y RELRO.
Visor de archivos ICS y reglas de repetición
Abre una invitación .ics o una exportación de calendario y lee lo que contiene de verdad, con las fechas reales que genera una regla de repetición.