내 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 다이어그램이 포함되어 있습니다.)이 표에서 추가 데이터를 복구하는 방법 만 설명합니다. 다음 절차는 다른 테이블에는 적용되지 않을 수 있으므로 다른 테이블 이 관련된 경우에는이 하위 단계를 건너 뛰십시오 .)INSERT
moz_places
moz_places
moz_places
테이블의 각 행 에는 ID가 있습니다. 이 ID의 순서에 따라 테이블에서 행이 덤프됩니다. 1 ID는 INSERT
명세서 에서 여는 괄호 다음의 첫 번째 값 입니다. 데이터베이스가 손상된 영역은이 테이블에서 작은 행 블록 일 수 있습니다. 여기서 손상된 부분을 건너 뛰고 가능한 많은 데이터를 복구하는 것이 좋습니다. 이러한 블록의 시작 영역은 ERROR
주석이 나타나기 전에 행으로 덤프에 표시됩니다. 이 행의 ID를 사용하여 데이터베이스가 손상된 위치를 확인할 수 있습니다. SELECT
ID가 포함 된 명령문을 조건으로 사용하여이를 수행 합니다. 이 과정에는 시행 착오가 필요합니다. 예를 들어, 오류 이전의 마지막 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.sql
SQL 덤프를 데이터베이스에로드하려면 입력 하십시오.더 관련 정보는 다음 페이지에서 찾을 수 있습니다.
간단한 절차는 이 MDN 기사에 설명되어 있지만 테스트하지는 않았습니다. 그럼에도 불구하고, 나는 PRAGMA
그 기사에서 업데이트 된 명령을 통합했습니다 .
1 SQL은 일반적으로 ORDER BY
절 을 사용하지 않는 한 데이터베이스 출력이 어떤 순서로든 제공되는 것을 보증하지 않습니다 . 그러나 ORDER BY
SQLite는 출력을 생성하기 전에 전체 테이블을 읽어야하므로 손상된 데이터베이스에서 출력을 생성하지 못할 수 있습니다. 내가 아는 한 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을 사용하고 있습니다. 플랫폼에 대한 명령을 조정해야 할 수도 있습니다.