it-swarm-eu.dev

Jak převést databázi z MyISAM na InnoDB?

Chystám se převést všechny tabulky databáze 500 MB z MyISAM na InnoDB, abych zjistil, zda to zlepší celkový výkon zaneprázdněného Drupal 6 webu.) Zajímalo by mě, co je nejlepší (tj. Nejbezpečnější)/nejjednodušší/nejrychlejší) způsob převodu.

10
alfish
#!/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

zdroj

2
alfish

Jako MySQL DBA věřím, že MySQL provede konverzi tím, že nechá MySQL napsat skript pro mě.

Z příkazu Linux spusťte tento dotaz

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

Skript nejprve převede nejmenší tabulky. Tento skript také obcházel všechny tabulky MyISAM, které mají indexy FULLTEXT.

Po prozkoumání skriptu ho můžete jednoduše spustit v MySQL takto:

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

nebo pokud chcete vidět načasování každé konverze, přihlaste se k mysql a spusťte toto:

mysql> source /root/ConvertMyISAM2InnoDB.sql

To by se nemělo zkazit, protože při provádění převodu dojde k úplnému uzamčení tabulky.

Jakmile jsou všechny tabulky převedeny, musíte vyladit nastavení MySQL pro použití InnoDB a zmenšit key_buffer.

Přečtěte si toto nastavení pro nastavení fondu vyrovnávacích pamětí InnoDB: https://dba.stackexchange.com/questions/1/what-are-the-main-differences-between-innodb-and-myisam/2194#2194

Přečtěte si také toto: https://drupal.stackexchange.com/questions/1715/what-would-the-optimal-mysql-configura-for-a-drupal-7-site-be/2367#2367

Pokusit se !!!

7
RolandoMySQLDBA

Naposledy jsem na to napsal příkaz drush.

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

Pracoval jsem pro mě asi před rokem, nejsem si jistý, zda se rozhraní API pro drush od té doby změnilo.

Můžete to umístit do souboru convert.drush.inc například do složky .drush nebo jej nějakým způsobem spustit na vašem webu, například pomocí devel execute php block. Jako drush skript to můžete nazvat takto:

drush convert-engine InnoDB

Varování: Pokud někdo s databází něco udělá, zatímco tyto příkazy běží, bude vaše databáze zcela zmatená. Neodstranitelně. Předtím, než to zkusíte, uveďte svůj web do režimu údržby a vytvořte zálohu. A samozřejmě vyzkoušejte nejprve vývojovou/testovací stránku :)

4
Berdir