SQLite i kopia / dump bazy

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.

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óż).

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?

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).

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1