データベースを設定していませんが、一部のテーブルがinnoDBであるのに対し、他のテーブルはMyISAMであることに気付きました。私がそれらを変更することに興味がある理由は、Jurg van Vliet(AWSでO'Reillyの本を書いている)が、AmazonRDSの自動データベースバックアップ機能はすべてのテーブルがinnoDBテーブルであることにかかっていると言っているからです。
データベース内のすべてのテーブルをInnoDBに変換するコマンドは何ですか?
データベースを設定していませんが、一部のテーブルがinnoDBであるのに対し、他のテーブルはMyISAMであることに気付きました。私がそれらを変更することに興味がある理由は、Jurg van Vliet(AWSでO'Reillyの本を書いている)が、AmazonRDSの自動データベースバックアップ機能はすべてのテーブルがinnoDBテーブルであることにかかっていると言っているからです。
データベース内のすべてのテーブルをInnoDBに変換するコマンドは何ですか?
現在のデータベース内のすべてのMyISAMテーブルをInnoDBに変換するためのストアドプロシージャは次のとおりです。
DROP PROCEDURE IF EXISTS convert_all_tables_to_innodb;
DELIMITER //
CREATE PROCEDURE convert_all_tables_to_innodb()
DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY INVOKER
COMMENT ''
proc: BEGIN
DECLARE b_not_found BOOL DEFAULT FALSE;
DECLARE v_table_name VARCHAR(255);
DECLARE cur1 CURSOR FOR
SELECT
table_name
FROM
information_schema.tables
WHERE
table_schema = DATABASE() AND
table_type = 'BASE TABLE' AND
engine = 'MyISAM'
ORDER BY
1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b_not_found = TRUE;
OPEN cur1;
SET b_not_found = FALSE;
loop1: LOOP
FETCH cur1 INTO v_table_name;
IF b_not_found THEN
LEAVE loop1;
END IF;
SET @sql = CONCAT('ALTER TABLE ', v_table_name, ' ENGINE=InnoDB');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;
END LOOP;
CLOSE cur1;
END;
//
DELIMITER ;
実行するには、次のコマンドを実行するだけです。
CALL convert_all_tables_to_innodb();