2010 . SEPTEMBER
SUN
MON
TUE
WED
THU
FRI
SAT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Werbeplatz (160x160px)
Wer Interesse hat kann sich bei mir via E-Mail melden.
.tel +49 173 4964512
July 9, 2009
Konvertierung von InnoDB zu MyISAM
Eigentlich ist das Ganze recht einfach, bei kleinen DB’s kann man es auch über phpMyAdmin realisieren. Wenn man nun aber Tabellen mit etlichen GB größe hat wird das ganze schon etwas komplizierter.
Erstmal sollte man kurz ein backup via shell ziehen(Option –C für die Kompression):
mysqldump -u root -p --opt -C --database --database mydb > /backup/mydb.sql
Da es schon mal etwas dauern kann mit einem
watch -d -n 5 'ls -lh mydb.sql'
Kann man den aktuellen fortschritt verfolgen –n 5 besagt das wir alle 5 Sekunden eine Aktualisierung wollen.
Nach dem Abschluss kann man sich nun einloggen und die richtige DB auswählen sowie das Statement absetzen.
mysql -u root –p
USE mydb;
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=MyISAM;') FROM information_schema.tables WHERE engine = 'InnoDB';
Die Ausgabe kann man sich direkt wieder ausführen lassen. Dabei stellte sich bei mir folgendes Problem wenn man Tabellen mit einer Größe von mehr als einem GB konvertieren möchte:
MySQL Error 1206 The total number of locks exceeds the lock table size
Nach einigen Fehleranalysen konnte ich feststellen das InnoDB die Transaktion auf Datensatzbasis sichert. Und nicht das Lock auf die Tabelle setzt. Auch hier gibt es wieder verschiedene Ansätze. Ein relativ einfacher ist das Ändern eines Eintrages in /etc/my.cnf
[mysqld]
innodb_buffer_pool_size=256M
Die Default-Einstellung ist 8M aber 256M sollte auch für Leute ohne Cluster funktionieren. Danach einen kurzen /etc/init.d/mysql restart und schon funktioniert alles. Die Statements werden nun auch für große Tabellen mit vielen Einträgen korrekt abgearbeitet.
Permlink|Reply