2013-05-07 9 views
5

Mam program, który często ulega awarii (Zotero), pozostawiając jego bazy danych SQLite zamknięte i niedostępne do użycia przez program ponownie uruchomionego chyba restart (co naprawdę chcę uniknąć). Więc to nie działa (używając nazwy ogólnej, db.sqlite zamiast rzeczywistego pliku w moim przypadku, zotero.sqlite):skutecznie uwolnienie SQLite bazy

sqlite3 db.sqlite 
sqlite> .backup main backup.sqlite 
Error: database is locked 

Na podstawie odpowiedzi here, próbowałem:

echo ".dump" | sqlite3 db.sqlite | sqlite3 db.sqlite2 
mv db.sqlite2 db.sqlite 

db.sqlite2 jest 0KB więc to oczywiście nie zadziałało. Zainspirowany another thread, ja też próbowałem

echo '.dump' | sqlite3 db.sqlite > db.dump 
cat db.dump | sqlite3 db.sqlite2 
mv db.sqlite2 db.sqlite 

co prowadzi do db.sqlite2 który jest nieco mniejszy rozmiar pliku do db.sqlite i Zotero (plik, który wymaga bazy danych) nie był w stanie rozpoznać jego zawartość.

więc wydaje się to bardzo brutalnej siły sposób to robić, ale pracował:

cp -pv db.sqlite db.sqlite2 
rm -f db.sqlite 
mv db.sqlite2 db.sqlite 

Zastanawiam się, czy są jakieś wady tego rozwiązania i dlaczego inne metody są proponowane przed tym.

+2

Czy jesteś pewien, że rozbił się proces nie jest jeszcze kręci? –

+0

Cóż, 'ps -aux | grep zotero' daje mi '(Zotero-bin)', która wydaje się być proces zombie, a jego proces macierzysty jest '1 ', więc nie mogę go zabić. To wyjaśnia, dlaczego muszę "rm -f" to? – hatmatrix

+0

'init' automatycznie pobiera zombie. Jaki jest stan ('STAT') tego procesu zotero? –

Odpowiedz

2

Może okazać się, że do kontroli transakcji Zotero wykorzystuje blokowanie oparciu tabeli aby zapobiec niespójności bazy danych podczas jednoczesnego dostępu. Gdy jeden użytkownik korzysta z bazy danych, blokuje tabele, tak aby mogły z niego korzystać i uniemożliwić im zobaczenie bazy danych w niespójnym stanie. Jednak gdy się zawiesza, nie zwalnia tych zamków.

W bazie danych konfiguracji instalacji po zawieszeniu transakcji transakcja powinna zostać wycofana (cofnięta), a blokady zwolnione, aby zapobiec pozostawieniu danych w niespójnym stanie lub zablokowaniu tabel i konieczności ręcznego ich zwolnienia.

Czytałem w Internecie, że przechowywanie bazy danych w sieciowym systemie plików może zakłócać działanie mechanizmu blokowania SQLites, zmieniając lokalizację bazy danych na lokalizację bez sieci, powinieneś być w stanie uniknąć tych problemów, chyba że jest to gdzie indziej.

Jeśli jest gdzieś indziej Polecam wykonywania kopii bazy danych i przy użyciu narzędzie do naprawy bazy danych Zotero spróbować zidentyfikować żadnych błędów w konfiguracji itp, które mogłyby być przyczyną tego i ich naprawy: https://www.zotero.org/utils/dbfix/

mam nadzieję to pomaga.