Nota
Debido a que Firefox debe estar cerrado para realizar este procedimiento, asegúrese de abrir esta página en otro navegador web o imprimirla antes de continuar.
Después de horas de trabajo intentando recuperar la base de datos de Places, incluso leyendo el código fuente de Firefox, logré hacerlo. Así es como lo hice:
- Descarga la última versión del shell SQLite y extraerlo en su carpeta de perfil. En Windows Vista y Windows 7, está en el
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
carpeta.
- Cierre Firefox si se está ejecutando.
- La base de datos de Lugares está en el
places.sqlite
expediente. Si el archivo fue reemplazado debido a un daño, use la places.sqlite.corrupt
archivo para la recuperación. Crear una copia de seguridad del archivo, llamado places.sqlite.bak
o places.sqlite.corrupt.bak
.
- Utilice el shell de SQLite para abrir el archivo de base de datos (
sqlite3 places.sqlite
o sqlite3 places.sqlite.corrupt
), luego ingrese:
.output dump.sql -- sends output to file dump.sql
.dump -- dumps database to file
Debido a que la base de datos está dañada, el volcado de la base de datos resultante no está completo y no se han recuperado todos los datos recuperables. Para determinar dónde ocurrió el error, busque la palabra ERROR
(todo mayúsculas) en un comentario SQL dentro del archivo de volcado dump.sql
(Solía Bloc de notas ++ para hacer esto), y leer el SQL INSERT
Comando arriba para determinar la tabla en cuestión. En mi caso, la mesa dañada es moz_places
. (Se puede encontrar una descripción de las tablas encontradas en la base de datos de Lugares aquí ; Se puede encontrar un diagrama ER bastante desactualizado aquí . Explicaré cómo recuperar datos adicionales de esta tabla solamente; es probable que el siguiente procedimiento no sea aplicable para las otras tablas, por lo que debe omitir estos pasos secundarios si la tabla no es moz_places
esta involucrado.)
- Cada fila en el
moz_places
La tabla tiene una identificación. Las filas se vuelcan de la tabla siguiendo el orden de este ID. 1 El ID es el primer valor después del paréntesis de apertura en el INSERT
declaración. El área donde la base de datos está dañada probablemente sea un pequeño bloque de filas en esta tabla; La idea aquí es saltarse esta área dañada y recuperar la mayor cantidad de datos posible. El área de inicio de dicho bloque se representa en el volcado como la fila antes de la ERROR
aparece el comentario. Usando la ID para esta fila, podemos determinar dónde está dañada la base de datos. Lo hacemos usando SELECT
declaraciones con el ID como condición; Este proceso requiere un poco de prueba y error. Por ejemplo, si el último ID anterior al error fue 49999, y el error aparece a continuación, el bloque dañado comienza en el ID 50000. Use declaraciones como:
-- suppress unnecessary output
-- the following command is for Windows systems
-- for Linux and other Unix and Unix-like systems, use .output /dev/null
.output NUL
SELECT id FROM moz_places WHERE id >= 50100;
- Ajustar el valor siguiendo el
id >=
y repite lo anterior SELECT
hasta que encuentre el valor más pequeño que no haga que SQLite genere un error. Este es el ID que se refiere a la fila a partir de la cual podemos recuperar datos adicionales. Asumamos que esta ID es 50200. Para volcar estos datos, ingrese:
.output dump2.sql
.mode insert
SELECT * FROM moz_places WHERE id >= 50200;
-- restore normal output behavior
.output stdout
.mode list
- Tenga en cuenta que el
INSERT
declaraciones en el dump2.sql
el archivo comienza con INSERT INTO table VALUES
, entonces use la función de buscar y reemplazar en su editor de texto para reemplazar todas las instancias de esta cadena con INSERT INTO moz_places VALUES
.
- Copiar todo el contenido de la
dump2.sql
archívalo y pégalo en el dump.sql
archivo donde el ERROR
aparece el comentario.
- Reemplace la
ROLLBACK; -- due to errors
al final del archivo con COMMIT;
.
- Agregue el siguiente código en la parte superior de la
dump.sql
expediente. Reemplazar <version>
con el valor correcto, que se requiere para que Firefox determine la versión del esquema de la base de datos según la versión de Firefox, como se muestra a continuación (se puede encontrar en el archivo fuente de Firefox) toolkit/components/places/Database.cpp
):
- Firefox 50: esquema de la versión 33
- Firefox 51: esquema de la versión 34
- Firefox 52: versión de esquema 35
- Firefox 53: versión de esquema 36
- Firefox 57: versión de esquema 39
- Firefox 58: esquema de la versión 41
- Firefox 60: esquema de la versión 43
- Firefox 61: esquema de la versión 47
PRAGMA page_size=4096;
PRAGMA user_version=<version>;
- Salir del shell SQLite, eliminar
places.sqlite
, luego inicie el shell SQLite creando un vacío places.sqlite
base de datos utilizando sqlite3 places.sqlite
. Tipo .read dump.sql
para cargar el volcado de SQL en la base de datos.
- Inicie Firefox y confirme que su historial y la barra de ubicación funcionan correctamente. Una vez que haya confirmado que todo está bien, elimine los archivos de volcado de la base de datos y el ejecutable del shell SQLite de la carpeta del perfil.
Más información relevante se puede encontrar en las siguientes páginas:
1 Normalmente, SQL no garantiza que la salida de la base de datos se dará en ningún orden a menos que use el ORDER BY
cláusula. Sin embargo, ORDER BY
es probable que no produzca ningún resultado en una base de datos dañada (ya que SQLite necesitará leer la tabla completa antes de que pueda generar cualquier resultado) Por lo que yo sé, Firefox siempre escribe moz_places
entradas de tabla con ID secuenciales, por lo que podemos suponer que todas las salidas están ordenadas por ID.