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

News  |  About me

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.