如何在MySQL中平滑将MyISAM表转为InnoDB

浅墨小哥_2213

浅墨小哥_2213

2026-10-12

567人浏览

原创

会,alter table ... engine=innodb 在大表上会加全表独占写锁,导致dml和ddl阻塞数十分钟至数小时;myisam转innodb不支持algorithm=inplace,实际执行copy-alter流程。

如何在mysql中平滑将myisam表转为innodb

ALTER TABLE ... ENGINE=InnoDB 会锁表吗?

会,而且是**全表独占写锁**(DML 和 DDL 都阻塞),在大表上执行可能让业务中断几十分钟甚至数小时。MySQL 5.6+ 支持 ALGORITHM=INPLACE,但 MyISAM 转 InnoDB **不支持原地升级**——ALTER TABLE t ENGINE=InnoDB 实际走的是 copy-alter 流程:建新表、逐行拷贝、重建索引、rename。这意味着整个过程期间,原表不可写。

怎么避免长时间锁表?用 pt-online-schema-change

Percona Toolkit 的 pt-online-schema-change 是最成熟的选择,它通过触发器+影子表实现“无锁”迁移(实际是低影响,非绝对零锁)。关键点:

  • 要求源表有主键或唯一非空索引(否则无法可靠追踪变更)
  • 必须在从库停复制的情况下操作,或确保主从延迟可控;否则触发器写入可能被复制冲突打乱
  • 默认每秒拷贝 1000 行,可通过 --chunk-size 和 --max-load 控制节奏,避免拖垮 I/O 或 CPU
  • 执行前先用 --dry-run 和 --execute 配合测试,别跳过验证步骤

示例命令:

pt-online-schema-change --host=localhost --user=root --password=xxx \
--alter "ENGINE=InnoDB" \
D=test,t=myisam_table \
--no-check-replication-filters \
--chunk-time=0.5 \
--max-load="Threads_running=25" \
--critical-load="Threads_running=50" \
--execute

为什么不能用 mysqldump + 导入?

可以,但不是“平滑”的解法:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • dump 过程中,原表仍可写,但 dump 出的数据是某个时间点快照,中间的写入会丢失
  • 导入时新表仍是空的,业务需切流,存在数据断层风险
  • 大表 dump 文件巨大,网络/磁盘 IO 压力集中,导入耗时长且期间无法回滚到旧结构
  • 外键、触发器、注释等元数据容易遗漏,需额外处理

它适合维护窗口明确、能接受短时停服的场景,不属于“平滑”范畴。

转换后必须检查的三件事

InnoDB 和 MyISAM 行为差异明显,转完不是万事大吉:

  • SELECT COUNT(*) 变慢了?MyISAM 存行数缓存,InnoDB 需实时扫描;如有高频全表计数,考虑加汇总表或缓存
  • 全文索引失效?MyISAM 的 FULLTEXT 在 InnoDB 中语法相同,但分词器、最小词长等参数不同(如 innodb_ft_min_token_size 默认是 3),需比对并重置
  • 自增字段表现异常?InnoDB 的自增值不持久化到磁盘(MySQL 8.0.21+ 才默认持久),重启后可能回退;若依赖严格递增,要确认 innodb_autoinc_lock_mode 设置(推荐 2)

真正麻烦的从来不是转换动作本身,而是那些隐含在存储引擎语义里的行为偏移——它们往往在线上压测阶段才暴露。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4183

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1089

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6061

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2943

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6040

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8101

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1110

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

972

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习