web-dev-qa-db-ja.com

MySQL:本番データベースで多くのMyISAMテーブルをInnoDBに変換する方法は?

MyISAMテーブルだけで構成された本番データベースがあります。同時実行性と信頼性を向上させるために、それらをInnoDBに変換することを検討しています。

  1. MySQLをシャットダウンせずにmyISAMテーブルをInnoDBに変更することはできますか?ここで推奨される手順は何ですか?

  2. そのような変換にはどのくらい時間がかかりますか?すべてのテーブルの合計サイズは約700MBです

  3. かなりの数のテーブルがあります。 ALTER TABLEを1つずつではなく、すべてのMyISAMテーブルに一度に適用する方法はありますか?

  4. 知っておく必要のある落とし穴はありますか?

ありがとうございました

3
Continuation

あなたはそれを行うことができます。 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);
2
Khaled

私は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の名前を変更します。

3
ooshro

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
2
RolandoMySQLDBA

Khaledとooshroは、セマンティクスについて説明しました。質問2と4は、構成とハードウェアに依存するため、判断が難しくなります。 #2でできることは、DBをファイルにダンプし、ワークステーションまたは他のサーバーにインポートして(5ドルでクラウドスライスを購入し、必要に応じてそれを使用する)、変更オプションを実行して確認することです。一般的な全体的な意味での所要時間。これは実際には完璧なテストではありませんが、何もないよりはましです。700MBはそれほど大きくなく、MySQLが電源付きの専用サーバー上にある場合はそれほど時間はかかりません(Dell 2970 w/16gig RAM eg )。

#4の場合-mysql /データベースをInnoDBに変換しないでください。 :)全体として、プロセスは実行中に完全なテーブルロックを引き起こします(実際には、バックグラウンドでは、新しいテーブルを作成し、データを転送してから、削除/名前を変更するだけです)。そのため、営業時間外にエンジンを変更する必要があります。夜に。何か問題が発生した場合に備えて、完全なダンプを取得するようにしてください。 (mysqldump -A --flush-privileges> dbdump.sql)。

1
user15590