17
Apr
08

MySQL Migration von MyISAM auf InnoDB

Heute stand bei der Arbeit eine Migration einer MySQL Datenbank von MyISAM auf InnoDB an. Das entsprechende Hybris-System läuft zwar dann etwas langsamer (MySQL spricht von etwa 20%), doch der Vorteil des Sperren einzelner Zeilen (Row level locking) bein InnoDB im Gegensatz zur ganzen Tabelle (Table level locking) bei MyISAM ist gerade bei einem e-Commerce System, wo ständig Produktdaten von diversen Distributoren automatisch synchronisiert werden, immens. Wo früher beim Abgleich von tausenden von Produkten fast das ganze System in die Knie ging, merkt man das nach der Migration die konkurierenden SELECT und INSERT/UPDATE Statements fliessender aneinander vorbeikommen.

Als erstes wird von der zu migrierenden Datenbank einen Dump gemacht. Das System sollte während der Migration nicht auf die Datenbank zugreifen, da sonst Daten verloren gehen würden. Grundsätzlich arbeite ich immer in einer Screen-Session, damit die Migration bei einem Abbruch der SSH Verbindung auf den Server auch weiterläuft und ich mich einfach wieder einklinken kann. Ein kleiner Trick für den schnelleren Import ist das Ausschalten des automatischen Schreibens der Transaktionen während des Importes. Somit wird nicht nach jedem einzelnen INSERT-Statement die Transaktion automatisch beendet und gleich wieder eine neue Transaktion gestartet.


m-kessler@xabbu:~$ screen -S MySQLUpdate
m-kessler@xabbu:~$ sudo echo "SET AUTOCOMMIT = 0;"  > database.sql
m-kessler@xabbu:~$ sudo mysqldump -u dbuser -p database >> database.sql
m-kessler@xabbu:~$ sudo echo "COMMIT;" >> database.sql

Wobei dbuser der Name des Datenbankbenutzers ist und database der Name der zu migrierenden Datenbank. Jetzt liegt der SQL Dumo auf der Platte und die Umstellung des Tabellentyps kann beginnen. Ich benutze einfach sed dafür:


m-kessler@xabbu:~$ sudo sed -i 's/MyISAM/InnoDB/g' database.sql

Da MySQL unterschiedliche Konfigurationen ermöglicht für die verschiedenen Tabellentypen, sollte man tunlichst die my.cnf von MySQL öffen und die InnoDB Einstellungen auskommentieren und gegebenenfalls anpassen. Danach muss die Datenbank neu gestartet werden:


m-kessler@xabbu:~$ sudo vim /etc/my.cnf
m-kessler@xabbu:~$ sudo /etc/init.d/mysql restart

In einem letzten Schritt können wir nun den Dump wieder einlesen:


m-kessler@xabbu:~$ sudo mysql -u dbuser -p database < database.sql

Finito!





November 2008
M D M D F S S
« Okt    
 12
3456789
10111213141516
17181920212223
24252627282930

Werbung


Buttonitis