9

我没有设置我的数据库并注意到我的一些表是 innoDB 而其他的是 MyISAM。我之所以对更改它们感兴趣是因为Jurg van Vliet(他在 AWS 上撰写 O'Reilly 书籍)Amazon RDS 的自动数据库备份能力取决于所有表都是 innoDB 表。

将数据库中的所有表转换为 InnoDB 的命令是什么?

4

1 回答 1

11

这是一个将当前数据库中的所有 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();
于 2012-07-22T19:38:45.290 回答