2012-05-22 10 views
7

Przeszedłem przez instrukcję i wspomniano, że każda transakcja doda oświadczenie BEGIN zanim zacznie robić zrzut. Czy ktoś może to rozwinąć w bardziej zrozumiały sposób?Dlaczego mysqldump z jedną transakcją jest bardziej spójny niż bez?

Oto co czytam:

Ta opcja wydaje BEGIN SQL przed dumpingu danych z serwera. Jest to przydatne jedynie z tabel transakcyjnych, takich jak InnoDB i BDB, bo wtedy zrzuca spójnego stanu bazy danych w momencie BEGIN zostało wydane bez blokowania żadnych wniosków.”

Can niektóre opracowania na ten temat?

+1

Być może dodaj linki lub cytaty z konkretnych części instrukcji, których potrzebujesz, w przeciwnym razie domyślamy się, co chcesz wiedzieć. – Cylindric

+0

Zaktualizowałem wpis. proszę spojrzeć na. – Uday

Odpowiedz

23

Ponieważ zrzut jest w jednej transakcji, uzyskujesz spójny widok wszystkich tabel w bazie danych. Najlepiej można to wytłumaczyć kontrprzykładem. Załóżmy, że zrzut bazy danych z dwóch tabel, Orders i OrderLines

  1. rozpocząć zrzut bez pojedynczej transakcji.
  2. Kolejny proces wstawia wiersz do tabeli .
  3. Kolejny proces wstawia wiersz do tabeli OrderLines.
  4. Dump przetwarza tabelę OrderLines.
  5. Inny proces usuwa zapisy Orders i OrderLines.
  6. Dump przetwarza tabelę .

W tym przykładzie twój zrzut będzie miał wiersze dla OrderLines, ale nie Orders. Dane byłyby niespójne i nie powiodłyby się po przywróceniu, gdyby istniał klucz obcy między Orders i OrderLines.

Jeśli zrobiłeś to w pojedynczej transakcji, zrzut nie miałby ani zamówienia, ani linii (ale byłby spójny), ponieważ oba zostały wstawione, a następnie usunięte po rozpoczęciu transakcji.

+0

Wymyśliłeś lepszy/bardziej przejrzysty przykład niż ja, tak myślę. :) – Cylindric

+1

To naprawdę lepsze wyjaśnienie .. dzięki Eric .. Mam wątpliwości. Jeśli mój zrzut trwa godzinę, a co powiesz na transakcję w ciągu tej 1 godziny, to ...? Czy są przechowywane w buforach i przepłukiwane na dysk po zakończeniu zrzutu? lub jak to się dzieje ...? – Uday

5

Zdarzyło mi się napotkać problemy, w których mysqldump bez parametru - pojedyncza transakcja konsekwentnie kończyłby się niepowodzeniem z powodu zmiany danych podczas zrzutu. O ile mogę to sobie wyobrazić, po uruchomieniu go w ramach pojedynczej transakcji zapobiega wszelkie zmiany, które wystąpią podczas zrzutu, powodują problem.Zasadniczo, podczas wydawania - pojedynczej transakcji, robi migawkę bazy danych w tym czasie i zrzuca ją zamiast dumpin g danych, które mogą się zmieniać podczas działania narzędzia.

+0

Czy masz na myśli, że podczas zrzutu wszystkie transakcje będą miały miejsce tylko u buufów i nie zostaną odzwierciedlone lub przepłukane na dysk, dopóki nie zakończy się zrzut? – Uday

+0

Myślę, że kopiuje migawkę do pamięci lub do tabel tymczasowych, a następnie zrzuca je. –

+1

@Uday Nie przejmuj się zbytnio * jak * to robi, ponieważ zależy od wielu czynników. Koncepcja pozostaje taka sama dla wszystkich rodzajów różnych silników, czy to MySQL, MSSQL, Oracle, cokolwiek. – Cylindric

5

Może to być ważne w przypadku kopii zapasowych, ponieważ oznacza to, że wszystkie dane są dokładnie takie, jak w danym momencie.

Tak na przykład wyobrazić sobie prostą bazę danych blogu, a typowy nieco aktywności może być

  1. Tworzenie nowego użytkownika
  2. Utwórz nowy post przez użytkownika
  3. Usuwanie użytkownika, który usuwa post

teraz podczas tworzenia kopii zapasowej bazy danych, kopia zapasowa może backup tabele w tej kolejności

  1. Posty
  2. Użytkownicy

Co się stanie, jeśli ktoś usunie użytkownika, który jest wymagany przez postach, tuż po zapasowy osiągnie # 1?

Podczas przywracania danych zobaczysz, że masz wpis, ale użytkownik nie istnieje w kopii zapasowej.

Umieszczenie transakcji wokół całości oznacza, że ​​wszystkie kopie zapasowe nie spowodują aktualizacji, wstawień i usunięć w bazie danych podczas tworzenia kopii zapasowej.

Powiązane problemy