it-swarm.com.de

Wie konvertiere ich eine Datenbank von MyISAM nach InnoDB?

Ich werde alle Tabellen der 500-MB-Datenbank von MyISAM in InnoDB konvertieren, um zu sehen, ob dies die Gesamtleistung einer ausgelasteten Drupal 6-Site) verbessert. Ich frage mich, was die beste (dh sicherste) ist/einfachste/schnellste) Weg, um die Konvertierung durchzuführen.

9
alfish

Als MySQL-DBA vertraue ich darauf, dass MySQL die Konvertierung durchführt, indem MySQL das Skript für mich schreibt.

Führen Sie mit dem Linux-Befehl diese Abfrage aus

mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',db,'.',tb,' ENGINE=InnoDB;') FROM (SELECT A.db,A.tb,A.tbsize FROM (SELECT table_schema db,table_name tb,(data_length+index_length) tbsize FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) A LEFT JOIN (SELECT table_schema db,table_name tb FROM information_schema.statistics WHERE index_type='FULLTEXT') B USING (db,tb) WHERE B.db IS NULL) AA ORDER BY tbsize" > /root/ConvertMyISAM2InnoDB.sql

Das Skript konvertiert zuerst die kleinsten Tabellen. Dieses Skript hat auch alle MyISAM-Tabellen mit FULLTEXT-Indizes umgangen.

Nachdem Sie sich das Skript angesehen haben, können Sie es einfach wie folgt in MySQL ausführen:

mysql -h... -u... -p... -A < /root/ConvertMyISAM2InnoDB.sql

oder wenn Sie den Zeitpunkt jeder Konvertierung sehen möchten, melden Sie sich bei mysql an und führen Sie Folgendes aus:

mysql> source /root/ConvertMyISAM2InnoDB.sql

Dies sollte nicht durcheinander gebracht werden, da bei der Ausführung der Konvertierung eine vollständige Tabellensperre auftritt.

Sobald alle Tabellen konvertiert sind, müssen Sie die MySQL-Einstellungen für die InnoDB-Verwendung optimieren und den key_buffer verkleinern.

Bitte lesen Sie dies, um den InnoDB-Pufferpool festzulegen: https://dba.stackexchange.com/questions/1/what-are-the-main-differences-between-innodb-and-myisam/2194#2194

Bitte lesen Sie dies auch: https://drupal.stackexchange.com/questions/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367

Versuche es !!!

7
RolandoMySQLDBA

Ich habe vor einiger Zeit einen Drush-Befehl dafür geschrieben.

<?php
/**
 * Implements hook_drush_command().
 */
function convert_drush_command() {
  $items = array();

  // the key in the $items array is the name of the command.
  $items['convert-engine'] = array(
    // a short description of your command
    'description' => "Convert MYSQL Table Type",
  );
  return $items;
}

function drush_convert_engine() {
  $args = func_get_args();
  $engine = $args[0];

  $result = db_query("SHOW TABLES");
  while ($row = db_fetch_array($result)) {
    $table = array_shift($row);
    drush_log(dt('Converting @table to @engine', array('@table' => $table, '@engine' => $engine)), 'success');
    db_query("ALTER TABLE $table ENGINE = $engine");
  }
}

Hat vor ungefähr einem Jahr für mich gearbeitet und ist sich nicht sicher, ob sich die Drush-API seitdem geändert hat.

Sie können das in einer convert.drush.inc ablegen, zum Beispiel im Ordner .drush, oder es irgendwie auf Ihrer Site ausführen, zum Beispiel mit dem php-Block devel execute. Als Drush-Skript können Sie es so nennen:

drush convert-engine InnoDB

Warnung: Wenn jemand etwas mit der Datenbank macht, während diese Befehle ausgeführt werden, wird Ihre Datenbank komplett durcheinander gebracht. Nicht wiederherstellbar. Versetzen Sie Ihre Site in den Wartungsmodus und erstellen Sie ein Backup, bevor Sie dies versuchen! Und natürlich probieren Sie zuerst eine Entwicklungs-/Test-Site an :)

4
Berdir
#!/bin/sh
DBNAME="your-database"
DBUSER="your-username"
DBPWD="your-password"
for t in $(mysql -u$DBUSER -p$DBPWD --batch --column-names=false -e "show tables" $DBNAME);
do
echo "Converting table $t"
mysql -u$DBUSER -p$DBPWD -e "alter table $t engine=InnoDB" $DBNAME;
done

Quelle

2
alfish