Eu tive alguns problemas com minha RAM (tela azul várias vezes, Windows XP) e agora meus bancos de dados do Firefox estão danificados. Firefox está funcionando, mas a minha história se foi e ele está relatando várias inconsistências e erros quando execução pragma integrity_check
em places.sqlite
:
imagem de disco do banco de dados está malformada
Agora a pergunta, como faço para reparar bancos de dados SQLite?
Respostas:
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:
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
pastaplaces.sqlite
arquivo Se o arquivo foi substituído devido a corrupção, use oplaces.sqlite.corrupt
arquivo para recuperação. Crie uma cópia de backup do arquivo, nomeadaplaces.sqlite.bak
ouplaces.sqlite.corrupt.bak
.sqlite3 places.sqlite
ousqlite3 places.sqlite.corrupt
) e digite: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 oINSERT
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ãomoz_places
estiver envolvida.)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 naINSERT
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 doERROR
comentário aparecer. Usando o ID para esta linha, podemos determinar onde o banco de dados está danificado. Fazemos isso usandoSELECT
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:id >=
e repita oSELECT
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:INSERT
instruções nodump2.sql
arquivo começam comINSERT INTO table VALUES
, portanto, use o recurso localizar e substituir no seu editor de texto para substituir todas as instâncias dessa sequência porINSERT INTO moz_places VALUES
.dump2.sql
arquivo e cole-o nodump.sql
arquivo em que oERROR
comentário aparece.ROLLBACK; -- due to errors
no final do arquivo porCOMMIT;
.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 Firefoxtoolkit/components/places/Database.cpp
):places.sqlite
e inicie o shell do SQLite criando umplaces.sqlite
banco de dados vazio usandosqlite3 places.sqlite
. Digite.read dump.sql
para carregar o dump SQL no banco de dados.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 gravamoz_places
entradas de tabela com IDs seqüenciais, para que possamos assumir que toda a saída seja ordenada por ID.fonte
Bem, dependendo de como está danificado, o reparo pode não ser possível. Sua melhor aposta é provavelmente tentar despejar o banco de dados usando
sqlite
e ver o que você pode recuperar.Se isso falhar, você provavelmente precisará restaurar a partir do backup.
Para despejar e recriar um banco de dados, use o comando
.dump
:fonte
d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db
. Todos os favicons agora se foram, mas eu eles estão reconstruindo enquanto visito os sites. Obrigado novamente!places.sqlite.corrupt
arquivo. Postei outra resposta com uma solução que funcionou para mim.Como sempre, ao executar um reparo como esse, recomendo que você faça primeiro pelo menos uma cópia de backup do seu arquivo places.sqlite localizado no diretório do seu perfil. Ter um backup permite que você tente várias coisas diferentes para reparar esses problemas, sabendo que, se a tentativa de reparo piorar as coisas, você sempre poderá fazer outra cópia do backup para tentar novamente.
Dependendo do que está corrompido e de quanto está corrompido, pode ser possível corrigir os problemas com a extensão Manutenção de Locais . Acabei com um arquivo places.sqlite corrompido em algumas ocasiões. A Manutenção de Locais conseguiu resolver o problema toda vez executando várias verificações / correções que ele fornece como operações em sua caixa de diálogo de opções. As várias verificações e / ou relatórios diferentes devem levar apenas alguns minutos a minutos.
Se isso não funcionar, seguir o caminho de corrigi-lo manualmente de maneira semelhante ao que o DragonLord descreve acima pode ser o necessário.
fonte
Esse processo descrito no MDN me ajudou a resolver um problema em que novas páginas que visitei não foram registradas no histórico do navegador. Eu não tinha um arquivo
places.sqlite.corrupt
(ouplaces.sqlite-corrupt
), mas a verificação da integridade do meuplaces.sqlite
arquivo revelou que a imagem do disco do banco de dados está com um erro de formato.Saia do Firefox e faça um backup do seu perfil do Firefox antes de prosseguir aqui.
Inicie o Firefox. A história deve estar funcionando novamente.
Estou em um Mac com Firefox 60.0.1. Pode ser necessário ajustar os comandos para sua plataforma.
fonte