Gibt es irgendwelche Gefahren / Dinge müssen Sie wissen, wenn sie von MyISAM auf InnoDB zu ändern

StackOverflow https://stackoverflow.com/questions/225150

Frage

Eines meiner Projekte verwenden die MyISAM-Engine in MySQL, aber ich überlege es InnoDB zu ändern, wie ich Transaktionsunterstützung hier und da muß.

  • Was muss ich sehen oder prüfen, bevor dies zu tun?
  • Kann ich nur den Motor ändern, oder die Daten sollten darauf vorbereitet sein?
War es hilfreich?

Lösung

Ja absolut, es gibt viele Dinge, sollten Sie Ihre Anwendung testen, äußerst gründlich:

  • Transaktionen können Deadlock und wiederholt werden müssen. Dies ist der Fall (in einigen Fällen) sogar mit einer autocommitted Transaktion, die nur eine Zeile einfügt.
  • Disc Verbrauch wird mit ziemlicher Sicherheit erhöhen
  • I / O-Last während des Schreibens wird mit ziemlicher Sicherheit erhöhen
  • Verhalten der Indizierung wird sich ändern, weil InnoDB verwendet Clustered-Indizes - dies ist eine positive Wirkung in einigen Fällen sein kann
  • Ihre Backup-Strategie wird beeinflusst. Betrachten Sie diese sorgfältig durch.

Der Migrationsprozess selbst sorgfältig geplant werden muß, da es eine lange Zeit in Anspruch nehmen, wenn Sie eine große Datenmenge haben (während dieser Zeit die Daten werden entweder nur lesbar oder vollständig nicht verfügbar - prüfen)

Andere Tipps

Es ist ein großer Nachteil. Wenn Sie jede Art von Hardware-Fehler erhalten (oder ähnliches) während eines Schreib, InnoDB wird korrupt Tabellen.

MyISAM wird auch, aber ein mysqlcheck --auto-Reparatur wird sie reparieren. Der Versuch, dies mit InnoDB-Tabellen fehl. Ja, das ist aus Erfahrung.

Dies bedeutet, dass Sie einen guten regelmäßige Datensicherung Plan haben müssen InnoDB zu verwenden.

Einige andere Hinweise:

InnoDB nicht die freien Speicherplatz auf dem Dateisystem neu zuweisen, nachdem Sie eine Tabelle / Datenbank löschen oder einen Datensatz löschen, kann dies durch „Dumping und importieren“ oder Einstellung innodb_file_per_table=1 in my.cnf gelöst werden.

Hinzufügen / Indizes auf einer großen InnoDB-Tabelle entfernen kann ziemlich schmerzhaft sein, weil es die aktuelle Tabelle sperrt, erstellt einen temporären mit veränderten Indizes und fügt Daten - Zeile für Zeile. Es gibt eine Plugin von Innobase , aber es funktioniert nur für MySQL 5.1

InnoDB ist auch viel Speicher intensiv, empfehle ich Ihnen als große innodb_buffer_pool_size Variable zu haben, wie der Server-Speicher erlaubt (70-80% sollte eine sichere Wette sein). Wenn Ihr Server UNIX / Linux ist, sollten Sie sysctl Variable vm.swappiness auf 0 reduziert und verwenden innodb_flush_method=O_DIRECT doppelte Pufferung zu vermeiden. Testen Sie, ob Sie Swap treffen, wenn jene values.You Makeln immer mehr lesen kann unter Percona Blog , was toll ist.

Sie können aber auch mysqlbackup mit --single-transaction --skip-lock-tables und haben keine Tabellensperren laufen, während die Sicherung beginnt.

In jedem Fall ist InnoDB groß, lassen Sie sich nicht einige Fallen Sie entmutigen.

Sie einfach die Tabelle zu ändern und die Motoreinstellung sollte in Ordnung sein.

  • Eine der Großen zu achten ist, dass select count(*) from MyTable ist viel langsamer in InnoDB als MyISAM.
  • auto_increment Werte werden in der Tabelle 1 nach einem Neustart des Servers auf den höchsten Wert zurückgesetzt - dieses lustige Probleme verursachen können, wenn Sie eine unordentliche db mit einigen Löschungen haben
  • .
  • Optimale Servereinstellungen anders als bei einem hauptsächlich MyISAM db sein werden.
  • Stellen Sie sicher, dass die Größe der innodb Datei groß genug ist, alle Ihre Daten zu halten, oder Sie werden durch ständige Umverteilung gekreuzigt werden, wenn Sie die Motoren der Tabellen ändern.

Wenn Sie beabsichtigen, InnoDB als eine Möglichkeit zu nutzen gleichzeitige Abfragen zu bekommen, dann wollen Sie innodb_file_trx_commit=1 setzen, so dass Sie einige Performance zurück. OTOH, wenn Sie waren auf der Suche erneut Code Ihre Anwendung Transaktion darüber im Klaren sein, dann diese Einstellung entscheidet, wird die InnoDB-Einstellungen benötigte Teil der allgemeinen Leistungsbeurteilung sein.

Die andere große Sache zu achten ist, dass InnoDB nicht Volltextindizes nicht unterstützt, noch VERZÖGERTE einfügen. Aber dann ist MyISAM nicht referentielle Integrität unterstützen. : -)

Sie können jedoch nur die Tabellen, die Sie beachten müssen Transaktion rücken. Ich habe dies getan. Kleine Tische (bis zu mehreren tausend Zeilen) können oft on-the-fly geändert werden, nebenbei bemerkt.

Die Leistungsmerkmale können unterschiedlich sein, so dass Sie ein Auge auf die Last zu halten brauchen.

Die Daten werden in Ordnung sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top