Niekompletny mysqldump


11

Próbuję uruchomić mysqldump, aby utworzyć migawkę bazy danych, i okazuje się, że losowo zatrzyma się w połowie, bez zgłaszania żadnego błędu. Moja baza danych jest stosunkowo niewielka (około 100 MB) i używa InnoDB.

Używam go w następujący sposób:

mysqldump --force --single-transaction --quick --user myuser --password=mypass -h mydatabasehost mydb > /tmp/snapshot.sql

Sprawdzanie raportów kodów wyjścia 0.

Moja wersja to: mysqldump Ver 10.13 Distrib 5.1.52, dla redhat-linux-gnu (i386)

Widziałem kilka podobnych postów, a nawet oficjalny raport o błędach , ale żadne z rozwiązań nie wydaje się mieć zastosowania.

Jak zdobyć mysqldump, aby zrobił pełną migawkę bazy danych?

EDYCJA: Moja baza danych obecnie znajduje się na RDS Amazon.


Czy jest wystarczająco miejsca na dysku? I czy uruchomiłeś CHECK TABLE, aby zobaczyć, czy nie ma uszkodzenia DB w tabelach?

Czy próbowałeś usunąć --forceparametr, aby zobaczyć, jaki błąd się pojawia? Czy --quick?

@Adrian, Tak, mam około 10 GB wolnego miejsca, więcej niż wystarczająco. I tak, wszystkie stoły są w porządku.

@Yzmir, Tak, występuje ten sam problem.

Odpowiedzi:


5

Być może problem polegał na max_allowed_packettym, że nie został ustawiony wystarczająco wysoko zarówno na kliencie (tj. Mysqldump), jak i na serwerze (np. Amazon RDS). Ustawiłem to na 500 M na obu i wydaje się, że to rozwiązało problem.

Ponieważ tabele schematów informacyjnych InnoDB podają tylko szacunkowe liczby wierszy, trudno powiedzieć, czy moja migawka naprawdę zawiera wszystko z RDS. Wszystkie tabele są dostępne, ale liczba wierszy jest różna. Zaktualizuję z bardziej jednoznaczną odpowiedzią, gdy będę miał trochę czasu na napisanie dokładniejszej analizy.


4

Czy próbowałeś?

mysqldump --compress --add-drop-table data --routines --events  --comments --extended-insert -h {host} -u {user} -p {database} > dbdump.sql

Jest to prosty sposób, w jaki zawsze to robię bez żadnych problemów. Zasadniczo zrobienie zrzutu w ten sposób pozwala uzyskać wszystko, co masz (dane, obiekty i czasami cenne komentarze) w pewnym momencie, ignorując niezamówione transakcje.


1
Wystąpił następujący błąd przy próbie uruchomienia tego polecenia:mysqldump: Got error: 1049: "Unknown database 'data'" when selecting the database
Andy

1
@ I teraz masz rację. dev.mysql.com/doc/refman/5.7/en/… . Myślę, że „dane” w ogóle nie powinny tam być.
Rui Marques

1

O ile rozumiem mysql docs - pojedyncza transakcja zakończy się niepowodzeniem, jeśli odczyt zostanie wykonany na stole podczas zrzutu. Jaki jest wynik działania bez „--force --single-transaction -quick”?


Otrzymuję ten sam błąd.
Cerin,

Nie mogłem znaleźć w dokumentacji niczego, co potwierdzałoby to stwierdzenie. AFAIK odczytuje i zapisuje w tabeli są obsługiwane, gdy wykonywana jest - pojedyncza transakcja, ale instrukcje zmieniające strukturę tabeli (ALTER, CREATE, TRUNCATE itp.) Mogą spowodować, że zrzut się nie powiedzie lub dadzą nieoczekiwane dane. ( dev.mysql.com/doc/refman/5.7/en/… )
Code Commander

1

Całkiem możliwe, że tabela jest uszkodzona. Nie mam na myśli, że dane i / lub strony indeksu są uszkodzone. Może być coś bardzo prostego, co jest zepsute.

