美文网首页
Online DDL

Online DDL

作者: 古飞_数据 | 来源:发表于2023-09-07 06:53 被阅读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
    

    相关文章

      网友评论

          本文标题:Online DDL

          本文链接:https://www.haomeiwen.com/subject/gtjhmdtx.html