대용량 SQLITE-WAL 파일을 제거하기 위해 Firefox 저장소 SQLite 데이터베이스 파일을 플러시하는 방법은 무엇입니까?

대용량 SQLITE-WAL 파일을 제거하기 위해 Firefox 저장소 SQLite 데이터베이스 파일을 플러시하는 방법은 무엇입니까?

나는WAL(미리 쓰기 로그)Firefox 웹 브라우저에서 사용되는 SQLite 데이터베이스(*.sqlite)와 관련된 파일(*.sqlite-wal)은 종종 상당히 커집니다. 문자 그대로 관련 SQLite 데이터베이스 크기의 150배 이상을 얻을 수 있으며 몇 달 동안(몇 년? 영원히?) 그 크기를 유지할 수 있습니다.

에 따르면이 StackOverflow 답변, 가능한 해결책은 영향을 받는 각 스토리지 데이터베이스에서 다음 SQLite pragma 명령을 실행하는 것입니다.

PRAGMA schema.wal_checkpoint(TRUNCATE);

이론적으로는 Firefox 외부의 SQLite 도구를 사용하여 이 작업을 수행할 수 있지만 작업을 수행하는 것은이내에Firefox는 일반적으로 최상의 결과를 제공합니다. (예를 들어 Firefox 외부에서 작업을 시도해 보십시오 omni.jar. Mozilla는 비정형 JAR 구조를 사용하므로 PITA가 될 수 있습니다.)

Firefox 내에서 모든 SQLite 저장소 데이터베이스를 플러시하여 해당 내용이 해당 파일 내에 완전히 기록되도록 하는 방법이 있습니까 .sqlite?


업데이트:

storage-sync-v2.sqlite-wal이 질문을 게시하는 주요 목표 중 하나는 각 Firefox 프로필에서 32MB에 도달할 때까지 커지는 파일을 안전하게 처리하는 것임을 언급하고 싶습니다 . 해당 데이터베이스인 storage-sync-v2.sqlite에도 storage-sync-v2.shm파일이 있지만 크기가 다소 작은 경향이 있습니다. 집중할 수 있도록질문 당 하나의 주제, 나는 다음을 썼다.해당 목표를 구체적으로 해결하기 위한 관련 질문.

답변1

문제의 데이터베이스가 포함된 프로필을 사용하는 Firefox 인스턴스를 종료합니다.

임시 프로필에서 Firefox를 실행하세요. 브라우저 콘솔을 열고 다음 코드 조각을 붙여넣습니다. 대상 프로필을 가리키도록 경로 문자열을 편집합니다. 누르다Enter

모든 sqlite 데이터베이스에 대해 반복합니다.

이것이 효과가 있기를 바라지만, 시도하기 전에 프로필을 백업해 두는 것도 나쁘지 않을 것입니다.

(()=>{
  let file = new FileUtils.File("/pathToTargetProfile/places.sqlite"); // edit this string
  let db = Services.storage.openDatabase(file);
  let stmt = db.createStatement("PRAGMA wal_checkpoint(TRUNCATE)");
  stmt.executeStep();
  console.log(stmt.row); //this might provide useful info
  stmt.finalize();
  db.close();
})();

답변2

이것은 실제로 많은 사람들이 묻지 않는 정말 좋은 질문입니다.

파일 .sqlite-wal은 32MB 제한까지 커집니다. 이는 아마도 귀하(또는 패키지 작성자)가 Firefox의 sqlite를 컴파일하는 동안 정의한 트랜잭션 저널 제한일 것입니다.

컴파일 시간 동안 트랜잭션 저널 제한을 조정할 수 있는 지시문을 호출합니다.SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT그리고 그것은 정의되어 있습니다바이트. 귀하의 경우에는 32MB입니다.

나중에 sqlite에서 다음을 사용하여 트랜잭션 저널 제한을 조정할 수도 있습니다.

PRAGMA schema.journal_size_limit = N ;(다시N에 있습니다바이트, 음수는 제한이 없음)

이것을 이해해야 하는 것은소프트 리미트, 어려운 일이 아닙니다. 저널에 기록 중인 활성 프로세스가 있는 경우 지정된 제한에 도달하더라도 계속해서 씁니다. 20MB 제한이 정의되어 있어도 쉽게 2GB에 도달할 수 있습니다.

