MySQL DDL Online ddl是什么意思( 二 )


  • LOCK参数的取值规模可以有NONE、SHARED、DEFAULT、EXCLUSIVE四种 。NONE:表现不加锁 , 在DDL语句履行的进程中 , 表仍然可以进行select和DML的操作 , 这也正是我们DDL Online的真正所愿望实现的后果 。SHARED:可以履行select操作 , 但是不能履行DML操作 。DEFAULT:依据不同的DDL语句 , 采取所须要的最小的锁 。EXCLUSIVE:在DDL语句履行的进程中 , 既不能履行select操作 , 也不能履行DML操作 。全部表完整不可以读写 , 被锁住 。
  • MySQL自带的DDL Online的参数大纲如下资源网:
    MySQL DDL Online ddl是什么意思

    文章插图


    图片起源参考:https://blog.csdn.net/finalkof1983/article/details/88355314
    MySQL官方虽然已经支撑了DDL的Online操作 , 但是 , 这个操作比拟有局限性 , 并不是所有的DDL语句都可以真正的Online的去履行 。有些DDL语句 , 虽然我们显示的履行要让其应用online的方法去履行 , 但是当MySQL真正的去履行的时候 , 如果它发明不能online的时候 , 会给出毛病提醒 , 让我们修正对应的显示参数去改为offline的方法去履行 。这里不同的DDL语句规模很广 , 例如:修正字段类型、增长主键、删除主键、增长索引、删除索引、更改索引名称、增长字段、删除字段、修正字段长度等等 。依据不同类型的DDL语句 , 参数ALGORITHM和LOCK的取值规模并不是都可以随便组合应用的 , 这个要视情形而定 , 具体场景具体剖析 。具体参考如下图片:
    MySQL DDL Online ddl是什么意思

    文章插图


    图片起源参考:https://blog.csdn.net/finalkof1983/article/details/88355314
    另外 , 在针对有主从架构的场景时 , 应用官方自带的这种DDL Online语句 , 即便是在master主节点可以online的去履行 , 但是会在从库上会履行同样的DDL语句期间 , 从库中对应的这个履行DDL语句的表会涌现DML语句被阻塞的情形 , 从而涌现主从延迟的现象 。大致进程如下:
    1. 在master节点上某个表履行DDL语句 , 此时对表的DML仍然可以支撑并行的履行 。
    2. 在这个DDL语句没有履行完成之前 , 这个操作是不会通过binlog同步到slave节点上去的 。只有当这个DDL语句在master节点履行完成后 , 才会同步到slave节点去履行 。
    3. 当slave开端履行从master同步过来的DDL的进程中 , 从master节点同步过来的 , 对该表的DML语句不能同时履行 , 须要期待slave上面的DDL语句履行完成后 , 才可以履行同步过来的DML语句 。
    4. 此时 , 在slave上就涌现了延迟的现象 。
    所以 , 官方自带的这个在线的DDL方法比拟有局限性 。我们根本上都不应用这种方法 , 而是采取第三方的工具来实现在线修正表构造的需求 。


    pt-online-schema-change工具pt-online-schema-change是Percona公司供给的众多工具集中的一个 , 它是工具包Percona Toolkit里面的其中一个命令 。而这个工具箱的安装也比拟简略 , 有各种安装方法 。如果不想编译安装 , 可以下载一个编译好的二进制紧缩包 , 开箱即用 , 解压落后入bin目录既可以应用 。下载地址为:https://www.percona.com/downloads/percona-toolkit/LATEST/
    pt-online-schema-change可以实现在线的DDL语句 。它的原理是基于触发器来实现在线更改表构造 。它的实现进程大概如下:
    1. 先创立一个临时表 , 这个临时表的表构造比原表的表构造不同之处就在于它已经运用了我们的DDL语句 。
    2. 把原表中的数据慢慢的导入到这个临时表中 。
    3. 在履行第2步导入操作的时候 , 如果仍然有对原表的DML语句 , 这些操作也要记载下来 , 然后同步到临时表中 。
    4. 在确保临时表中的数据和原表中的数据完整同步之后 , 用临时表调换原表 。
    其中的第3步 , 在pt-osc工具中的实现方法是在原表上创立insert、update、delete触发器 , 通过这些触发器 , 把在导入数据到临时表的进程中在对原表的DML操作同步到临时表中去 。这种做法比拟大的问题就是增长了原表的压力 , 对原表的一些事物的操作会因为触发器操作临时表的参加而导致事物变长 。


    推荐阅读