Online DDL

2023-09-07  本文已影响0人  古飞_数据
先创建表,添加100w行数据
create table t1(id int primary key, a int, b int, index(a));
drop procedure idata;
delimiter ;;
create procedure idata()
begin
    declare i int;
    set i=1;
while(i <= 1000000)do
    insert into t1 values(i, 1000001 - i, i);
    set i = i+1;
    end while;
end;;
delimiter ;
call idata();


例1:新增一个字段,即使是ALGORITHM=INPLACE也会重新建表,输出结果0行受影响,可推断是INPLACE
mysql> ALTER TABLE t1 ADD COLUMN c int, ALGORITHM=INPLACE, LOCK=NONE;
Query OK, 0 rows affected (1.46 sec)
Records: 0  Duplicates: 0  Warnings: 0


例2: 改变字段类型,使用ALGORITHM=INPLACE抛出异常;这种操作只能使用ALGORITHM=COPY,输出结果1000000受影响,可推断是COPY
mysql> ALTER TABLE t1 CHANGE c c BIGINT, ALGORITHM=INPLACE, LOCK=NONE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql> 
mysql> ALTER TABLE t1 CHANGE c c BIGINT, ALGORITHM=COPY;
Query OK, 1000000 rows affected (4.99 sec)
Records: 1000000  Duplicates: 0  Warnings: 0

Online DDL 的方式是可以考虑在业务低峰期使用的,而 MySQL 5.5 及之前的版本,这个命令是会阻塞 DML 的,需要特别小心。
Online DDL 使用的是INPLACE算法,有rebuild table 和 no-rebuild table两种方式
INPLACE的rebuild table方式和COPY的rebuild table方式类似,都会扫描原表数据和构建临时文件。
  对于很大的表来说,这个操作是很消耗 IO 和 CPU 资源的。因此,如果是线上服务,要很小心地控制操作时间。
  如果想要比较安全的操作的话,可以使用 GitHub 开源的 gh-ost 来做。
INPLACE的rebuild table方式和COPY的rebuild table方式一个不同点在于 INPLACE的rebuild仍然可以达到与DML操作并发执行,
  从而达到"online"的状态 - Online DDL过程会使用到MDL的读锁和写锁  
  
https://blog.csdn.net/ldw201510803006/article/details/114297278  
https://blog.51cto.com/u_15077536/5955570
上一篇下一篇

猜你喜欢

热点阅读