¿Cómo recuperar una base de datos SQLite3 corrupta?

Esta es una pregunta de seguimiento a una publicación respondida previamente: ¿Existe una utilidad de línea de comandos para validar bases de datos SQLite en Linux?

Si una base de datos produce el siguiente error:

$ sqlite3 mydata.db "PRAGMA integrity_check" Error: database disk image is malformed 

¿Hay algún proceso de limpieza que se pueda hacer para recuperar la base de datos a un estado utilizable? ¿Incluso ante la posible pérdida de algunos registros corruptos?

Gracias

Si hubiera algún método automático, SQLite ya podría hacerlo.

A veces, la corrupción es única o principalmente en índices, en cuyo caso sería posible obtener algunos o la mayoría de los registros tratando de volcar toda la base de datos con .dump , y usar esos comandos para crear una nueva base de datos:

 $ sqlite3 mydata.db ".dump" | sqlite3 new.db 

Sin embargo, esto no siempre es posible.

La forma más fácil y confiable es restaurar el archivo de base de datos desde la copia de seguridad.

Tenía un archivo sqlite que estaba dañado y que mostraba un síntoma como este.

 select count(*) from corruptTable; return:38000; 

Pero cuando intentaba cargar los registros con

 select * from corruptTable; 

Solo devolvería 7 registros.

Intenté varias cosas, pero estos pasos fueron los más exitosos.

En un Mac, abra el terminal y ejecute estos comandos en su base de datos corrupta. (estos son comandos sqlite3, por lo que debería poder usar otros editores sqlite3 o comandos similares en otros sistemas).

 1 sqlite3 dbWithCorruptTable.sqlite (Obviously replace "dbWithCorruptTable" to your sqlite3 file that has the corrupt table) 2 .mode insert 3 .output dump_all.sql 4 .dump 5 .exit 6 Manually edit the dump_all.sql file in a text editor and remove the transaction statements. Usually there is a "BEGIN TRANSACTION" statement on the 2nd line of the file and a "ROLLBACK" statement on the last line. Remove these and save the file 

Estos pasos fueron tomados de este sitio web: http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed/

Si la base de datos está seriamente corrupta, el .dump contendrá errores, y algunos datos pueden perderse.

Para esquemas de datos más complejos, esto significará registros huérfanos y / o parciales que pueden confundir a la aplicación.

Puede ser preferible .dump un archivo y luego usar un editor de texto para eliminar las filas problemáticas. Busque ERROR dentro del archivo de volcado.

Pude reparar mi archivo de historial de Chrome (que es un archivo de base de datos sqlite3) de esta manera:

 sqlite3.exe History ".backup History-new" 

Sé que esta es una vieja pregunta, pero aún me gustaría compartir mi solución. Mi problema fue que una base de datos sqlite3 de kodi (xbmc) estaba corrupta

.dump no funcionó en mi caso

file is encrypted or is not a database

Lo que funcionó es lo siguiente.

  1. Hizo una copia de seguridad del antiguo archivo db
  2. Deja que kodi cree un nuevo archivo db
  3. Marcado en este lado el formato de encabezado de los archivos sqlite
  4. Abrió ambos archivos con un editor hexadecimal (bendiga) y verificó los primeros 96 Bytes
  5. Los primeros 40 bytes fueron diferentes y copié los primeros 40 bytes del nuevo archivo db al archivo anterior db
  6. ¡Después de hacer esto, mi archivo de base de datos funcionó nuevamente!

Algo se comparte en esta publicación de blog – http://wordpress.semnaitik.com/2017/02/01/repair-sqlite-database/

El autor dice que podemos arreglar la base de datos SQLite corrupta manualmente. ¿Cómo? Primero, podemos exportar la base de datos SQLite al archivo SQL. Y después de eso, podemos importarlo de nuevo a SQLite desde SQL. No tengo idea si es útil o no. Puedes intentarlo una vez. La publicación del blog contiene información útil sobre la base de datos SQLite y su corrupción.

Gracias.

Esto funcionó para mí:

Descargue el paquete de herramientas sqlite3 desde aquí y colóquelo en cualquier carpeta. Coloque su base de datos corrupta en la misma carpeta.

Abra un símbolo del sistema.

Escriba lo siguiente:

sqlite3.exe

(Presione Enter)

NAME_OF_YOUR_CORRUPTED_DATABASE> “.dump” | sqlite3 new.db

(Presione enter)

Todas las otras soluciones no funcionaron para mí.

La siguiente solución funcionó para reparar mi base de datos sin ejecutar ninguna herramienta de línea de comandos.

Obtuve el mensaje de error “la imagen de disco de la base de datos está mal formada” cuando estaba trabajando con una de mis tablas, así que ejecuté [PRAGMA integrity_check] que me devolvió

Freelist principal: el conteo de la página libre en el encabezado es demasiado pequeño

En árbol, página 16198 celda 1: segunda referencia a la página 14190

La página 16988 nunca se usa

La página 46637 nunca se usa

Falta la fila 4493 del índice indexname1

Falta la fila 4493 del índice indexname2

Falta la fila 4493 del índice indexname3

Primero guardé el esquema de la tabla con los índices incorrectos para poder recrear esos índices. Luego solté los índices de nombre de índice 1, 2 y 3 con el comando [drop index _]. Exporté mis tablas una por una a archivos JSON y luego trunqué cada tabla. Ejecutar la verificación de integridad en ese punto fue exitoso. Luego agregué los tres índices nuevamente con el comando [create index _] e importé los registros de cada tabla desde su exportación de archivos JSON. Ejecutar el comando de verificación de integridad todavía está regresando “ok” con todos los registros restaurados.