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: Aria, Datenbankengine, Datenbankserver, Innodb, Mariadb, Myisam, Mysql
Kategorien: Linux , Debian