mysqldumps mit InnoDB und MyISAM zusammen schließen sich gegenseitig aus. Hier ist warum:
Wenn Sie sich bei mysql anmelden können, während ein mysqldump ausgeführt wird, wird Folgendes angezeigt:
SELECT /* SQL_NO_CACHE */ * FROM tblname
Standardmäßig führt mysqldump Folgendes aus:
- Jede Datenbank wird in alphabetischer Reihenfolge ausgegeben
- Jede Tabelle, die pro Datenbank ausgegeben wird, wird in alphabetischer Reihenfolge ausgegeben (unabhängig von der Speicher-Engine).
Dies sollte für eine MySQL-Instanz ohne andere Datenbankaktivität in Ordnung sein. InnoDB-Tabellen und MyISAM-Tabellen beeinflussen sich nicht gegenseitig.
Bei Verwendung --single-transaction
gegen eine All-InnoDB-MySQL-Instanz wird ein Prüfpunkt erstellt und alle Tabellen werden zum gleichen Zeitpunkt ausgegeben. Sobald eine MyISAM-Tabelle gefunden wurde, sind alle Wetten geschlossen. Dies könnte dazu führen, dass alle InnoDB-Tabellen nach dem MyISAM zu einem anderen Zeitpunkt ausgegeben werden.
Um einen konsistenten Zeitpunkt-Dump für eine Mischung aus InnoDB und MyISAM zu haben, haben Sie dort Optionen
OPTION 1
Starten Sie mysql neu, damit sich niemand über TCP / IP und dann über mysqldump anmelden kann
service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart
OPTION 2
Wenn alle MyISAM-Tabellen nur zum Lesen bestimmt sind, verwenden Sie einfach --slele-transaction mysqldump
OPTION 3
Wenn MyISAM-Tabellen geschrieben werden, reicht eine einzige Transaktion nicht aus
Sie müssen Folgendes tun:
mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql
Melden Sie sich sofort nach Abschluss von mysqldump bei mysql an und tun Sie dies show processlist;
. Suchen Sie nach der Abfrage SELECT SLEEP(86400)
, suchen Sie die Prozess-ID und führen Sie sie ausKILL <procidnumn>;