손상된 Firefox places.sqlite 데이터베이스를 어떻게 복구합니까?


15

내 RAM (블루 스크린, Windows XP)에 문제가있어 Firefox 데이터베이스가 손상되었습니다. Firefox가 작동하지만 내 기록이 사라졌으며 다음을 실행할 때 몇 가지 불일치 및 오류가보고 pragma integrity_check됩니다 places.sqlite.

데이터베이스 디스크 이미지가 잘못되었습니다

이제 질문은 어떻게 SQLite-Databases를 복구합니까?


2
나중에 참조 할 수 있도록 FEBE (Firefox Environment Backup Extension)가 나중에 도움이 될 수 있습니다. 전체 프로파일을 복사하고 단일 백업으로 패키지합니다. 귀하의 질문에 대한 답변이 아니라는 것을 알고 있지만 향후에 알아두면 도움이 될 수 있습니다. bit.ly/aumThw
Urda

Google 직원이이 질문을 쉽게 찾을 수 있도록 수정되었습니다.
bwDraco

답변:


22

노트

이 절차를 수행하려면 Firefox를 닫아야합니다. 계속 진행하기 전에 다른 웹 브라우저에서이 페이지를 열거 나 인쇄하십시오.


Places 데이터베이스를 복구하려고 노력하고 Firefox 소스 코드를 읽은 후에도 성공했습니다. 내가 한 방법은 다음과 같습니다.

  • 최신 버전의 SQLite 셸을 다운로드 하여 프로필 폴더에 추출하십시오. Windows Vista 및 Windows 7의 경우 C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default폴더에 있습니다.
  • Firefox가 실행 중이면 닫습니다.
  • 지역 정보 데이터베이스가 places.sqlite파일에 있습니다. 파일이 손상으로 인해 교체 된 경우 파일을 사용하여 places.sqlite.corrupt복구하십시오. places.sqlite.bak또는 이라는 파일의 백업 복사본을 만듭니다 places.sqlite.corrupt.bak.
  • SQLite 쉘을 사용하여 데이터베이스 파일 ( sqlite3 places.sqlite또는 sqlite3 places.sqlite.corrupt)을 연 후 다음을 입력하십시오.
.output dump.sql    -- sends output to file dump.sql
.dump               -- dumps database to file
  • 데이터베이스가 손상되었으므로 결과 데이터베이스 덤프가 완료되지 않았으며 복구 가능한 데이터가 모두 검색되지 않았습니다. 오류가 발생한 위치를 판별하려면 ERROR덤프 파일 내의 SQL 주석에서 단어 (모두 대문자)를 검색하고 ( 노트 패드 ++dump.sql사용 하여이 작업을 수행함) 위 의 SQL 명령을 읽고 해당 테이블을 판별하십시오. 필자의 경우 손상된 테이블은 입니다. (장소 데이터베이스에있는 표에 대한 설명은 여기 에서 찾을 수 있으며 여기 에는 오래된 ER 다이어그램이 포함되어 있습니다.)이 표에서 추가 데이터를 복구하는 방법 만 설명합니다. 다음 절차는 다른 테이블에는 적용되지 않을 수 있으므로 다른 테이블 이 관련된 경우에는이 하위 단계를 건너 뛰십시오 .)INSERTmoz_placesmoz_places

    • moz_places테이블의 각 행 에는 ID가 있습니다. 이 ID의 순서에 따라 테이블에서 행이 덤프됩니다. 1 ID는 INSERT명세서 에서 여는 괄호 다음의 첫 번째 값 입니다. 데이터베이스가 손상된 영역은이 테이블에서 작은 행 블록 일 수 있습니다. 여기서 손상된 부분을 건너 뛰고 가능한 많은 데이터를 복구하는 것이 좋습니다. 이러한 블록의 시작 영역은 ERROR주석이 나타나기 전에 행으로 덤프에 표시됩니다. 이 행의 ID를 사용하여 데이터베이스가 손상된 위치를 확인할 수 있습니다. SELECTID가 포함 된 명령문을 조건으로 사용하여이를 수행 합니다. 이 과정에는 시행 착오가 필요합니다. 예를 들어, 오류 이전의 마지막 ID가 49999이고 오류가 뒤 따르면 손상된 블록은 ID 50000에서 시작합니다.

    -불필요한 출력을 억제
    -다음 명령은 Windows 시스템 용입니다.
    -Linux 및 기타 Unix 및 Unix 계열 시스템의 경우 .output / dev / null을 사용하십시오.
    출력 NUL
    
    moz_places에서 ID 선택 여기서 id> = 50100;
    
    • SQLite가 오류를 출력하지 않는 가장 작은 값을 찾을 때까지 다음 값을 조정하고 id >=위의 SELECT명령을 반복하십시오 . 추가 데이터를 복구 할 수있는 시작 행을 나타내는 ID입니다. 이 ID가 50200이라고 가정합니다.이 데이터를 덤프하려면 다음을 입력하십시오.

    .output dump2.sql
    .mode insert
    SELECT * FROM moz_places 여기서 id> = 50200;
    
    -정상적인 출력 동작 복원
    출력 stdout
    .mode 목록
    
    • 파일 의 INSERT명령문은로 dump2.sql시작 INSERT INTO table VALUES하므로 텍스트 편집기에서 찾기 및 바꾸기 기능을 사용하여이 문자열의 모든 인스턴스를로 바꾸십시오 INSERT INTO moz_places VALUES.
    • dump2.sql파일 의 전체 내용을 복사하여 주석이 나타나는 dump.sql파일에 붙여 넣습니다 ERROR.
  • ROLLBACK; -- due to errors파일 끝 의을로 바꿉니다 COMMIT;.
  • dump.sql파일 맨 위에 다음 코드를 추가 하십시오. 교체 <version>(이 파이어 폭스의 소스 파일에서 찾을 수 있습니다 다음과 같이 파이어 폭스의 버전에 따라 데이터베이스 스키마의 버전을 확인하기 위해 파이어 폭스에 필요한 올바른 값으로 toolkit/components/places/Database.cpp) :
    • Firefox 52 : 스키마 버전 35
    • Firefox 53 : 스키마 버전 36
    • Firefox 57 : 스키마 버전 39
    • Firefox 58 : 스키마 버전 41
    • Firefox 60 : 스키마 버전 43
    • Firefox 61 : 스키마 버전 47
    • Firefox 62 : 스키마 버전 52
    • Firefox 69 : 스키마 버전 53