Niedawno wystąpił problem ze skryptem kopii zapasowej na serwerze Slave, gdy równolegle mysqldumped wiele baz danych. Uruchomienie mysqldump na jednej z baz danych spowodowało bardzo mały mysqldump. DB miał ponad 80 tabel. Jednak mysqldump zatrzymał się przy piątej tabeli w bazie danych. Kiedy pobiegłem SHOW CREATE TABLE tblname\Gpo stole w Slave, dostałem błąd „Nie znaleziono stołu”. Kiedy pobiegłemSHOW CREATE TABLE tblname\G Master, opis tabeli wyświetlany jest zgodnie z oczekiwaniami.

To, co się stało, było trochę szalone: ​​klient poprosił o przywrócenie tabeli, a inżynier przywrócił plik .ibd tabeli InnoDB z kopii zapasowej dysku. Identyfikator obszaru tabel pliku .ibd (który wynosił 25) nie zgadzał się z identyfikatorem obszaru tabel zarejestrowanego w ibdata1 (który wynosił 28).

Rozwiązałem problem, węsząc niewolnika, mysqldumping mistrza i konfigurując replikację od zera. Na szczęście zakres danych i indeksów wyniósł 7 GB. Tak więc proces rstore nie był wielkim problemem.

MORAŁ HISTORII

Podstawowym problemem jest to, że mysqldump nie zgłasza błędu w InnoDB, gdy identyfikator obszaru tabel jest niepoprawny. Gdy mysqldump kończy i nie zrzuca każdej tabeli w kolejności alfabetycznej, oznacza to, że zakończyła się błędem i zrobiła to bez drukowania komunikatu o błędzie.

Sprawdź, aby się upewnić

  • możesz wyświetlić strukturę tabeli za pomocą SHOW CREATE TABLE
  • możesz zapytać o wszystko o tabeli z INFORMACJE_SCHEMA.TABLES

0

Oto burza mózgów na mysqldump i InnoDB:

Proszę pomyśleć o zachowaniu mysqldump względem tabeli InnoDB. Jeśli w puli buforów InnoDB są jakieś brudne strony należące do tabeli, którą zrzucasz, brudne strony tej tabeli muszą zostać wypłukane na dysk, zanim będzie SELECT /* SQL_NO_CACHE */można wykonać przeciwko niej.

Ponieważ używasz Amazon RDS, mam przeczucie, że twoja baza danych jest w infrastrukturze wielodostępnej (możesz to poprawić, jeśli upraszczam to). Inne bazy danych mogą korzystać ze współużytkowanej puli buforów InnoDB, udostępnionego pliku metadanych (ibdata1) i udostępnionego obszaru tabel (ibdata1, jeśli opcja innodb_file_per_table jest wyłączona).

Może również wystąpić pewna nadmiarowość bazy danych, co może mieć wpływ na MVCC względem bazy danych, nawet jeśli jest to niewielki zestaw danych.

Możesz zwiększyć innodb_lock_wait_timeout (domyślnie 50 sekund) w sesji mysqldump, aby sprawdzić, czy ma to jakikolwiek wpływ na Amazon RDS (lub Amazon może zwiększyć ten limit). Spróbuj także eksperymentować z zrzucaniem pojedynczych tabel.

AKTUALIZACJA 14.11.2011 17:58 EDT

Spróbuj wykonać to w ramach sesji DB (ustawia się na dwie minuty):

SET innodb_lock_wait_timeout = 120;

innodb_lock_wait_timeout to parametr statyczny w RDS, którego nie można zmienić.
Cerin,

@Cerin: Zgodnie z Dokumentami możesz to ustawić w swojej sesji.
RolandoMySQLDBA

Co masz na myśli mówiąc „moja sesja”? mysqldump nie wyświetla żadnej opcji dostosowania limitów czasu.
Cerin,

Przepraszam, patrzyłem na to wstecz. Chciałem powiedzieć set innodb_lock_wait_timeout w Amazon RDS.
RolandoMySQLDBA
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.