toczące się różnice do przechowywania bardzo podobnych plików?


18

W pracy robimy co noc zrzut naszych baz danych mysql. Z dnia na dzień przywitałbym, że prawie 90–95% danych jest zduplikowanych, z czasem rośnie. (Heck w tym momencie niektóre są prawdopodobnie 99%)

Te zrzuty są tam, gdzie jedna linia to pojedyncza instrukcja INSERT mysql, więc jedynymi różnicami są całe linie i kolejność, w jakiej znajdują się w pliku. Gdybym je posortował, rzeczywista różnica między plikami byłaby bardzo mała.

Szukałem i nie znalazłem żadnego sposobu na posortowanie danych wyjściowych podczas zrzutu. Mógłbym jednak przepuścić to przez sortpolecenie. Wtedy byłyby długie, długie bloki identycznych linii.

Więc próbuję wymyślić sposób na przechowywanie tylko różnic. Mógłbym zacząć od zrzutu głównego i różnicować się z tym każdej nocy. Ale różnice byłyby większe każdej nocy. Albo mógłbym tworzyć toczące się różnice, które pojedynczo byłyby bardzo małe, ale wydaje się, że obliczenie zajęłoby coraz więcej, gdybym musiał zestawiać główny diff całej serii każdej nocy.

Czy to jest wykonalne? Z jakich narzędzi?


Edytuj Nie pytam, jak wykonać kopie zapasowe mysql. Na razie zapomnij o mysql. To czerwony śledź. Chcę wiedzieć, jak zrobić serię toczących się różnic z serii plików. Każdej nocy otrzymujemy plik (który akurat jest plikiem mysqldump ), który jest w 99% podobny do poprzedniego. Tak, zgrywamy je wszystkie. Ale przede wszystkim nadmiarowość jest nadmiarowa. Wszystko, czego naprawdę potrzebuję, to różnice z poprzedniej nocy ... która różni się tylko o 1% od poprzedniej nocy ... i tak dalej. Więc szukam tego, jak zrobić serię różnic, więc muszę przechowywać tylko 1% każdej nocy.

Odpowiedzi:


14

Dwa narzędzia do tworzenia kopii zapasowych, które mogą przechowywać binarne pliki różnic, to rdiff-backup i duplikacja . Oba są oparte na librsync, ale powyżej, zachowują się zupełnie inaczej. Rdiff-backup przechowuje najnowsze kopie i odwrotne różnice, podczas gdy duplikat przechowuje tradycyjne przyrostowe różnice. Oba narzędzia oferują również inny zestaw funkcji peryferyjnych.


1
IIUC, rdiff-backup jest bardziej atrakcyjny, ponieważ pozwala normalnie przeglądać kopię zapasową, podczas gdy duplikat ma tylko starą kopię.
tshepang

Wiem, że pytanie + pytanie jest dość stare, ale czy możesz dodać przykład poleceń pokazujących, jak z niego korzystać? Na przykład dla backup201901.tar.gz, backup201902.tar.gz, ..., backup201912.tar.gz, backup202001.tar.gz. Przydałoby się to w przyszłości.
Basj

Ostatnim razem, gdy poszedłem za rdiff-backupem, główni deweloperzy ruszyli dalej, a projekt w pewnym sensie zastał. Nie wiem, czy to się zmieniło. W przypadku sieci było to również bardzo wolne.
Lizardx

13

Ostatnio próbowałem przechowywać zrzuty bazy danych w git. Może to stać się niepraktyczne, jeśli zrzuty bazy danych są naprawdę duże, ale zadziałało to w przypadku małych baz danych (witryny Wordpress i tym podobne).

Mój skrypt zapasowy to z grubsza:

cd /where/I/keep/backups && \
mysqldump > backup.sql && \
git commit -q -m "db dump `date '+%F-%T'`" backup.sql

To tylko przechowuje różnice?
użytkownik394

2
Tak. To bardzo wygodne! Możesz „wyewidencjonować” plik z dowolnego momentu, a git automatycznie połączy diffs, aby dać ci cały plik taki, jaki istniał w tym czasie.
sep332