PRAGMA user_version = <버전>;
PRAGMA journal_mode = 자르기;
PRAGMA page_size = 32768;
진공;
PRAGMA journal_mode = 월;
  • SQLite 쉘을 종료하고 삭제 places.sqlite한 다음를 places.sqlite사용하여 빈 데이터베이스를 작성하는 SQLite 쉘을 시작하십시오 sqlite3 places.sqlite. .read dump.sqlSQL 덤프를 데이터베이스에로드하려면 입력 하십시오.
  • Firefox를 시작하고 기록 및 위치 표시 줄이 의도 한대로 작동하는지 확인하십시오. 모든 것이 정상임을 확인한 후에는 프로파일 폴더에서 데이터베이스 덤프 파일 및 SQLite 쉘 실행 파일을 제거하십시오.

더 관련 정보는 다음 페이지에서 찾을 수 있습니다.

간단한 절차는 이 MDN 기사에 설명되어 있지만 테스트하지는 않았습니다. 그럼에도 불구하고, 나는 PRAGMA그 기사에서 업데이트 된 명령을 통합했습니다 .


1 SQL은 일반적으로 ORDER BY절 을 사용하지 않는 한 데이터베이스 출력이 어떤 순서로든 제공되는 것을 보증하지 않습니다 . 그러나 ORDER BYSQLite는 출력을 생성하기 전에 전체 테이블을 읽어야하므로 손상된 데이터베이스에서 출력을 생성하지 못할 수 있습니다. 내가 아는 한 Firefox는 항상 moz_places순차적 ID로 테이블 항목을 작성 하므로 모든 출력이 ID별로 정렬되어 있다고 가정 할 수 있습니다.


3
이것은 굉장합니다. 손상된 places.sqlite에서 거의 모든 기록을 복구하는 데 도움이되었습니다. 고마워요 !!
Ashutosh Jindal

두 가지 수정으로 도움이되었습니다. 1) ";"추가 user_version 라인에서; 2) 어떤 이유로 든 내 "손상된"파일의 스키마 버전이 예상보다 "1이 적습니다". 메소드가 처음에 작동하지 않으면 덤프를 10MB의 새 데이터베이스로 가져 오려고 시도했지만 이전 테이블의 열 수가 적어 실패했습니다. 소스 코드 링크를 보면 무슨 일이 있었는지 이해할 수있었습니다. 멋진 게시물 !!!
Tilman Hausherr

@TilmanHausherr : 해결되었습니다. 열 변경 문제를 피하려면 데이터베이스 스키마가 변경되지 않도록 손상을 발견하자마자 Firefox를 업데이트하기 전에이 답변의 단계를 따르십시오. 이전 스키마 버전을 설정해 볼 수도 있습니다. 데이터베이스를 복원 할 때 Firefox에서 새 버전으로 업데이트합니다.
bwDraco

이전 스키마 버전을 설정하는 것은 첫 번째 주석을 쓸 때 수행 한 작업입니다. 즉, 이미 성공했습니다 :-) 네, 손상이 즉시 발견되지 않았다고 생각합니다. 문자를 입력 할 때만 "이전 URL"이 나타나고 아무 일도 일어나지 않습니다.
Tilman Hausherr

