MySQL 批量修改表引擎

在使用 mariadb galera 集群时,发现数据库数据一直不同步,刚开始一直以为是哪里配置的问题,最后才发现…

原来 MariaDB Galera Cluster 仅支持 InnoDB 存储引擎,对于 MyISAM 的支持仅是实验室性质的,不适用在生产环境,具体可见 wsrep_replicate_myisam 变量。

关于 MariaDB Galera Cluster 其他的一些限制见页面:MariaDB Galera Cluster - Known Limitations

而我们之前初始化时导入的表很大一部分是 MyISAM 引擎的,这也就是为什么一直无法同步的原因。 😩

那么如何批量的将 MyISAM 的表修改为 InnoDB 呢?

可以用如下命令生成批量修改指定数据库(用 table_schema 指定)中的所有表引擎的 Alert 语句:

1
2
3
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') 
FROM information_schema.tables
WHERE table_schema='mysql' AND ENGINE='MyISAM';

也可以生成修改所有库中的表引擎:

1
2
3
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') 
FROM information_schema.tables
WHERE AND ENGINE='MyISAM';

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',table_name,' ENGINE=InnoDB;') FROM information_schema.tables 
WHERE table_schema='mysql' AND ENGINE='MyISAM';
+----------------------------------------------------------------------+
| CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',table_name,' ENGINE=InnoDB;') |
+----------------------------------------------------------------------+
| ALTER TABLE mysql.columns_priv ENGINE=InnoDB; |
| ALTER TABLE mysql.db ENGINE=InnoDB; |
| ALTER TABLE mysql.event ENGINE=InnoDB; |
| ALTER TABLE mysql.func ENGINE=InnoDB; |
| ALTER TABLE mysql.ndb_binlog_index ENGINE=InnoDB; |
| ALTER TABLE mysql.proc ENGINE=InnoDB; |
| ALTER TABLE mysql.procs_priv ENGINE=InnoDB; |
| ALTER TABLE mysql.proxies_priv ENGINE=InnoDB; |
| ALTER TABLE mysql.tables_priv ENGINE=InnoDB; |
| ALTER TABLE mysql.user ENGINE=InnoDB; |
+----------------------------------------------------------------------+
10 rows in set

复制生成的 Alert 语句运行即可。


参考:

https://www.bbsmax.com/A/A2dmMm7qde/

hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
0%