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.
Czy jesteś pewien, że rozbił się proces nie jest jeszcze kręci? –
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
'init' automatycznie pobiera zombie. Jaki jest stan ('STAT') tego procesu zotero? –