내 RAM (블루 스크린, Windows XP)에 문제가있어 Firefox 데이터베이스가 손상되었습니다. Firefox가 작동하지만 내 기록이 사라졌으며 다음을 실행할 때 몇 가지 불일치 및 오류가보고 pragma integrity_check됩니다 places.sqlite.
데이터베이스 디스크 이미지가 잘못되었습니다
이제 질문은 어떻게 SQLite-Databases를 복구합니까?
내 RAM (블루 스크린, Windows XP)에 문제가있어 Firefox 데이터베이스가 손상되었습니다. Firefox가 작동하지만 내 기록이 사라졌으며 다음을 실행할 때 몇 가지 불일치 및 오류가보고 pragma integrity_check됩니다 places.sqlite.
데이터베이스 디스크 이미지가 잘못되었습니다
이제 질문은 어떻게 SQLite-Databases를 복구합니까?
답변:
이 절차를 수행하려면 Firefox를 닫아야합니다. 계속 진행하기 전에 다른 웹 브라우저에서이 페이지를 열거 나 인쇄하십시오.
Places 데이터베이스를 복구하려고 노력하고 Firefox 소스 코드를 읽은 후에도 성공했습니다. 내가 한 방법은 다음과 같습니다.
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default폴더에 있습니다.places.sqlite파일에 있습니다. 파일이 손상으로 인해 교체 된 경우 파일을 사용하여 places.sqlite.corrupt복구하십시오. places.sqlite.bak또는 이라는 파일의 백업 복사본을 만듭니다 places.sqlite.corrupt.bak.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;
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) :
PRAGMA user_version = <버전>; PRAGMA journal_mode = 자르기; PRAGMA page_size = 32768; 진공; PRAGMA journal_mode = 월;
places.sqlite한 다음를 places.sqlite사용하여 빈 데이터베이스를 작성하는 SQLite 쉘을 시작하십시오 sqlite3 places.sqlite. .read dump.sqlSQL 덤프를 데이터베이스에로드하려면 입력 하십시오.더 관련 정보는 다음 페이지에서 찾을 수 있습니다.
간단한 절차는 이 MDN 기사에 설명되어 있지만 테스트하지는 않았습니다. 그럼에도 불구하고, 나는 PRAGMA그 기사에서 업데이트 된 명령을 통합했습니다 .
1 SQL은 일반적으로 ORDER BY절 을 사용하지 않는 한 데이터베이스 출력이 어떤 순서로든 제공되는 것을 보증하지 않습니다 . 그러나 ORDER BYSQLite는 출력을 생성하기 전에 전체 테이블을 읽어야하므로 손상된 데이터베이스에서 출력을 생성하지 못할 수 있습니다. 내가 아는 한 Firefox는 항상 moz_places순차적 ID로 테이블 항목을 작성 하므로 모든 출력이 ID별로 정렬되어 있다고 가정 할 수 있습니다.
손상의 정도에 따라 수리가 불가능할 수 있습니다. 가장 좋은 방법은를 사용하여 db를 덤프하고 덤프 sqlite한 다음 구할 수있는 것을 확인하는 것입니다.
실패하면 백업에서 복원해야합니다.
데이터베이스를 덤프하고 다시 작성하려면 다음 명령을 사용하십시오 .dump.
sqlite places.sqlite .dump | sqlite places-new.sqlite
d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db. 모든 파비콘이 사라졌지 만 사이트를 방문하면서 재 구축 중입니다. 다시 감사합니다!
항상 이와 같은 복구를 수행 할 때 먼저 프로필 디렉토리에있는 places.sqlite 파일의 백업 복사본을 하나 이상 만드는 것이 좋습니다. 백업을 수행하면 이러한 문제를 해결하기 위해 여러 가지 다른 작업을 시도 할 수있을뿐만 아니라 복구 시도로 인해 문제가 악화되는 경우 항상 다시 시도 할 백업 사본을 다시 만들 수 있다는 것을 알고 있습니다.
손상된 항목과 손상 정도에 따라 Places Maintenance 확장 프로그램의 문제를 해결할 수 있습니다 . 나는 몇 번에 손상된 places.sqlite 파일로 끝났습니다. 작업 공간 유지 보수 는 옵션 대화 상자에서 조작으로 제공하는 다양한 점검 / 수정을 실행하여 매번 문제점을 해결할 수있었습니다. 다양한 검사 및 / 또는보고는 몇 분에서 몇 분 정도 걸립니다.
이것이 작동하지 않으면 DragonLord가 위에서 설명한 것과 유사한 방식으로 수동으로 수정하는 경로를 따르는 것이 필요할 수 있습니다.
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을 사용하고 있습니다. 플랫폼에 대한 명령을 조정해야 할 수도 있습니다.