SQLite i kopia / dump bazy

SQLite i kopia / dump bazy
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Poznań
  • Postów:8802
0

Gdy mamy do czynienia z "prawdziwym" SQL, to wiadomo, że kopię bazy się robi zgodnie z procedurami (coś w stylu mysqldump ). Ale jak to się ma do SQLite?

Na ich stronie jest to opisane - https://www.sqlitetutorial.net/sqlite-dump/, ale zastanawiam się, jaki jest sens tego. "Prawdziwe" SQL mają architekturę klient-serwer, jest cały silnik bazy itp, więc zrobienie kopii wymaga trochę wysiłku. Ale przecież SQLite zawiera się w jednym pliku na dysku, więc po co mam robić to w ramach poleceń SQL, jeśli mogę zwyczajnie sobie ten plik skopiować?

Jedyne co mi przychodzi do głowy, to sytuacja, w której podczas kopiowania pliku bazy będą wykonywane jakieś operacje i przez to taka kopia może być wadliwa. Ale poza tym totalnie nie mam pojęcia, co jest złego w skopiowaniu pliku z danymi.


Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Dlaczego SQLite nie jest "prawdziwym" SQL?

Ale przecież SQLite zawiera się w jednym pliku na dysku, więc po co mam robić to w ramach poleceń SQL, jeśli mogę zwyczajnie sobie ten plik skopiować?

Jeśli jesteś w stanie zagwarantować atomiczność operacji, zrobienie kopii pliku wystarczy.

Niektórzy preferują backup w formie spisu zapytań, ponieważ wtedy masz czytelną zrzutkę odporną na błędy w pliku binarnym (co się raczej nie zdarza, no ale cóż).


edytowany 2x, ostatnio: Patryk27
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:dzień
1

Powiedzmy masz w pliku 10 tabel, a tylko 2 z nich użyszkodnicy psują i trzeba odtwarzać. Natomiast pozostałe mają być na bieżąco.
Więc co ci da plik?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Poznań
  • Postów:8802
0

Dlaczego SQLite nie jest "prawdziwym" SQL?

Mam nadzieję, że nie jest to czepianie się słówek i dowalanie się do tego, że użyłem skrótu myślowego :P

Chodziło mi o to, że SQLite to taka jednak wersja uproszczona "prawdziwej" bazy. OK, sam nieraz z niego korzystam i sobie cenię jego prostotę, ale faktem jest, że w pewnych okolicznościach sobie średnio radzi. I żeby nie było, że wymyślam - są to informacje z ich strony https://www.sqlite.org/whentouse.html:

  • architektura klient-serwer: If there are many client programs sending SQL to the same database over a network, then use a client/server database engine instead of SQLite
  • obsługa wielu zapisów jednocześnie: SQLite only supports one writer at a time per database file

ponadto:

  • brak replikacji/mirrorowania
  • brak uprawnień dostępowych - każdy, kto ma dostęp do bazy, może z nią zrobić cokolwiek. Oczywiście - można powiedzieć, że bazę trzeba zabezpieczyć, ale faktem jest, że w realnych aplikacjach stosuje się systemy uprawnień, żeby w razie jakiejś kompromitacji użytkownik mógł nagrzebać jedynie w tym, do czego ma dostęp, czyli np. user nie dostanie się do danych przeznaczonych dla administratora. A przy SQLite, jeśli znajdziesz dziurę w systemie (np. brak zabezpieczeń w jakimś skrypcie PHP), to nic już Cię nie powstrzyma, baza sama się nie obroni.

@Patryk27 - co do atomowości takiego backupu - czyli potwierdziłeś moje podejrzenia/przypuszczenia. Czy jest jeszcze jakiś argument na rzecz dump zamiast skopiowania pliku?

Powiedzmy masz w pliku 10 tabel, a tylko 2 z nich użyszkodnicy psują i trzeba odtwarzać. Natomiast pozostałe mają być na bieżąco. Więc co ci da plik?

@_13th_Dragon - tutaj masz rację, jeśli chcesz tylko wybraną część bazy backupować to tak, korzystanie z dump ma sens. Ale mi nie chodzi o naprawianie bazy po działaniach userów, tylko o zabezpieczenie na wypadek awarii (np. padnięty dysk czy przypadkowe skasowanie).


edytowany 1x, ostatnio: cerrato
_13th_Dragon
przypadkowe skasowanie całej bazy? Tablicy - uwierzę.
cerrato
ale pamiętaj, że mówimy o SQLite - więc cała baza jest przecież plikiem :P W przypadku "prawdziwego" SQL, nie masz fizycznie dostępu do plików bazy, więc możesz jedynie siać zniszczenie przez zapytania. A przy SQLite, żeby z niego korzystać, aplikacja musi mieć fizycznie dostęp do pliku. Poza tym mogą wystąpić jakieś sytuacje losowe typu zawieszenie komputera/zanik zasilania podczas zapisu do pliku bazy, co spowoduje jego zniszczenie, uszkodzone wpisy w tablicy partycji, padnięty dysk itp.
_13th_Dragon
No tak, koledzy programiści mogą popełnić buga, przez co uzyszkodnicy zniszczą parę table - baaaardzo powszechne zjawisko! Natomiast stratę całego pliku (z przyczyn co opisałeś) zjawisko rzadkie.
cerrato
Ale także możliwe :P Poza tym nie chcę teraz snuć rozważań dot. prawdopodobieństwa, a jedynie byłem ciekawy, czy jesteście w stanie podać jakieś inne (poza problemem przy jednoczesnym zapisie do bazy oraz kopiowaniu tego pliku) przyczyny/uzasadnienia, dla których wskazane jest robienie dump zamiast kopii pliku bazy.
neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 8 godzin
  • Lokalizacja:Kraków
  • Postów:1114
1

Jak nie masz żadnego połączenia otwartego do sqllite to spokojnie można ją kopiować, wrzucam regularnie takie snapshoty na githuba i edytuje w wielu miejscach i nigdy nie było problemów :D. W sumie robię tak samo z sql server localdb i też nie było problemu.

Natomiast jak masz otwarte jakieś połączenie to jest taki sam problem jak z bazami klient serwer, to że transakcja się powiodła nie oznacza że ona jest już zapisana w fizycznym pliku bazy danych, tylko że została zapisana w logu synchronicznie(Write-Ahead Logging), a później plik bazy danych jest uaktualniany asynchronicznie jak baza ma czas.


edytowany 1x, ostatnio: neves
Zobacz pozostałe 3 komentarze
cerrato
Na tym, że nie piszesz wprost do pliku, ale wywołujesz funkcje z biblioteki, która się tym zajmuje. I podejrzewam, że twórcy SQLite przewidzieli taki scenariusz, w związku z czym sama funkcja robiąca dump ustawia jakąś flagę, albo w inny sposób zabezpiecza bazę przed zapisem w chwili, gdy coś się dzieje. Analogicznie do mechanizmu, w jakim działają transakcje.
_13th_Dragon
tak, dump jest ok, on musi zaczekać na wszystkie transakcje, a potem zrobić dump lokująć całą baze. Ja pytałem na temat kopiowania pliku!
cerrato
No to coś się nie dogadaliśmy ;)
_13th_Dragon
Ale teraz wszystko jasne, co kto miał na myśli?
cerrato
Mi się wydaje, że tak - przynajmniej jeśli chodzi o mnie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.