更新时间:2025-04-09 gmt 08:00

mysql原生的ddl工具-j9九游会登录

copy算法

  1. 按照原表定义创建一个新的临时表。
  2. 对原表加写锁(禁止dml)。
  3. 1建立的临时表执行ddl。
  4. 将原表中的数据copy到临时表。
  5. 释放原表的写锁。
  6. 将原表删除,并将临时表重命名为原表。

采用copy方式期间需要锁表,禁止dml写操作。当lock = shared时允许读操作,不允许写操作;当lock = exclusive时,读写操作都被禁止,因此不能实现online。但这种方法可以应用在几乎全部ddl场景下。

inplace算法

inplace采用在原表上进行更改的方法,不需要生成临时表,不需要进行数据copy的过程。可分为两类:

  • rebuild:需要重建表(重新组织聚簇索引)。比如optimize table、添加索引、添加/删除列、修改列null/not null属性等。
  • no-rebuild:不需要重建表,只需要修改表的元数据,比如删除索引、修改列名、修改列默认值、修改列自增值等。

对于rebuild方式实现online是通过缓存ddl期间的dml,待ddl完成之后,将dml应用到表上来实现的。由于mdl写锁在拷贝数据期间降为mdl读锁,dml操作在ddl执行期间几乎不会被阻塞。

inplace算法使用限制

inplace算法支持大部分ddl操作,只有少数场景下只能利用copy算法。

  • 不支持删除主键,但不同时添加另外一个主键。
  • 不支持更改字段的数据类型。
  • 不支持扩展varchar列的长度从小于256位到大于256位,因为占用的空间从1个字节会变更到2个字节。不支持减少varchar类型列的长度。
  • 不支持修改virtual column和stored column的顺序。
  • 不支持在参数foreign_key_checks = 1时添加外键约束。
  • 不支持对表进行分区,优化分区,删除分区。

相关文档

网站地图