it-swarm.it

Come posso convertire un database da MyISAM a InnoDB?

Ho intenzione di convertire tutte le tabelle del database da 500 MB da MyISAM a InnoDB per vedere se migliorerà le prestazioni complessive di un sito occupato Drupal 6. Mi chiedo quale sia il migliore (ovvero il più sicuro)/più semplice/più veloce) per eseguire la conversione.

9
alfish

In qualità di DBA MySQL, mi fido che MySQL esegua la conversione facendo in modo che MySQL scriva lo script per me.

Formare il comando Linux eseguire questa query

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

Lo script convertirà prima le tabelle più piccole. Questo script ha anche ignorato qualsiasi tabella MyISAM che ha indici FULLTEXT.

Dopo aver esaminato lo script, puoi semplicemente eseguirlo in MySQL come segue:

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

o se vuoi vedere i tempi di ogni conversione, accedi a mysql ed esegui questo:

mysql> source /root/ConvertMyISAM2InnoDB.sql

Questo non dovrebbe essere incasinato perché si verifica un blocco completo della tabella durante l'esecuzione della conversione.

Una volta convertite tutte le tabelle, è necessario ottimizzare le impostazioni di MySQL per l'utilizzo di InnoDB e ridimensionare il key_buffer.

Si prega di leggere questo per impostare il pool di buffer InnoDB: https://dba.stackexchange.com/questions/1/what-are-the-main-differences-between-innodb-and-myisam/2194#2194

Si prega di leggere anche questo: https://drupal.stackexchange.com/questions/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367

Provaci !!!

7
RolandoMySQLDBA

Ho scritto un comando drush per questo qualche tempo fa.

<?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");
  }
}

Ha funzionato per me circa un anno fa, non sono sicuro se l'API Drush sia cambiata da allora.

Puoi inserirlo in un file convert.drush.inc, ad esempio nella cartella .drush o eseguirlo in qualche modo sul tuo sito, ad esempio con il blocco php deve execute. Come drush script, puoi chiamarlo così:

drush convert-engine InnoDB

Avviso: se qualcuno esegue qualcosa con il database mentre questi comandi sono in esecuzione, il tuo database sarà completamente incasinato. Unrecoverably. Quindi, imposta il tuo sito in modalità manutenzione ed esegui un backup prima di provare questo! E, naturalmente, prova prima su un sito di sviluppo/test :)

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

fonte

2
alfish