美文网首页
MySQL-DDL/DML并发

MySQL-DDL/DML并发

作者: 8813d76fee36 | 来源:发表于2018-05-16 16:58 被阅读75次

场景

DDL(Data Definition Language)数据定义语言。
DML(Data Manipulation Language)数据操纵语言。

假设有用户表t_user,其存储姓名的字段name最初设置为varchar(4),在后来的存入的数据发现该字段长度够能满足需求,需要更改该字段的长度。
那么可以在线上直接修改吗?

修改失败的场景

在线上运行的时候,如果有一个正在执行的查询操作,同时一个人执行修改字段长度的命令,则该修改操作会被阻塞。

  • session1 - 执行查询操作
    为实验方便,使用sleep(20)增加查询操作的耗时。

select sleep(30) from t_user where id = 1;

执行耗时查询
  • session2 执行修改name字段设置的操作


    DDL操作阻塞

    此时发现操作被阻塞。
    查询mysql进程状态。

show processlist;

等待元数据锁

发现修改操作在等待表元数据锁。

  • 原因
    在执行DML操作的时候,会为表加上表元数据锁(table metadata lock),目的是防止在查询的过程中,表结构发生改变,导致查询结果错误。

解决方式

  • 尽量避免在线上直接修改表结构。
  • 使用pt-online-schema-change工具

pt-online-schema-change使用参考
https://blog.csdn.net/lovelichao12/article/details/73549939

MySQL DDL/DML并发参考表

MySQL提供了DDL Online机制,使得部分DDL操作可以和DML操作并发,其对照表如下。
https://dev.mysql.com/doc/refman/5.7/en/innodb-create-index-overview.html

相关文章

网友评论

      本文标题:MySQL-DDL/DML并发

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