You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:57:18