MySQL Datenbank Engine konvertieren

mysql

Hin und wieder muss man eine Datenbank mit der alten MyISAM Engine auf den neueren, schnelleren Standard InnoDB konvertieren, z.B. bei Updates von Magento oder Moodle.
Die beste Möglichkeit dies zu bewerkstelligen, ist ein kleines Skript wie dieses:

< ?php

//MySQL Verbindung aufbauen
$db_server = 'localhost';
$db_user = "USER";
$db_password = "PASSWORD";

mysql_connect($db_server, $db_user, $db_password) or die(mysql_error());

// Liste der Datenbanken die konvertiert werden sollen
$dblist = array('DBNAME');

// Datenbanken die nicht konvertiert werden sollen
$skip_db_list = array('information_schema', 'mysql');

// Alte engine
$engineOld = "MyISAM";

// Neue engine
$engineNew = "InnoDB";

// Aktion nicht ausführen, sondern nur ausgeben, für Test
$printonly = false;

// Namen der Datenbanken erfassen, falls diese nicht explizit angegeben wurden
$skip_db_text = '"'.implode('", "', $skip_db_list).'"';
if(count($dblist) &amp;amp;amp;lt;1 ) {
$sql="SELECT GROUP_CONCAT(`SCHEMA_NAME` SEPARATOR ',') AS FRST FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` NOT IN ($skip_db_text)";
$result = mysql_query($sql) or die(mysql_error());
$data = mysql_fetch_assoc ($result);
$dblist = explode(",", $data["FRST"]);
}

// Durch die Datenbanken iterieren
foreach ($dblist as $dbname) {
$sql = "SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` ENGINE=$engineNew;') as FRST FROM `information_schema`.`TABLES` t WHERE t.`TABLE_SCHEMA` = '$dbname' ORDER BY 1";

$result = mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {

if(true != $printonly) {
mysql_query($row["FRST"]) or die(mysql_error());
echo $row["FRST"]."\r\n";
} else {
echo $row["FRST"]."\r\n";
}
}
}
?>

Die Kommentarfunktion ist deaktiviert.