web-gelistirme-sc.com

Bir veritabanını MyISAM'den InnoDB'ye nasıl dönüştürebilirim?

Ben bir meşgul Drupal 6 sitenin genel performansını artıracak görmek için MyISAM 500MB veritabanı tüm tabloları InnoDB dönüştürmek için gidiyorum. En iyi ne olduğunu merak ediyorum (yani en güvenli/easyiest/fastest) dönüşümünü yapmanın yolu.

9
alfish

Bir MySQL DBA olarak, MySQL'in betiği benim için yazmasını sağlayarak MySQL'e güveniyorum.

Bu sorguyu çalıştırmak için Linux komutunu oluşturun

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

Komut dosyası önce en küçük tabloları dönüştürür. Bu komut dosyası, FULLTEXT dizinleri olan tüm MyISAM tablolarını da atladı.

Betiği inceledikten sonra, MySQL'de aşağıdaki gibi çalıştırabilirsiniz:

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

veya her dönüşümün zamanlamasını görmek istiyorsanız, mysql'ye giriş yapın ve şunu çalıştırın:

mysql> source /root/ConvertMyISAM2InnoDB.sql

Dönüşüm yürütülürken tam bir masa kilidi oluştuğu için bu durum karışıklığa neden olmamalıdır.

Tüm tablolar dönüştürüldükten sonra, InnoDB kullanımı için MySQL ayarlarını yapmanız ve key_buffer'ı küçültmeniz gerekir.

InnoDB Tampon Havuzunu ayarlamak için lütfen bunu okuyun: https://dba.stackexchange.com/questions/1/what-are-the-main-differences-between-innodb-and-myisam/2194#2194

Lütfen bunu da okuyun: https://drupal.stackexchange.com/questions/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367

Bir şans ver !!!

7
RolandoMySQLDBA

Bir süre önce bunun için sert bir komut yazdım.

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

Benim için bir yıl önce çalıştı, o zamandan beri drush API'nın değişip değişmediğinden emin değilim.

Bunu bir convert.drush.inc dosyasına örneğin .drush klasörüne yerleştirebilir veya sitenizde bir şekilde yürütebilirsiniz, örneğin devel execute php block ile. Bir drush komut dosyası olarak şöyle diyebilirsiniz:

drush convert-engine InnoDB

yarı: Bu komutlar çalışırken birisi veritabanında bir şey yaparsa, veritabanınız tamamen bozulur. Unrecoverably. Bu nedenle, sitenizi bakım moduna alın ve bunu denemeden önce bir yedek alın! Ve elbette, önce bir geliştirme/test sitesinde deneyin :)

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

kaynak

2
alfish