SQLite i kopia / dump bazy

SQLite i kopia / dump bazy
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Poznań
  • Postów:8791
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:3 miesiące
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:dzień
  • Lokalizacja:Poznań
  • Postów:8791
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 11 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.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)