2017-12-25 19 views
1

며칠 전 나는 sqlite3 데이터베이스를 사용하여 많은 데이터를 삭제 한 후 (전체 테이블 (DROP)) 파일 크기가 변경되지 않았다는 사실을 알게되었습니다 (테이블이 5MB로 변경됨). 내가 묻는 데이터베이스는 아니지만 아마도 내 질문과 관련이 있습니다.sqlite 데이터베이스에서 모든 데이터를 검색하는 방법은 무엇입니까?

특정 메시지에 대해 grep -a을 사용하여 데이터베이스를 찾고 있는데, 성공적으로 문제가되는 데이터베이스가 50MB 크기 인 것을 발견했습니다. 완벽하게 보입니다! 그러나 sqlite3 데이터베이스 뷰어 (또는 sqlite3 명령 줄 도구)에서 데이터베이스를 열면 messages 테이블에 800 개가 넘는 항목 만 표시됩니다. 현재 자동 증가 인덱스는 테이블에 있어야하는 항목의 양인 18.000 이상입니다. grep으로 .db 파일을 살펴보면, 내가 원하는 모든 것이 거기에있는 것 같지만, 어떻게 든 "숨겨져 있습니다"(?)라고 추측하고 있습니다.

어떻게 sqlite 데이터베이스에서 모든 데이터를 검색 할 수 있습니까? .dump <table>에는 내가 찾는 메시지가 포함되어 있지 않습니다. 이것에 대한 간단한 설명과 데이터가 실제로 삭제되지 않는 이유는/파일 크기가 5MB 테이블을 삭제해도 줄어들지 않는다는 것입니다. 감사 할지라도 말입니다.

sqlite> .dbinfo 
database page size: 4096 
write format:  1 
read format:   1 
reserved bytes:  0 
file change counter: 366 
database page count: 11405 
freelist page count: 10372 
schema cookie:  2 
schema format:  4 
default cache size: 0 
autovacuum top root: 0 
incremental vacuum: 0 
text encoding:  1 (utf8) 
user version:  7 
application id:  0 
software version: 3008005 
number of tables: 3 
number of indexes: 1 
number of triggers: 0 
number of views:  0 
schema size:   737 

은 (는 인스 타 그램의 직접 메시지 데이터베이스입니다, 내가 만들지 않은 것을 참고도 지금이 데이터베이스를 편집했다.)

+0

잘못된 질문을하는 것 같습니다. 삭제 한 데이터는 검색 할 수 없으며 삭제 된 메시지를 검색하는 것은 의미가 없습니다. 어쩌면 [How to vacuum sqlite database?] (https://stackoverflow.com/q/18126997/608639)를 먼저 시도해야합니다. – jww

+0

내가하고 싶은 일은 진공의 반대입니다. 허용 된 답변에 대한 마지막 의견을 확인하여 지금 내 요구 사항에 맞게 끝내 었는지 확인하십시오. 나는 데이터를 직접 삭제하지 않았고, instagram은 캐시에서 메시지를 아주 빨리 삭제하는 것 같습니다. 진공은 확실히 나가 또한 이렇게 흥미있는 무언가이다 그래서 연결을 위해 당신을 감사하십시오! – confetti

답변

0

삭제 된 데이터를 즉시 데이터베이스 파일에서 제거되지 않습니다; change sqlite file size after "DELETE FROM table"을 참조하십시오.

프리리스트 페이지 수에 표시된 것처럼 해당 파일은 대부분 비어 있으며 VACUUM을 실행하면 검색중인 데이터의 유적을 버릴 수 있습니다.

(중요한 관리 정보가 누락되어) 삭제 된 데이터를 쉽게 복구 할 수있는 방법이 없습니다. 소량의 데이터에만 관심이 있다면 16 진수 편집기를 사용해보십시오.

+0

답변과 훌륭한 설명에 감사드립니다. 나는 "빈 공간"에 대해 조금 혼란 스럽지만, 삭제 된 데이터가 "없어 졌음"(또는 적어도 cat 또는 grep -a에 의해 직접적으로 보이지 않음)을 의미하지 않아야합니까? 나에게 이것은 일종의 인덱싱/메타 데이터/참조를 삭제하는 것처럼 보이지만 다시 만들거나 최소한의 방법으로 쉽게 데이터를 복구 할 수는 없을 것입니다 (실제 데이터를 복원 할 필요가 없습니다. 데이터베이스가 삭제되기 전의 상태)? – confetti

+0

"비어 있음"은 데이터베이스가 실제로 데이터를 사용하고 있지 않음을 의미합니다. 그리고 삭제 된 메타 데이터는 데이터를 찾고 해석하는 데 필요합니다. –

+0

고마워, 그건 내 질문에 대답했다. 내 인스 턴 그램 메시지의 데이터베이스를 얻으려는 시도로 내 문제를 해결하기 위해 매분마다 데이터베이스를 덤프하는 스크립트를 만들려고합니다. (스 덤 그램이 캐시 데이터베이스를 지우는 방법을 모르므로) 이후 전화가 덤프를 병합하고 중복을 삭제합니다. – confetti