MyISAMテーブルだけで構成された本番データベースがあります。同時実行性と信頼性を向上させるために、それらをInnoDBに変換することを検討しています。
MySQLをシャットダウンせずにmyISAMテーブルをInnoDBに変更することはできますか?ここで推奨される手順は何ですか?
そのような変換にはどのくらい時間がかかりますか?すべてのテーブルの合計サイズは約700MBです
かなりの数のテーブルがあります。 ALTER TABLE
を1つずつではなく、すべてのMyISAMテーブルに一度に適用する方法はありますか?
知っておく必要のある落とし穴はありますか?
ありがとうございました
あなたはそれを行うことができます。 MyISAMからInnoDBへの変換は、トランザクションなど、MyISAMでは利用できない機能がInnoDBにあるため、問題にはなりません。
データベースの実行中にテーブルを変更できます。シャットダウンする必要はありませんが、この操作によりテーブルがロックされます。
所要時間は、サーバーの仕様/負荷/データベースのサイズなどによって異なります。
スクリプトを使用してプロセスを自動化できます。コマンドの使用show tables
、テーブルのリストを取得できます。次に、簡単なスクリプトを使用して、このリストを読み取り、altertableコマンドを実行できます。
これは、ファイルからテーブルリストを読み取り、SQLクエリを別のファイルに書き込む単純なPerlスクリプトです。このスクリプトを呼び出した後、出力ファイルをmysql
コマンドにフィードして、必要な変更を行うことができます。
open(INFILE, "< tables_list.txt");
open(OUTFILE, "> alter_tables.sql");
foreach my $name (<INFILE>) {
chomp($name);
print OUTFILE "ALTER TABLE $name engine=InnoDB;\n";
}
close(INFILE);
close(OUTFILE);
私はCREATEとSELECTを使用します:
mysql> CREATE TABLE i_table LIKE table;
mysql> ALTER TABLE i_table ENGINE=InnoDB;
mysql> INSERT INTO i_table SELECT * FROM table;
mysql> RENAME TABLE table TO b_table;
mysql> RENAME TABLE i_ TO other_db.tbl_name;
多くのデータがない場合、これはうまく機能します。より良い使用法
mysql> ALTER TABLE table ENGINE = InnoDB;
ビジーなデータベースでこの方法を試す前に注意してください。
また、dbをダンプしたり、ダンプファイルのENGINEを変更したり、ダンプファイルのDATABASE名を変更したりすることもできます。 DBを復元してから、DBの名前を変更します。
MySQLだけを使用してMyISAMをInnoDBに変換する自動化された方法があります
これは、すべてのデータベースでMyISAMテーブルのSQLを生成するためのクエリです。
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL
FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length);
Linuxプロンプトで、次のようにスクリプト作成を実行します。
mysql -h... -u... -p.... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > MyISAM_To_InnoDB.sql
これにより、すべてのデータベース内のすべてのMyISAMテーブルを最小のテーブルから最大のテーブルに変換するSQLが生成されます。
SQLを簡単に調整して、すべてのMyISAMテーブルを次のような特定のデータベース(データベースmystuffなど)内のInnoDBに変換できます。
mysql -h... -u... -p.... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema = 'mystuff' ORDER BY (data_length+index_length)" > MyISAM_To_InnoDB.sql
Khaledとooshroは、セマンティクスについて説明しました。質問2と4は、構成とハードウェアに依存するため、判断が難しくなります。 #2でできることは、DBをファイルにダンプし、ワークステーションまたは他のサーバーにインポートして(5ドルでクラウドスライスを購入し、必要に応じてそれを使用する)、変更オプションを実行して確認することです。一般的な全体的な意味での所要時間。これは実際には完璧なテストではありませんが、何もないよりはましです。700MBはそれほど大きくなく、MySQLが電源付きの専用サーバー上にある場合はそれほど時間はかかりません(Dell 2970 w/16gig RAM eg )。
#4の場合-mysql /データベースをInnoDBに変換しないでください。 :)全体として、プロセスは実行中に完全なテーブルロックを引き起こします(実際には、バックグラウンドでは、新しいテーブルを作成し、データを転送してから、削除/名前を変更するだけです)。そのため、営業時間外にエンジンを変更する必要があります。夜に。何か問題が発生した場合に備えて、完全なダンプを取得するようにしてください。 (mysqldump -A --flush-privileges> dbdump.sql)。