Wszystkie dane to InnoDB
Oto, co da ci dokładną migawkę danych w czasie:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
tworzy punkt kontrolny, który pozwala zrzutowi przechwycić wszystkie dane przed punktem kontrolnym podczas odbierania nadchodzących zmian. Te nadchodzące zmiany nie stają się częścią zrzutu. Zapewnia to taki sam moment dla wszystkich tabel.
--routines
zrzuca wszystkie procedury przechowywane i funkcje przechowywane
--triggers
zrzuca wszystkie wyzwalacze dla każdej tabeli, która je ma
Wszystkie dane to MyISAM lub Mix InnoDB / MyISAM
Będziesz musiał nałożyć globalną blokadę odczytu, wykonać mysqldump i zwolnić globalną blokadę
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
Spróbuj !!!
AKTUALIZACJA 22.06.2012 08:12 EDT
Ponieważ masz mniej niż 50 MB danych, mam inną opcję. Zamiast uruchamiać komendę SLEEP w tle, aby zablokować globalną blokadę odczytu przez 86400 sekund (24 godziny) tylko po to, aby uzyskać identyfikator procesu i zabić na zewnątrz, spróbujmy ustawić 5-sekundowy limit czasu w mysql zamiast w systemie operacyjnym:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
Jest to czystsze i prostsze podejście do bardzo małych baz danych.
ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
oczekiwany jest komunikat o błędzie?--single-transaction
opcji, jak wspomniano w innej odpowiedzi.--lock-tables
.Zobacz oficjalną dokumentację tutaj
źródło
Jeśli chcesz to zrobić dla MyISAM lub tabel mieszanych bez żadnych przestojów w blokowaniu tabel, możesz skonfigurować podrzędną bazę danych i zabrać stamtąd migawki. Ustawienie bazy danych podrzędnych niestety powoduje eksport przestarzałej bazy danych przez pewien czas przestoju, ale po jej uruchomieniu powinieneś być w stanie zablokować jej tabele i eksportować przy użyciu metod opisanych przez innych. Gdy tak się dzieje, opóźnia się w stosunku do wzorca, ale nie powstrzymuje wzorca przed aktualizacją swoich tabel i nadrabia zaległości po zakończeniu tworzenia kopii zapasowej.
źródło
Oto jak to zrobiłem. Powinien działać we wszystkich przypadkach, ponieważ używa
FLUSH TABLES WITH READ LOCK
.Polecenie powłoki
sleep
służy tylko do upewnienia się, że zadanie w tle uruchamiające polecenie blokujące mysql jest wykonywane przed uruchomieniem mysqldump. Możesz go skrócić do 1 sekundy i nadal powinno być dobrze. Zwiększ go do 30 sekund i spróbuj wstawić wartości do dowolnej tabeli innego klienta w ciągu tych 30 sekund, kiedy zobaczysz, że jest zablokowana.Korzystanie z ręcznego blokowania tła ma dwie zalety, zamiast korzystania z
mysqldump
opcji--single-transaction
i--lock-tables
:mysqldump
w tym samym okresie blokowania. Jest to przydatne na przykład podczas konfigurowania replikacji w węźle głównym, ponieważ musisz uzyskać pozycję dziennika binarnego zSHOW MASTER STATUS;
dokładnym stanem utworzonego zrzutu (przed odblokowaniem bazy danych), aby móc utworzyć podrzędną replikację.źródło
Oficjalna dokumentacja mysql sugeruje, że powinieneś mieć główną bazę danych „M1” i bazę danych Slave „S1”, która jest opisana w „Scenariuszu 2: Tworzenie kopii zapasowej za pomocą urządzenia tylko do odczytu” Tworzenie kopii zapasowej urządzenia nadrzędnego lub urządzenia podrzędnego przez utworzenie go Tylko czytać
Powinieneś ustawić bazę danych slave tylko do odczytu i wykonać th
źródło
jeśli masz bardzo dużą tabelę MYISAM i musisz ją zrzucić bez blokady i uniknąć dużego obciążenia serwera, możesz użyć następującego skryptu.
źródło