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