2009-09-21 10 views
8

Otwieram plik bazy danych i uzyskuję połączenie z bazą danych przy użyciu metody open() programu sqlite3, a połączenie nie zostanie zamknięte, dopóki program nie zostanie zamknięty. Jeśli wystąpi nieoczekiwany błąd, taki jak nagłe wyłączenie komputera lub awarie systemu operacyjnego, czy tryb pliku bazy danych zostanie uszkodzony lub utracony zostanie jego uchwyt? Mówiąc dokładniej, czy po ponownym uruchomieniu komputera może pozostać zapisywalny? BTW, nie dbam o utratę danych w przypadku wystąpienia błędów.Czy plik bazy danych SQLite3 zostanie uszkodzony po nagłym wyłączeniu zasilania lub awarii systemu?

Dziękuję bardzo!

Odpowiedz

12

SQLite to specyficznie Przeznaczony do ochrony przed tym. Z oficjalnej SQLite is Transactional stronie:

Wszelkie zmiany w obrębie jednego transakcji w SQLite albo wystąpić całkowicie lub w ogóle, nawet jeśli akt pisania zmiany wyjścia na dysku przerywa

  • awaria programu
  • awarii systemu operacyjnego lub
  • awaria zasilania.

Twierdzenie poprzedniego ustępu jest gruntownie sprawdzana w SQLite testu regresji przy użyciu pakietu testowego specjalną uprząż symulującej wpływ na pliku bazy danych awarii systemu operacyjnego i mocy niepowodzeń.

Możesz również być zainteresowany artykułem SQLite Atomic Commit in SQLite, jeśli chcesz poznać szczegółowe informacje o tym, jak chronią przed wypadkami takimi jak powyższe.


chodzi o pisanie po wypadku: (od File Locking and Concurrency)

Gorący czasopismo jest tworzony, gdy proces jest w trakcie aktualizacji bazy danych i programu lub systemu operacyjnego wypadku lub awarii zasilania zapobiega aktualizacja od ukończenia. Gorące czasopisma są warunkiem wyjątkowym. Istnieją gorące dzienniki, które można odzyskać po awariach i awariach zasilania. Jeśli wszystko działa poprawnie (to znaczy, jeśli nie ma awarii ani awarii zasilania), nigdy nie dostaniesz gorącego dziennika.

Najgorsze, co może się zdarzyć, to usunięcie gorącego arkusza, który pozostał po awarii.

+0

Dzięki! Chcę również wiedzieć, czy plik bazy danych (*. Db) pozostanie zapisywalny, jeśli wystąpi awaria zasilania, podczas gdy w bazie danych zapisywane są pewne zmiany. – quantity

+0

@ ilość Blokowanie odbywa się na poziomie systemu operacyjnego, więc po nagłej awarii i po ponownym uruchomieniu, kod fschk powinien to wyczyścić, a plik będzie znów dostępny.Blokowanie nie odbywa się poprzez zmianę atrybutów pliku. Również z odnośników do artykułu w odpowiedzi jasne jest, że "gorące dzienniki" są obsługiwane automatycznie podczas uzyskiwania dostępu do pliku DB. – Ber

+0

Nigdy nie należy usuwać gorącego pliku dziennika. Zobacz oficjalną dokumentację: [Jak uszkodzić plik bazy danych SQLite] (http://www.sqlite.org/howtocorrupt.html), sekcja 1.3. –

1

wszystko może się zdarzyć przy nagłym wyłączeniu zasilania. Sugeruję jednak, aby UPS zminimalizował ryzyko.

+0

Cokolwiek może się zdarzyć z powodu promieniowania kosmicznego, ale w praktyce baza danych sqlite3 zasadniczo pozostanie niezmienna w przypadku nagłej utraty mocy przewidywalnych systemów plików. – Arelius

4

Ponieważ Sqlite jest zgodny z ACID, wyłączenie zasilania nie powinno stanowić problemu.

http://en.wikipedia.org/wiki/ACID

+0

Obawiam się, że wyłączenie wpłynęłoby na właściwości pliku i nie zostanie ono w ogóle otwarte lub nie będę mógł zapisać w nim żadnych danych. – quantity

+0

@ ilość, dlaczego się tego boisz? Dopóki nie usuniesz pliku kroniki, program sqlite3 powinien móc naprawić bazę danych w przypadku nagłej utraty zasilania. – Arelius

Powiązane problemy