场景复现:某业务表invite_codes
需要删除invitor
字段,执行以下命令时触发报错:
ALTER TABLE invite_codes DROP COLUMN invitor, ALGORITHM=INPLACE;
-- 报错信息:ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY.
原因定位:表引擎为MyISAM,而该引擎不支持INPLACE
算法!
-- Step 1: 转换表引擎(需短暂锁表)
ALTER TABLE invite_codes ENGINE=InnoDB;
-- Step 2: 在线删除字段(毫秒级元数据锁)
ALTER TABLE invite_codes
DROP COLUMN invitor,
ALGORITHM=INPLACE,
LOCK=NONE;
SHOW CREATE TABLE invite_codes; -- 确认字段已消失
SELECT * FROM invite_codes LIMIT 1; -- 数据完整性检查
特性 | MyISAM | InnoDB |
---|---|---|
DDL算法支持 | 仅ALGORITHM=COPY |
支持INPLACE (元数据锁) |
锁粒度 | 表级锁 | 行级锁 |
事务支持 | ❌ 不支持 | ✅ 支持 |
崩溃恢复 | 需手动修复 | 自动回滚 |
适用场景 | 只读/低频写入 | 高并发事务 |
场景**
• ✅ 支持操作:删除字段、修改字段名、增加二级索引
• ❌ 不支持操作:修改字段类型、删除主键、修改字符集
版本 | INPLACE支持能力 |
---|---|
MySQL 5.5 | 有限支持(仅添加索引) |
MySQL 5.6+ | 支持删除字段等常见DDL |
MySQL 8.0 | 新增INSTANT算法(毫秒级) |
graph TD
A[ 检查表引擎] --> B[ 全量备份]
B --> C[ 转InnoDB引擎]
C --> D[⚡ 执行INPLACE DDL]
# 物理备份(适用于大表)
innobackupex --compress /backup/
# 逻辑备份(快速导出)
mysqldump -uroot -p --single-transaction your_db > backup.sql
修改字段类型
ALTER TABLE invite_codes
MODIFY COLUMN invite_code VARCHAR(500),
ALGORITHM=COPY; -- 强制使用COPY
InnoDB表空间不足
• 需预留1.5倍磁盘空间
MySQL 5.5及以下版本
• 全版本不支持DROP COLUMN
的INPLACE操作
ALTER TABLE invite_codes
DROP COLUMN invitor,
ALGORITHM=INSTANT; -- 毫秒级完成(8.0.12+)
• gh-ost
gh-ost \
--alter="DROP COLUMN invitor" \
--database=your_db \
--table=invite_codes \
--execute
• pt-online-schema-change
版权声明:转载需附原文链接,技术咨询请私信!
下期预告:《MySQL 8.0的十大隐形性能炸弹》 关注不迷路!
你的点赞,是我持续分享的动力!