Linuxspicker

Admins kleiner Zettelkasten für die Lösung von Linuxproblemen

Script für MySQL/MariaDB um Datenbankengine von MyISAM in InnoDB umzuwandeln

Im MySQL bzw. MariaDB kommen verschiedene Datenbankengines mit ihren Vor- und Nachteilen zum Einsatz. Der frühere Standard MyISAM ist praktisch bereits überall durch InnoDB ersetzt worden. Bei MySQL ist InnoDB seit Version 5.5 Standard, bei MariaDB seit Version 10.2. InnoDB hat durch die Absturzsicherheit klare Vorteile.

Dennoch finden sich insbesondere bei älteren Installationen bspw. von Textpattern noch MyISAM-Tabellen, die bei einem Datenbankcrash weiter gefährdet sind. Abhilfe kann hier eine Umwandlung von MyISAM in InnoDB schaffen. Da das per Hand mühselig ist, lässt sich untenstehendes Script einsetzen, das gleichzeitig vor der Umwandlung noch Sicherheitskopien anlegt.

#!/bin/bash
start_time=`date +%s`

echo Sicherung aller Datenbanken ...
for i in $(mysql --defaults-extra-file=/etc/mysql/extra-defaults.cnf --skip-column-names --silent -e'show databases;' | grep -Ev '(mysql|_schema|runtime)'); do /usr/bin/mysqldump --defaults-extra-file=/etc/mysql/extra-defaults.cnf --single-transaction --add-drop-table -h127.0.0.1 $i | bzip2 > /SICHERUNGSVERZEICHNIS/$i-sicherung-MyISAM-`date +\%d.\%m.\%Y-\%X`.sql.bz2; done
echo ... fertig

echo Wechsel der Datenbankengine
for i in $(mysql --defaults-extra-file=/etc/mysql/extra-defaults.cnf --skip-column-names --silent -e'show databases;'|grep -Ev '(mysql|_schema|runtime)'); do mysql --defaults-extra-file=/etc/mysql/extra-defaults.cnf --skip-column-names --silent -e"SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA = '$i' AND engine = 'MyISAM'" | xargs -I{} mysql --defaults-extra-file=/etc/mysql/extra-defaults.cnf -e"SET STATEMENT sql_mode='' FOR ALTER TABLE {} ENGINE='InnoDB' TRANSACTIONAL=1;" $i; done

echo "Laufzeit:" $(expr `date +%s` - $start_time)

Die Zugangsdaten werden in dem Script aus /etc/mysql/extra-defaults.cnf gezogen. Ausgeschlossen werden Datenbanken mit den Schemen mysql|_schema|runtime und der MySQL-Dump ist für den Host 127.0.0.1 eingestellt. Die Datei wird dann gleich mit bzip2 im zu ändernden SICHERUNGSVERZEICHNIS mit Datum im Dateinamen abgelegt. Bzip2 kann auch durch gzip (größere Dateien, schnelleres Packen) oder xz (kleinere Dateien, langsameres Packen) ersetzt werden.

In den eigenen Einstellungsdateien unter /etc/mysql beispielsweise in einer anzulegenden /etc/mysql/mariadb.conf.db/99-local.conf bei MariaDB oder /etc/mysql/mysql.conf.db/99-local.conf bei MySQL lässt sich die Engine zudem noch über folgenden Eintrag festlegen:

[mysqld]
default_storage_engine = 'InnoDB'

Wie oben geschrieben, ist InnoDB aber bei MySQL bereits seit Version 5.5 und bei MariaDB seit Version 10.2. Standarad. Statt mit InnoDB und MyISAM lässt sich in obigem Script auch mit anderen Datenbanksystemen „experimentieren“. Als wirklich „crashsicher“ hat sich aber beispielsweise ARIA in eigenen Tests nicht herausgestellt.


Stichworte: , , , , , ,
Kategorien: ,


Kommentare

Keine Kommentare

Kommentare

Geben Sie Ihren Kommentar hier ein. * Eingabe erforderlich. Sie müssen die Vorschau vor dem Absenden ansehen.