如何将所有MySQL表从MyISAM转换为InnoDB存储引擎

时间:2020-02-23 14:40:53  来源:igfitidea点击:

MySQL数据库中是否有一些表仍在使用MyISAM,并且想将它们转换为使用InnoDB存储引擎?本教程旨在指导我们完成MyISAM向InnoDB Storage引擎的转换。

InnoDB非常注重性能,对事务的支持和可靠性。自MySQL 5.5起,它已成为默认的MySQL存储引擎。我们可以阅读MyISAM到InnoDB:为什么以及如何获得为什么选择InnoDB的摘要。

首先,在转换表之前,我们需要获取使用MyISAM的表的列表。为此,请从CLI登录到MySQL/MariaDB并运行以下查询。

$mysql -u root -p

然后运行:

SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') 
 FROM INFORMATION_SCHEMA.TABLES
 WHERE ENGINE='MyISAM'
 AND table_schema = 'mydb';

用实际数据库名称替换mydb。这将为我们提供使用MyISAM的数据库" mydb"中的表的列表,以及将它们转换为InnoDB所需的查询。

我们应该得到与下面类似的输出。

+------------------------------------------------------+
 | CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')  |
 +------------------------------------------------------+
 | ALTER TABLE wp_ninja_forms_fav_fields ENGINE=InnoDB; |
 | ALTER TABLE wp_blc_synch ENGINE=InnoDB;              |
 | ALTER TABLE wp_nf_relationships ENGINE=InnoDB;       |
 | ALTER TABLE wp_top_ten_daily ENGINE=InnoDB;          |
 | ALTER TABLE wp_es_deliverreport ENGINE=InnoDB;       |
 | ALTER TABLE wp_usermeta ENGINE=InnoDB;               |
 | ALTER TABLE wp_comments ENGINE=InnoDB;               |
 | ALTER TABLE wp_term_relationships ENGINE=InnoDB;     |
 | ALTER TABLE wp_options ENGINE=InnoDB;                |
 | ALTER TABLE wp_terms ENGINE=InnoDB;                  |
 | ALTER TABLE wp_blc_links ENGINE=InnoDB;              |
 | ALTER TABLE wp_links ENGINE=InnoDB;                  |
 | ALTER TABLE wp_term_taxonomy ENGINE=InnoDB;          |
 | ALTER TABLE wp_postmeta ENGINE=InnoDB;               |
 | ALTER TABLE wp_nf_objects ENGINE=InnoDB;             |
 | ALTER TABLE wp_give_donormeta ENGINE=InnoDB;         |
 | ALTER TABLE wp_commentmeta ENGINE=InnoDB;            |
 | ALTER TABLE wp_es_sentdetails ENGINE=InnoDB;         |
 | ALTER TABLE wp_blc_instances ENGINE=InnoDB;          |
 | ALTER TABLE wp_snp_log ENGINE=InnoDB;                |
 | ALTER TABLE wp_posts ENGINE=InnoDB;                  |
 | ALTER TABLE wp_blc_filters ENGINE=InnoDB;            |
 | ALTER TABLE wp_slim_events_archive ENGINE=InnoDB;    |
 | ALTER TABLE wp_top_ten ENGINE=InnoDB;                |
 | ALTER TABLE wp_es_emaillist ENGINE=InnoDB;           |
 | ALTER TABLE wp_es_templatetable ENGINE=InnoDB;       |
 | ALTER TABLE wp_nf_objectmeta ENGINE=InnoDB;          |
 | ALTER TABLE wp_users ENGINE=InnoDB;                  |
 | ALTER TABLE wp_es_notification ENGINE=InnoDB;        |
 | ALTER TABLE wp_ninja_forms_fields ENGINE=InnoDB;     |
 | ALTER TABLE wp_give_donors ENGINE=InnoDB;            |
 | ALTER TABLE wp_termmeta ENGINE=InnoDB;               |
 | ALTER TABLE wp_snp_stats ENGINE=InnoDB;              |
 | ALTER TABLE wp_es_pluginconfig ENGINE=InnoDB;        |
 +------------------------------------------------------+
 34 rows in set (0.003 sec)

将MySQL表从MyISAM转换为InnoDB存储引擎

我们现在要做的就是复制并在MySQL Shell中运行以下命令。

切换到要使用的数据库。

MariaDB [mysql]> use mydb;
 Reading table information for completion of table and column names
 You can turn off this feature to get a quicker startup with -A
 Database changed
 MariaDB [mydb]>

然后运行前面给出的转换命令。

输出示例:

MariaDB [mydb]> ALTER TABLE wp_give_donors ENGINE=InnoDB;         
 Query OK, 0 rows affected (0.013 sec)              
 Records: 0  Duplicates: 0  Warnings: 0
 MariaDB [mydb]> ALTER TABLE wp_termmeta ENGINE=InnoDB;            
 Query OK, 0 rows affected (0.016 sec)              
 Records: 0  Duplicates: 0  Warnings: 0
 MariaDB [mydb]> ALTER TABLE wp_snp_stats ENGINE=InnoDB;           
 Query OK, 0 rows affected (0.015 sec)              
 Records: 0  Duplicates: 0  Warnings: 0
 MariaDB [mydb]> ALTER TABLE wp_es_pluginconfig ENGINE=InnoDB;     
 Query OK, 1 row affected (0.014 sec)               
 Records: 1  Duplicates: 0  Warnings: 0

重新运行第一个命令,以检查是否有返回MyISAM的表。

MariaDB [mydb]> SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')  FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE='MyISAM' AND table_schema = 'mydb';
 Empty set (0.003 sec)

好的,我们现在拥有使用InnoDB数据存储引擎的所有数据库表。