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-transaction
z 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>;
mysqldump blokuje tabelę podczas zrzutu. Użyj migawek LVM lub Xtrabackup .
źródło