Nota
Como o Firefox deve estar fechado para executar este procedimento, abra esta página em outro navegador da Web ou imprima-a antes de continuar.
Depois de horas de trabalho tentando recuperar o banco de dados do Places, mesmo lendo o código-fonte do Firefox, consegui obter sucesso. Aqui está como eu fiz isso:
- Baixe a versão mais recente do shell SQLite e extraia-a na sua pasta de perfil. No Windows Vista e Windows 7, está na
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
pasta
- Feche o Firefox se estiver em execução.
- O banco de dados do Places está no
places.sqlite
arquivo Se o arquivo foi substituído devido a corrupção, use o places.sqlite.corrupt
arquivo para recuperação. Crie uma cópia de backup do arquivo, nomeada places.sqlite.bak
ou places.sqlite.corrupt.bak
.
- Use o shell SQLite para abrir o arquivo de banco de dados (
sqlite3 places.sqlite
ou sqlite3 places.sqlite.corrupt
) e digite:
.output dump.sql -- sends output to file dump.sql
.dump -- dumps database to file
Como o banco de dados está corrompido, o despejo de banco de dados resultante não está completo e nem todos os dados recuperáveis foram recuperados. Para determinar onde ocorreu o erro, procure a palavra ERROR
(todas em maiúsculas) em um comentário SQL dentro do arquivo de despejodump.sql
(usei o Notepad ++ para fazer isso) e leia o INSERT
comando SQL acima para determinar a tabela em questão. No meu caso, a mesa danificada é moz_places
. (Uma descrição das tabelas encontradas no banco de dados do Places pode ser encontrada aqui , que inclui um diagrama de ER desatualizado.) Explicarei como recuperar dados adicionais somente dessa tabela; o procedimento a seguir provavelmente não é aplicável para as outras tabelas; portanto, pule estas sub-etapas se uma tabela que não moz_places
estiver envolvida.)
- Cada linha no
moz_places
tabela possui um ID. As linhas são despejadas da tabela, seguindo a ordem desse ID. 1 O ID é o primeiro valor após o parêntese de abertura na INSERT
instrução. A área em que o banco de dados está danificado provavelmente será um pequeno bloco de linhas nesta tabela; a idéia aqui é pular essa área danificada e recuperar o máximo de dados possível. A área inicial de um bloco desse tipo é representada no despejo como a linha antes do ERROR
comentário aparecer. Usando o ID para esta linha, podemos determinar onde o banco de dados está danificado. Fazemos isso usando SELECT
instruções com o ID como uma condição; esse processo leva algumas tentativas e erros. Por exemplo, se o último ID antes do erro for 49999 e o erro a seguir, o bloco danificado será iniciado no ID 50000. Use instruções como:
- suprimir saída desnecessária
- o comando a seguir é para sistemas Windows
- para Linux e outros sistemas Unix e Unix-like, use .output / dev / null
.output NUL
SELECT id FROM moz_places WHERE id> = 50100;
- Ajuste o valor após o
id >=
e repita o SELECT
comando acima até encontrar o menor valor que não faz com que o SQLite produza um erro. Esse é o ID que se refere à linha a partir da qual podemos recuperar dados adicionais. Vamos supor que esse ID seja 50200. Para despejar esses dados, digite:
.output dump2.sql
inserção de modo
SELECT * FROM moz_places WHERE id> = 50200;
- restaurar o comportamento normal da saída
.output stdout
.mode list
- Observe que as
INSERT
instruções no dump2.sql
arquivo começam com INSERT INTO table VALUES
, portanto, use o recurso localizar e substituir no seu editor de texto para substituir todas as instâncias dessa sequência por INSERT INTO moz_places VALUES
.
- Copie todo o conteúdo do
dump2.sql
arquivo e cole-o no dump.sql
arquivo em que o ERROR
comentário aparece.
- Substitua
ROLLBACK; -- due to errors
no final do arquivo por COMMIT;
.
- Adicione o seguinte código ao topo do
dump.sql
arquivo. Substitua <version>
pelo valor correto, necessário para o Firefox determinar a versão do esquema do banco de dados com base na versão do Firefox, conforme a seguir (isso pode ser encontrado no arquivo de origem do Firefox toolkit/components/places/Database.cpp
):
- Firefox 52: versão do esquema 35
- Firefox 53: versão do esquema 36
- Firefox 57: versão do esquema 39
- Firefox 58: versão de esquema 41
- Firefox 60: versão do esquema 43
- Firefox 61: versão de esquema 47
- Firefox 62: versão do esquema 52
- Firefox 69: versão de esquema 53
PRAGMA user_version = <versão>;
PRAGMA journal_mode = truncar;
PRAGMA page_size = 32768;
VÁCUO;
PRAGMA journal_mode = wal;
- Saia do shell do SQLite, exclua
places.sqlite
e inicie o shell do SQLite criando um places.sqlite
banco de dados vazio usando sqlite3 places.sqlite
. Digite .read dump.sql
para carregar o dump SQL no banco de dados.
- Inicie o Firefox e confirme se seu histórico e barra de localização estão funcionando conforme o esperado. Depois de confirmar que tudo está OK, remova os arquivos de despejo do banco de dados e o shell SQLite executável da pasta de perfil.
Informações mais relevantes podem ser encontradas nas seguintes páginas:
Um procedimento simplificado é descrito neste artigo MDN, mas eu não o testei. No entanto, eu incorporei PRAGMA
comandos atualizados desse artigo.
1 O SQL normalmente não garante que a saída do banco de dados seja fornecida em qualquer ordem, a menos que você use a ORDER BY
cláusula. No entanto, ORDER BY
provavelmente falhará ao produzir qualquer saída em um banco de dados corrompido (como o SQLite precisará ler a tabela inteira antes que possa produzir qualquer saída). Até onde eu sei, o Firefox sempre grava moz_places
entradas de tabela com IDs seqüenciais, para que possamos assumir que toda a saída seja ordenada por ID.