MariaDB修改列类型是否会锁表?400万+数据场景技术咨询
MariaDB修改列类型(tinyint→int)的锁表问题与后台逻辑
核心问题解答
1. ALTER TABLE CHANGE是否会锁表?
在MariaDB中,执行ALTER TABLE ... CHANGE修改列类型(从tinyint到int)的锁表行为,取决于版本和DDL算法选择:
- MariaDB 10.2及以上版本:这类仅扩大数值类型范围的无损变更(tinyint的二进制存储可被int兼容解析),可以指定
ALGORITHM=INPLACE执行,此时仅会持有元数据锁(MDL)共享读锁,不阻塞正常读写操作,无需重建整张表。 - 未指定算法或版本低于10.2:默认采用
ALGORITHM=COPY方式,期间原表会被加排他写锁,无法进行写入操作,读操作可能被阻塞或只能读取旧表数据,直到变更完成。
2. 后台操作逻辑
采用ALGORITHM=INPLACE时:
- 先获取MDL共享锁,阻止其他DDL操作,允许正常读写。
- 直接修改表的元数据(列定义),无需改动实际存储的数据。
- 元数据修改完成后立即释放MDL锁,全程对业务影响极小。
采用ALGORITHM=COPY时:
- 获取MDL排他锁,禁止对原表的所有写入操作。
- 创建与新结构一致的临时表。
- 逐行读取原表数据(tinyint转int无需数据转换,仅按新类型存储)并写入临时表。
- 交换原表与临时表的名称,删除原表。
- 释放MDL锁,完成变更。
技术资源参考
- MariaDB在线DDL官方文档:详细说明不同ALTER操作的算法支持、锁类型及适用场景,重点关注
ALTER TABLE的ALGORITHM和LOCK参数。 - MariaDB元数据锁(MDL)文档:解释MDL的作用、不同锁类型的影响范围,以及通过
SHOW PROCESSLIST或INFORMATION_SCHEMA.INNODB_LOCKS查询当前MDL锁状态的方法。 - 大表DDL最佳实践:建议在业务低峰期执行,优先使用INPLACE算法;若必须采用COPY方式,可考虑分批次迁移数据或使用专用工具减少锁表影响。
内容的提问来源于stack exchange,提问作者Mali C.
相关产品推荐
相关产品推荐

