Najlepsze praktyki tworzenia kopii zapasowych bazy danych MySQL

23

Niedawno odkryłem, że nasze produkcyjne serwery WWW, które działają na MySQL, nie są regularnie (lub wcale) archiwizowane. Jestem przyzwyczajony do tworzenia kopii zapasowych baz danych SQL Server, ale nie mam dużego doświadczenia z bazami danych MySQL. Jakieś najlepsze praktyki korzystania z „mysqldump” lub innych narzędzi do tworzenia kopii zapasowych DB?

Prawdopodobnie wykonam zadanie crona zgodnie z harmonogramem, aby było to wykonywane co noc, a następnie wykonać kopię zapasową plików za pomocą mojego systemu kopii zapasowych.

Dzięki.

Valien
źródło

Odpowiedzi:

29

Najlepsze praktyki tworzenia kopii zapasowych serwera MySQL:

Replikacja MySQL

Instalowanie replikacji w MySQL. Będziesz musiał skonfigurować serwer Master i Slave. Wszystkie zapisy do odczytu do bazy danych mogą przejść do twojego serwera slave. Zaletą posiadania replikacji jest to, że możesz wykonać kopię zapasową z serwera podrzędnego bez przerywania serwera głównego, Twoja aplikacja będzie nadal działać na serwerze głównym bez żadnych przestojów.

Za pomocą zrzutu MySQL

Jeśli twój zestaw danych jest mały (zdaję sobie sprawę, że „mały” jest terminem względnym .. aby go zakwalifikować, powiedzmy <10 GB), wtedy mysqldump prawdopodobnie będzie działał świetnie. To proste, jest online i jest bardzo elastyczne. Tylko kilka rzeczy, które może zrobić mysqldump: wykonać kopię zapasową wszystkiego lub tylko niektórych baz danych lub tabel wykonać kopię zapasową tylko DDL zoptymalizować zrzut dla szybszego przywracania, aby wynikowy plik sql był bardziej kompatybilny z innymi RDBMS i wieloma innymi rzeczami.

Najważniejsze opcje związane są jednak ze spójnością kopii zapasowej. Moje ulubione opcje to: - pojedyncza transakcja: ta opcja zapewnia spójne tworzenie kopii zapasowych, jeśli (i tylko jeśli) tabele używają silnika pamięci InnoDB. Jeśli masz tabele MyISAM nie tylko do odczytu, nie używaj tej opcji podczas tworzenia ich kopii zapasowych. --master-data = 2: ta opcja upewni się, że zrzut jest spójny (wykonując blokadę wszystkich tabel, chyba że dodałeś opcję - pojedyncza transakcja). Opcja --master-data zapisuje również pozycję dziennika binarnego w wynikowym pliku zrzutu (= 2 powoduje, że ten wiersz jest komentarzem w pliku zrzutu)

Ostatnia uwaga na temat mysqldump: pamiętaj, że czas przywracania może być znacznie dłuższy niż czas tworzenia kopii zapasowej. Będzie to zależeć od kilku czynników, na przykład od liczby indeksów.

Migawka LVM

Dla tych, którzy mają większe zbiory danych, właściwym rozwiązaniem jest fizyczna kopia zapasowa. Chociaż możesz zrobić zimną kopię zapasową (tj. Zamknąć usługę MySQL, skopiować katalog danych, ponownie uruchomić usługę), wiele osób nie chce przestoju. Moje ulubione rozwiązanie to migawki. Może być gorący (dla InnoDB) lub wymagać krótkiej blokady (dla MyISAM). Nie zapomnij dołączyć wszystkich swoich danych (w tym ib_logfiles). Lenz zapewnia przydatne narzędzie, które może w tym pomóc: http://www.lenzg.net/mylvmbackup/

Korzystanie z MySQL Enterprise Backup

Zalety korzystania z MySQL Enterprise Backup:

  • „Gorące” kopie zapasowe tabel InnoDB odbywają się całkowicie online, bez blokowania tworzenia kopii zapasowych tylko określonych tabel lub obszarów tabel
  • Wykonaj kopię zapasową tylko danych, które zmieniły się od czasu poprzedniej kopii zapasowej
  • Skompresowana kopia zapasowa - oszczędza miejsce do 90% i wiele więcej ..

Odniesienie: http://www.mysql.com/products/enterprise/backup/features.html http://www.mysql.com/products/enterprise/backup.html

Peter Venderberghe
źródło
7

Poleciłbym skonfigurować dedykowaną replikę do użycia jako kopia zapasowa. Umożliwi to wykonywanie dowolnych zadań tworzenia kopii zapasowych bez wpływu na podstawowy. Ponieważ zwiększa to złożoność architektury, należy monitorować opóźnienie replikacji, aby upewnić się, że wszystko działa.

Jeśli chodzi o rzeczywisty proces, masz kilka opcji bez żadnych narzędzi innych firm. Migawki mogą być wykonywane przy użyciu mysqldumppolecenia (zakładając że używasz InnoDB) mysqldump --all-databases --single-transaction > all_databases.sql. W zależności od rozmiaru danych może być wskazane wyłączenie MySQL i bezpośrednie tworzenie kopii zapasowych plików danych. Po zrestartowaniu replika odtworzy wszystkie zdarzenia otrzymane przez podstawową w czasie, gdy była wyłączona. Jeśli używasz MySQL Enterprise, mysqlbackupnarzędzie to robi.

Przyrostowe kopie zapasowe można wykonywać, włączając dziennik binarny w replice. Oczywiście rejestruje to tylko zdarzenia, które mutują dane, więc musisz połączyć to z powyższymi migawkami.

Rich Schumacher
źródło
3
+1 za, --single-transactionale nie zapomnij dodać, --events --routinesa ja też zawsze używam --triggers, nawet jeśli jest domyślnie włączony, ponieważ można go wyłączyć w my.cnf. Powiedziałbym, że prawie zawsze dobrze jest stosować je jako standardową praktykę, niezależnie od tego, czy obecnie masz takie typy obiektów w bazie danych, czy nie.
Michael - sqlbot
Uwaga: mysqldump - wszystkie bazy danych mogą powodować błędy, gdy zdefiniowane jest niskie maksimum otwartych tabel. więc miej oko na swój mysql.log. Replikacja byłaby rzeczywiście najlepszym sposobem tworzenia kopii zapasowych
Raymond Nijland,
Jak zatem przechowywać historyczne kopie danych? (Często klient chce zachować miesiąc lub więcej kopii zapasowych, a gdy błąd aplikacji uszkadza dane, programiści chcą kopii
bazy