잘했습니다! 당신이 그것을 업데이트 한 것을 기쁘게 생각합니다.이 문제는 내가 발견 한 적극적인 질문으로 되돌아갑니다.
fixer1234

4

손상의 정도에 따라 수리가 불가능할 수 있습니다. 가장 좋은 방법은를 사용하여 db를 덤프하고 덤프 sqlite한 다음 구할 수있는 것을 확인하는 것입니다.

실패하면 백업에서 복원해야합니다.

데이터베이스를 덤프하고 다시 작성하려면 다음 명령을 사용하십시오 .dump.

sqlite places.sqlite .dump | sqlite places-new.sqlite

1
감사합니다. SO 게시물은 작동하지 않아 도움이되지 않았지만 링크에서 참조 된 솔루션은 작동했습니다 d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db. 모든 파비콘이 사라졌지 만 사이트를 방문하면서 재 구축 중입니다. 다시 감사합니다!
바비

위 질문의 stackoverflow.com/questions/2255305/… 링크는 작성자가 자발적으로 제거했습니다. 아래 답변 이 도움이 될 수 있습니다.
user66001

@ user66001 : 예. OP가 질문을 삭제했습니다. 관련 명령을 복사했습니다.
썰매

이것은 나를 위해 작동하지 않았고 결국 places.sqlite.corrupt파일로 끝났습니다 . 나는 나를 위해 일한 해결책으로 다른 대답 을 올렸다 .
Daniel

2

항상 이와 같은 복구를 수행 할 때 먼저 프로필 디렉토리에있는 places.sqlite 파일의 백업 복사본을 하나 이상 만드는 것이 좋습니다. 백업을 수행하면 이러한 문제를 해결하기 위해 여러 가지 다른 작업을 시도 할 수있을뿐만 아니라 복구 시도로 인해 문제가 악화되는 경우 항상 다시 시도 할 백업 사본을 다시 만들 수 있다는 것을 알고 있습니다.

손상된 항목과 손상 정도에 따라 Places Maintenance 확장 프로그램의 문제를 해결할 수 있습니다 . 나는 몇 번에 손상된 places.sqlite 파일로 끝났습니다. 작업 공간 유지 보수 는 옵션 대화 상자에서 조작으로 제공하는 다양한 점검 / 수정을 실행하여 매번 문제점을 해결할 수있었습니다. 다양한 검사 및 / 또는보고는 몇 분에서 몇 분 정도 걸립니다.

이것이 작동하지 않으면 DragonLord가 위에서 설명한 것과 유사한 방식으로 수동으로 수정하는 경로를 따르는 것이 필요할 수 있습니다.


1

MDN에 설명 된프로세스는 내가 방문한 새 페이지가 브라우저 기록에 기록되지 않는 문제를 해결하는 데 도움이되었습니다. 나는하지 않았다 places.sqlite.corrupt(또는 places.sqlite-corrupt) 파일을,하지만 내의 무결성 확인 places.sqlite파일은 공개 데이터베이스 디스크 이미지 형식이 잘못된 오류입니다.

더 이상 진행하기 전에 Firefox를 종료하고 Firefox 프로필을 백업하십시오.

$ cd /Users/<username>/Library/Application\ Support/Firefox/Profiles/<profile_dir>/
$ cp places.sqlite places.sqlite.bak  # for safety

$ sqlite3 places.sqlite
sqlite> PRAGMA integrity_check;
*** in database main ***
On tree page 2 cell 131: Rowid 20884 out of order
...
Error: database disk image is malformed
sqlite> .clone places-clone.sqlite
moz_places... done
moz_historyvisits... done
... more output like above plus a few errors (which I ignored) like
sqlite_sequence... Error: object name reserved for internal use: sqlite_sequence
SQL: [CREATE TABLE sqlite_sequence(name,seq)]
done
...
sqlite> PRAGMA user_version;
43  <----- TAKE NOTE OF THIS VALUE it may be different for you
sqlite> .exit

$ sqlite3 places-clone.sqlite
sqlite> PRAGMA integrity_check;
ok
sqlite> PRAGMA user_version = 43;  -- use the number you got from PRAGMA user_version; above
sqlite> PRAGMA journal_mode = truncate;
truncate
sqlite> PRAGMA page_size = 32768;
sqlite> VACUUM;
sqlite> PRAGMA journal_mode = wal;
wal
sqlite> .exit

$ mv places-clone.sqlite places.sqlite

Firefox를 시작하십시오. 역사는 다시 작동해야합니다.

Firefox 60.0.1이 설치된 Mac을 사용하고 있습니다. 플랫폼에 대한 명령을 조정해야 할 수도 있습니다.


감사합니다 Daniel, 항상 실제 명령 절차를 보는 ​​데 도움이 됨
2qubit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.