이 한도는비활성거래일지. 내 생각에 Firefox 개발자는 32MB가 미리 쓰기 로그와 속도 사이의 적절한 균형이라고 결정한 것 같습니다.

컴파일 후에 PRAGMA 크기를 조정하려면 가지고 있는 각 프로필에 대해 조정해야 합니다. 많은 프로필/데이터베이스를 사용할 계획이라면 세트와 함께 다시 컴파일하는 것이 좋습니다 SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT.

남자의 유효한 섹션을 인용하려면 다음을 수행하십시오.

WAL 모드에서는 체크포인트 이후에 미리 쓰기 로그 파일이 잘리지 않습니다. 대신 덮어쓰기가 추가하는 것보다 빠르기 때문에 SQLite는 후속 WAL 항목에 기존 파일을 재사용합니다.

Journal_size_limit pragma는 트랜잭션이나 체크포인트 이후 파일 시스템에 남아 있는 롤백 저널 및 WAL 파일의 크기를 제한하는 데 사용될 수 있습니다. 트랜잭션이 커밋되거나 WAL 파일이 재설정될 때마다 SQLite는 파일 시스템에 남아 있는 롤백 저널 파일 또는 WAL 파일의 크기를 이 pragma에서 설정한 크기 제한과 비교하고 저널 또는 WAL 파일이 더 크면 잘립니다. 한계까지.

위에 나열된 pragma의 두 번째 형식은 지정된 데이터베이스에 대한 새 제한(바이트)을 설정하는 데 사용됩니다. 음수는 제한이 없음을 의미합니다. 롤백 저널과 WAL 파일을 항상 최소 크기로 자르려면 Journal_size_limit를 0으로 설정하세요. 위에 나열된 pragma의 첫 번째 및 두 번째 형식은 모두 단일 정수 열(바이트 단위의 저널 크기 제한 값)을 포함하는 단일 결과 행을 반환합니다. 기본 저널 크기 제한은 -1(제한 없음)입니다. SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT 전처리기 매크로를 사용하여 컴파일 타임에 기본 저널 크기 제한을 변경할 수 있습니다.

이 pragma는 pragma 이름 앞에 지정된 단일 데이터베이스(또는 데이터베이스가 지정되지 않은 경우 "기본" 데이터베이스)에서만 작동합니다. 단일 PRAGMA 문을 사용하여 연결된 모든 데이터베이스에 대한 저널 크기 제한을 변경할 수 있는 방법은 없습니다. 연결된 각 데이터베이스에 대해 크기 제한을 별도로 설정해야 합니다.

업데이트:

중요한 SQLite 매개변수 하나를 언급하는 것을 잊었습니다. wal_autocheckpoint=N;(여기서 N은숫자32KiB 중페이지512KiB 저널에 있음). (데이터를 자를 때 이미 언급한 OP)

더 작은 자동 검사점을 사용하도록 구성할 수 있습니다. 이는 SQLite의 성능과 브라우저의 성능에 영향을 미칩니다. 체크포인트가 너무 많으면 브라우저 속도가 느려집니다.

올바르게하려면자동 체크포인트 구성링크를 따라가세요.

이러한 방식으로 시작된 체크포인트는 다음과 같습니다.수동적인. 이는 SQLite가 차단 없이 최대한 많은 작업을 수행해야 함을 의미합니다.

수동 모드에 대한 사람의 말을 인용하려면:

SQLITE_CHECKPOINT_PASSIVE 데이터베이스 판독기 또는 기록기가 완료될 때까지 기다리지 않고 가능한 한 많은 프레임을 체크포인트한 다음, 로그의 모든 프레임이 체크포인트되면 데이터베이스 파일을 동기화합니다. 바쁜 처리기 콜백은 SQLITE_CHECKPOINT_PASSIVE 모드에서는 호출되지 않습니다. 반면, 수동 모드에서는 동시 판독기 또는 기록기가 있는 경우 체크포인트가 완료되지 않은 상태로 남아 있을 수 있습니다.

업데이트 참고 사항 위와 동일하게 다음을 사용하여 컴파일 시간 동안 이 옵션을 설정할 수도 있습니다.SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=<pages>.

사람에게서:

이 매크로는 WAL 자동 체크포인트 기능의 기본 페이지 수를 설정합니다. 지정하지 않으면 기본 페이지 수는 1000입니다.

관련 정보