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>.defaultpasta
- Feche o Firefox se estiver em execução.
- O banco de dados do Places está no
places.sqlitearquivo Se o arquivo foi substituído devido a corrupção, use o places.sqlite.corruptarquivo para recuperação. Crie uma cópia de backup do arquivo, nomeada places.sqlite.bakou places.sqlite.corrupt.bak.
- Use o shell SQLite para abrir o arquivo de banco de dados (
sqlite3 places.sqliteou 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 INSERTcomando 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_placesestiver 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 INSERTinstruçã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 ERRORcomentário aparecer. Usando o ID para esta linha, podemos determinar onde o banco de dados está danificado. Fazemos isso usando SELECTinstruçõ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 SELECTcomando 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
INSERTinstruções no dump2.sqlarquivo 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.sqlarquivo e cole-o no dump.sqlarquivo em que o ERRORcomentário aparece.
- Substitua
ROLLBACK; -- due to errorsno final do arquivo por COMMIT;.
- Adicione o seguinte código ao topo do
dump.sqlarquivo. 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.sqlitee inicie o shell do SQLite criando um places.sqlitebanco de dados vazio usando sqlite3 places.sqlite. Digite .read dump.sqlpara 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 PRAGMAcomandos 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 BYcláusula. No entanto, ORDER BYprovavelmente 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_placesentradas de tabela com IDs seqüenciais, para que possamos assumir que toda a saída seja ordenada por ID.