Wurden InnoDB-Tabellen beim Mischen mit MyISAM während mysqldump gesperrt?

9

Ich suche nach einer Backup-Lösung für meine MySQL-Server und benötige so wenig Ausfallzeiten wie möglich. Ich habe folgendes:

  • MySQL-Server
  • Sie werden nicht repliziert
  • Jeder Server steht für sich

Diese Anzahl kann steigen, daher ist das Einrichten einer Master / Slave-Replikation keine gute Idee.

Aus meiner Sicht ist es am einfachsten, mysqldump mit einer Software wie "automysqlbackup" zu verwenden. Meine wichtigsten Daten verwenden InnoDB. Meine InnoDB-Tabellen sind ziemlich schwer.

Die Frage ist: Wenn ich einen mysqldump für alle Datenbanken auf dem Server durchführe, werden dann meine Innodb-Tabellen gesperrt?

tounano
quelle

Antworten:

7

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-transactiongegen 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>;

RolandoMySQLDBA
quelle
5

mysqldump --single-transactionsperrt keine Tabellen, aber es wird nicht garantiert, dass MyISAM-Tabellen mit dieser Option konsistente Speicherauszüge haben. Es ist besser zu verwenden mydumper, mydumpersperrt MyISAM-Tabellen und sperrt InnoDB nicht, damit der Speicherauszug konsistent ist.

Alex
quelle
Wow, danke für dieses großartige Tool! Kennen Sie ein Tool, das tägliche, wöchentliche und monatliche Backups mit mydumper automatisieren kann? So etwas wie "automysqlbackup", nur mit mydumper? Vielen Dank.
Tounano
0

mysqldump sperrt Tabelle während des Dumps. Verwenden Sie LVM-Snapshots oder Xtrabackup .

Wasif
quelle