Czy tabele InnoDB zostały zablokowane podczas mysqldump po zmieszaniu z MyISAM?

9

Szukam rozwiązania do tworzenia kopii zapasowych dla moich serwerów mysql i potrzebuję jak najmniej przestojów. Mam następujące:

  • Serwery MySQL
  • nie są replikowane
  • każdy serwer oznacza swój własny

Liczba ta może wzrosnąć, więc konfiguracja replikacji master / slave nie będzie dobrym pomysłem.

Najprostszym sposobem tworzenia kopii zapasowych, jak widzę, byłoby użycie mysqldump z oprogramowaniem takim jak „automysqlbackup”. Moje najważniejsze dane wykorzystują InnoDB. Moje tabele InnoDB są dość ciężkie.

Pytanie brzmi: jeśli zrobię mysqldump do wszystkich baz danych na serwerze, czy zablokuje on moje tabele Innodb?

tounano
źródło

Odpowiedzi:

7

mysqldumps z InnoDB i MyISAM razem są traktowane jako wykluczające się wzajemnie. Oto dlaczego:

Jeśli możesz zalogować się do mysql, gdy trwa mysqldump, zobaczysz coś takiego:

SELECT /* SQL_NO_CACHE */ * FROM tblname

Domyślnie mysqldump wykonuje następujące czynności:

  • Każda baza danych jest zrzucana w kolejności alfabetycznej
  • Każda tabela zrzucana na bazę danych jest zrzucana w kolejności alfabetycznej (niezależnie od silnika pamięci)

Powinno to być odpowiednie dla instancji MySQL, która nie ma innej aktywności w bazie danych. Tabele InnoDB i MyISAM nie wpływają na siebie.

Korzystanie --single-transactionz instancji MySQL opartej na InnoDB tworzy punkt kontrolny i zrzuca wszystkie tabele z tego samego punktu w czasie. Po napotkaniu stołu MyISAM wszystkie zakłady są wyłączone. Może to spowodować zrzucenie wszystkich tabel InnoDB po MyISAM z innego punktu w czasie.

Aby uzyskać spójny zrzut punktu w czasie dla mieszaniny InnoDB i MyISAM, masz tam opcje

OPCJA 1

Zrestartuj mysql, aby nikt inny nie mógł się zalogować przez TCP / IP, a następnie mysqldump

service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart 

OPCJA 2

Jeśli wszystkie tabele MyISAM są tylko do odczytu, po prostu mysqldump używa --single-transaction

OPCJA 3

Jeśli zapisywane są tabele MyISAM, - pojedyncza transakcja nie wystarczy

Będziesz musiał wykonać następujące czynności:

mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql

Natychmiast po zakończeniu mysqldump zaloguj się do mysql i zrób show processlist;. Wyszukaj zapytanie SELECT SLEEP(86400), znajdź identyfikator procesu i uruchomKILL <procidnumn>;

RolandoMySQLDBA
źródło
5

mysqldump --single-transactionnie blokuje tabel, ale tabele MyISAM nie gwarantują spójnych zrzutów z tą opcją. Lepiej jest używać mydumper, mydumperblokuje tabele MyISAM i nie blokuje InnoDB, więc zrzut jest spójny.

Alex
źródło
Wow, dzięki za to świetne narzędzie! Czy znasz narzędzie, które może zautomatyzować codzienne, cotygodniowe, miesięczne kopie zapasowe za pomocą mydumper? Coś w stylu „automysqlbackup”, tylko z mydumper? Dzięki.
tounano
0

mysqldump blokuje tabelę podczas zrzutu. Użyj migawek LVM lub Xtrabackup .

Wasif
źródło