Jak wykonać kopię zapasową bazy danych mysql, ale z niskim priorytetem?

15

Chcę wykonać kopię zapasową bazy danych, ale w ciągu dnia, gdy serwer jest obciążony. Bardzo ważne jest, aby kopia zapasowa nie wpływała na apache i inne bazy danych działające na tym samym serwerze.

Powinno być możliwe użycie polecenia mysqldump , ale należy uruchomić polecenie z niskim priorytetem.

W jaki sposób mogę to zrobić?

Aktualizacja: Wygląda na to, że zwykłe używanie nice z mysqldump nie działa, ponieważ mysqldump tworzy nowy proces.

andyuk
źródło
czy spojrzałeś na mysqlhotcopy?
@fsb w jaki sposób mysqlhotcopy obsługuje to, czego chce OP?
Tomas

Odpowiedzi:

8

Jeśli masz zapasowy serwer, który poradzi sobie z obciążeniem zapisu serwera, możesz skonfigurować replikację na tym serwerze, a następnie wykonać kopię zapasową z serwera podrzędnego. Ma to również tę zaletę, że można zatrzymać replikację podczas wykonywania kopii zapasowej i uzyskać spójną migawkę danych we wszystkich bazach danych lub we wszystkich tabelach w jednej bazie danych bez wpływu na serwer bazy danych. Jest to konfiguracja, którą zawsze zalecam do tworzenia kopii zapasowych MySQL, jeśli masz zasoby.

Jako niezły bonus masz teraz niewolnika tylko do odczytu, którego możesz używać do powolnych, długich zapytań.

David Pashley
źródło
Niestety ta opcja wygląda na najbardziej pracującą, ale sądzę, że jest to jedyna prawdziwa opcja, jeśli chcę mieć minimalny wpływ na główny serwer.
andyuk,
2
Jest to prawie jedyny sposób na uzyskanie prawidłowo wyciszonej kopii zapasowej, jeśli nie chcesz wpływać na operacje. Ponieważ spowolnienie mysqldumpspowoduje albo długi blokadę lub stoły nie będą zsynchronizowane.
Dan Carley,
15

Andy, wydaje mi się, że miałeś dużo czasu na znalezienie rozwiązania. Niedawno wymyśliłem rozwiązanie, które działa świetnie dla mnie w arkuszach kalkulacyjnych i pomyślałem, że podzielę się tym.

cstream jest uniwersalnym narzędziem do obsługi strumienia, takim jak UNIX dd, zwykle używanym w potokach zbudowanych z wiersza poleceń. Rzeczą, która sprawia, że ​​cstream jest dla nas użyteczny, jest to, że pozwala ci określić maksymalną przepustowość dla wszystkich danych wejściowych. Oznacza to, że możesz ograniczyć IO dysku dla polecenia mysqldump za pomocą prostego polecenia takiego jak to:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

Zakładając, że tworzona jest kopia zapasowa bazy danych, która korzysta ze wszystkich tabel InnoDB, powyższe polecenie jest bezpieczne (nie wpłynie na inne zapytania) i wykona mysqldump, ograniczając jednocześnie odczyt dysku do jednego megabajta na sekundę. Dostosuj przepustowość za pomocą parametru -t do dowolnej wartości, która pozwoli Twojemu środowisku wykonać kopię zapasową bez wpływu na zadowolenie klienta.

Brandon
źródło
Właśnie przetestowałem i działa jak urok! Dzięki za udostępnienie Brandona!
sucotronic
4

FWIW powinieneś być w stanie to zrobić również z pv ( http://linux.die.net/man/1/pv )

mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m> destination (lub | nc lub | tar cfj backup.bz2 -)

Zaletą tego są różne opcje monitorowania postępu oraz opcja -R, która pozwala przekazać opcje do już uruchomionego procesu, np. --rate-limit, aby zmienić szybkość transferu.

alex.pilon
źródło
1

jeśli używasz innodb, możesz wypróbować xtrabackup z --throttle opcją .

równie dobrze możesz na to spojrzeć ionice i uruchomić z nim mysqldump.

a może chcesz włączyć binarne logowanie w mysql i uruchamiać pełny zrzut raz na tydzień / noc, jednocześnie kopiując bin-logi do bezpiecznej lokalizacji co 1-2 godziny. i .. opcja slave tylko do odczytu do celów tworzenia kopii zapasowych jest również opcją.

pQd
źródło
0

Jeśli używasz go w systemie Linux lub innym wariancie * nix, możesz to zrobić w następujący sposób:

nice -n ## mysqldump

To da mu niższy priorytet planowania. Szeregowanie priorytetu w zakresie od -20 (najwyższy priorytet) do 19 (najniższy priorytet) wartością domyślną dla nice jest 10, jeśli argument -n zostanie pominięty.

Kevin K.
źródło
0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

ionice dla priorytetu I / O i miły dla priorytetu procesora.

Uruchom vmstat 5, sprawdź kolumnę z napisem WA. Wysoka wartość oznacza, że ​​procesor czeka na operacje we / wy. Użyj ionice, jeśli to tylko obciążenie procesora, użyj ładnego.

Odpowiedź na aktualizację:

Wygląda na to, że masz rację. Wywołuje mysql, który nie jest z niczego. Myślę, że możesz użyć do tego renice i ustawić fajną wartość po uruchomieniu.

Nie mam jednak wystarczająco dużej bazy danych, aby zrzucić bankomat, aby zrobić dla ciebie przydatny skrypt.

Replikacja, jak sugeruje link, jest jedną z możliwości. Replikuj, zatrzymaj i zrzuć na innym hoście.

artefex
źródło
0

Umieść swoje dane MySQL na LV i użyj udoskonalonego zadania mylvmbackup, które wykonuje migawkę LV i analizuje pliki danych MySQL. W ten sposób nie blokujesz tabel, minimalizując wpływ na twoje aplikacje tylko na obciążenie IO.

rodjek
źródło
0

Zawsze możesz spróbować nie uruchamiać go w godzinach szczytu. Niezależnie od tego, jakiego priorytetu użyjesz, zrzut nadal będzie wymagał blokady na wszystkich twoich stołach.

Piotr
źródło
To nie jest prawda: jeśli tabele są InnoDB, nie jest na nich blokowana do odczytu.
dr01