500MBデータベースのすべてのテーブルをMyISAMからInnoDBに変換して、ビジーなDrupal 6サイトの全体的なパフォーマンスが向上するかどうかを確認します。変換を行うための最良の(つまり、最も安全/最も簡単/最も速い)方法は何ですか。
500MBデータベースのすべてのテーブルをMyISAMからInnoDBに変換して、ビジーなDrupal 6サイトの全体的なパフォーマンスが向上するかどうかを確認します。変換を行うための最良の(つまり、最も安全/最も簡単/最も速い)方法は何ですか。
回答:
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
試してみる !!!
しばらく前に、このための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
警告:これらのコマンドの実行中に誰かがデータベースを操作すると、データベースが完全に混乱します。回復不能。だから、あなたのサイトをメンテナンスモードにして、これを試す前にバックアップを作ってください!そしてもちろん、最初に開発/テストサイトを試してください:)