データベースをMyISAMからInnoDBに変換するにはどうすればよいですか?


9

500MBデータベースのすべてのテーブルをMyISAMからInnoDBに変換して、ビジーなDrupal 6サイトの全体的なパフォーマンスが向上するかどうかを確認します。変換を行うための最良の(つまり、最も安全/最も簡単/最も速い)方法は何ですか。


これはDrupalに関連する質問ではないようです。
tostinni

2
直接ではありませんが、Drupal管理者が時々行う必要があることです。
mpdonadio

新しいSQLコマンドを使用してFULLTEXTインデックスを持つMyISAMテーブルを除外するように回答を更新しました。更新された回答を使用して、すべての手順を最初からやり直してください。
RolandoMySQLDBA

DrupalサイトがFULLTEXTインデックスを使用して検索するように構成されていない場合は、FULLTEXTインデックスを持つすべてのテーブルに移動して、それらのインデックスをそれらのテーブルから削除することができます。FULLTEXTインデックスを持つすべてのテーブルを検索するには、SELECT table_schema、table FROM information_schema.statistics WHERE index_type = 'FULLTEXT';を実行します。
RolandoMySQLDBA

回答:


7

MySQL DBAとして、私はMySQLにスクリプトを記述させることにより、変換を実行するMySQLを信頼しています。

Linuxコマンドからこのクエリを実行する

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

スクリプトは、最小のテーブルを最初に変換します。このスクリプトは、FULLTEXTインデックスを持つMyISAMテーブルもバイパスしていました。

スクリプトを確認したら、次のようにMySQLでスクリプトを実行するだけです。

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

または、各変換のタイミングを確認したい場合は、mysqlにログインしてこれを実行します。

mysql> source /root/ConvertMyISAM2InnoDB.sql

変換が実行されているときに完全なテーブルロックが発生するため、これはめちゃくちゃにならないはずです。

すべてのテーブルが変換されたら、MySQL設定をInnoDBの使用に合わせて調整し、key_bufferを縮小する必要があります。

InnoDBバッファープールの設定については、こちらをご覧ください。https//dba.stackexchange.com/questions/1/what-are-the-main-differences-between-innodb-and-myisam/2194#2194

これも読んでください:https : //drupal.stackexchange.com/questions/1715/what-would-the-optimal-mysql-configuration-for-a-drupal-7-site-be/2367#2367

試してみる !!!


ローランド、私はあなたの解決策を試しましたが、ConvertMyISAM2InnoDB.sqlをデータベースにインポートした後、次のエラーを受け取ります:「エラー1214(HY000)、行585:使用されたテーブルタイプはFULLTEXTインデックスをサポートしていません」。では、一部のテーブルで変換が行われたかどうか、およびこのエラーをどのように解決すればよいかを知っている必要がありますか?ありがとう
alfish、2011年

それが起こるのではないかと心配でした。これは単に、1つのMyISAMテーブルにFULLTEXTインデックスがあったことを意味します。mysqlにログインして、タイミングを確認するかのように実行します。つまり、source /root/ConvertMyISAM2InnoDB.sql
RolandoMySQLDBA

SQL生成スクリプトを更新して、FULLTEXTインデックスを持つテーブルをスキップしてみます。
RolandoMySQLDBA

その間、これらの手順をすべて最初から繰り返します。再生成されたファイルの最初の行には、FULLTEXTインデックスを持つMyISAMファイルがあります。最初の行を削除して、スクリプトを再実行してください。
RolandoMySQLDBA 2011年

さて、このクールな変換bashスクリプト(yoodey.com/…)を実行することにより、フルテキストを使用するデータベース上の唯一のテーブルが 'search_index'であることがわかりました。これにより変換は停止しますが、変換をキャンセルした後、残りはスムーズに進みました。ソースConvertMyISAM2InnoDB.sqlを実行すると、原因を特定できませんでした。とにかく私はあなたの助けに感謝します。
フィッシュ

4

しばらく前に、このための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");
  }
}

1年ほど前に私のために働いていましたが、Drush APIがそれ以降変更されたかどうかはわかりません。

これを、たとえば.drushフォルダーのconvert.drush.incに配置するか、たとえば、devel execute phpブロックを使用して、サイトでなんらかの方法で実行できます。Drushスクリプトとして、次のように呼び出すことができます。

drush convert-engine InnoDB

警告:これらのコマンドの実行中に誰かがデータベースを操作すると、データベースが完全に混乱します。回復不能。だから、あなたのサイトをメンテナンスモードにして、これを試す前にバックアップを作ってください!そしてもちろん、最初に開発/テストサイトを試してください:)


5
Berdirに同意し、サイトをバックアップします。この操作が行われている間、データベースはロックされます。それを実行できるモジュールが必要な場合は、DB Tunerを試してみてください。
mikeytown2

@ mikeytown2:それはかなりクールなモジュールです:)
Berdir

1
素晴らしいスクリプトですが、MySQLクライアントで直接これを実行するのと比べて、やり過ぎです。
tostinni

2
スクリプトは正確に5行のコードです。残りはそれをdrushと統合することです。MySQLの単一のsqlコマンドでこれを行う方法があります。いずれにしても、スクリプトを作成する必要あります。
Berdir
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.