1
Ten post na blogu (nie mój) zawiera bardziej szczegółowe informacje: viget.com/extend/backup-your-database-in-git Komentarze wnoszą więcej do zalet i wad oraz zastrzeżeń. Dodam również, że jeśli używasz git, masz więcej niż tylko możliwość wycofania wersji. Możesz także oznaczać zrzuty lub mieć oddzielne gałęzie (dev / prod). Sposób, w jaki na to patrzę, to git (lub wstawianie ulubionego nowoczesnego systemu kontroli wersji) robi lepszą robotę niż mogłem, wprowadzając własne „rozwiązanie” diff / gzip. Jedno ostrzeżenie o tym artykule: nie wypychaj swoich zrzutów na github, chyba że chcesz, aby były publiczne (lub płacą za prywatne repo).
zlew

1
Git nie tylko przechowuje różnice. W rzeczywistości przede wszystkim przechowuje pełną migawkę każdej wersji, ale z różnymi optymalizacjami. Zobacz tę doskonałą odpowiedź i jej pytanie
tremby

3

Możesz zrobić coś takiego (z a.sqlcotygodniową kopią zapasową).

mysqldump > b.sql
diff a.sql b.sql > a1.diff
scp a1.diff backupserver:~/backup/

Twoje pliki różnic staną się większe do końca tygodnia.

Moją sugestią jest jednak gzip it (użyj gzip -9dla maksymalnej kompresji). Robimy to w tej chwili, co daje użycie pliku gz 59 MB, podczas gdy oryginał ma 639 MB.


Już je zgrywamy :)
użytkownik394,

1

Istnieje kilka możliwych podejść, które można zastosować, w zależności od wielkości i faktycznego podobieństwa tekstowego zrzutów bazy danych:

  1. zastosuj program do tworzenia kopii zapasowych deduplikujących, który używa ruchomej sumy kontrolnej jako żądania OP, np. restic ( https://restic.net/ ) lub borgbackup ( https://borgbackup.readthedocs.io/ ) na niezmodyfikowanych zrzutach. Oba systemy pozwalają nawet zamontować pewną wersję kopii zapasowej za pośrednictwem BEZPIECZNIKA i działają w tak zwany na zawsze przyrostowy sposób.
  2. Oddziel strukturę bazy danych od treści, podobnie jak robią to faceci NCBI dla swoich dość dużych baz danych genetyki. Oznacza to, że należy utworzyć skrypty SQL do tworzenia schematu bazy danych (np. Ftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606_b151_GRCh38p7/database/organism_schema/ ) i osobno przechowywać zawartość tabel w jednym lub drugim jawny tekst lub skompresowany format binarny bez instrukcji insert (jak zrobiono w ftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606_b151_GRCh38p7/database/organism_data/) np. jako wartości oddzielone tabulatorami lub przecinkami. Oczywiście wymaga to osobnej procedury importu, która utworzyłaby instrukcje wstawiania w samą porę, aby zaimportować dane z powrotem do bazy danych, tj. Przywrócić z kopii zapasowej. W przypadku, gdy Twój DBMS oferuje importer plików csv, wymóg powyższego dodatkowego skryptu można pominąć. Tak skurczone pliki tekstowe mogą być następnie ponownie wprowadzone do wyżej wymienionych lub innych regularnych programów do tworzenia kopii zapasowych, takich jak rdiff-backup.
  3. Wybierz rozwiązanie, w którym struktura i treść są luźno połączone przy użyciu formatu takiego jak pliki arff, jak używa WEKA ( https://www.cs.waikato.ac.nz/ml/weka/arff.html ): Struktura i typy danych kolumny zostaną zadeklarowane w nagłówku pliku, a następnie rzeczywista treść zostanie oddzielona instrukcją @DATA ponownie w formie podobnej do csv. Wiele narzędzi ETL oferuje obecnie czytnik arff oprócz złącza bazy danych. Same pliki można ponownie wprowadzić do zwykłych programów do tworzenia kopii zapasowych

Ta odpowiedź odpowiada na pytanie „jak tworzyć kopie zapasowe zrzutów bazy danych”, ale nie na bardziej ogólne pytanie „Jak
tworzyć

Szczerze podejrzewam, że tak naprawdę chcesz osiągnąć deduplikację, o której wspomniano w pierwszym podejściu. Może chciałbyś rzucić okiem na restic.net/blog/2015-09-12/restic-foundation1-cdc, gdzie jest to opisane, a może chciałbyś spróbować?
jf1

Ten dopracowany w szczegółach komentarz byłby bardziej trafną odpowiedzią niż twoja obecna.
user394

-3

(Nie zrobiłem tego w produkcji).

Wykonaj pełną kopię zapasową raz dziennie lub w tygodniu. Kopie zapasowe logują się raz na godzinę lub dzień.


Co to jest dziennik przekazywania?
użytkownik394
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.