首页 > 数据库 >动态线上数据库加字段避免查询加锁,给表结构加锁,造成死锁

动态线上数据库加字段避免查询加锁,给表结构加锁,造成死锁

时间:2022-10-14 18:59:02浏览次数:83  
标签:给表 加锁 DML Inplace 死锁 DDL 操作 执行

转载自 https://www.cnblogs.com/yidengjiagou/p/16769180.html

需求:有时候需要动态改线上运行的数据库,而线上的数据库又正在被增删改查。

解决方案:ALTER TABLE user ADD age int NOT NULL DEFAULT '0' COMMENT '年龄', ALGORITHM=Inplace, LOCK=NONE;
原理:从MySQL5.6版本开始增加了Online DDL,作用就是在执行DDL的时候,允许并发执行DML。简单翻译就是修改表结构的时候,也能同时支持并发执行增删查改操作。从MySQL8.0版本开始又优化了Online DDL,支持快速添加列,可以实现给大表秒级加字段。具体用法就是在DDL语句后面增加两个参数ALGORITHM和LOCK。这两个参数分别是干嘛用的?有哪些选项呢?

ALGORITHM 可以指定使用哪种算法执行DDL,可选项有:

Copy:

拷贝方式,MySQL5.6 之前 DDL 的执行方式,过程就是先创建新表,修改新表结构,把旧表数据复制到新表,删除旧表,重命名新表。执行过程非常耗时,产生大量的磁盘IO和占用CPU,还有使Buffer poll失效,而且需要锁住旧表,性能较差,现在基本很少使用。

Inplace:

原地修改,MySQL5.6开始引入的,优点是不会在Server层发生表数据拷贝,过程中允许并发执行DML操作。过程就是先添加MDL写锁,执行初始化操作,然后降级为MDL读锁,执行DDL操作(比较耗时,允许并发执行DML操作),升级为MDL写锁,完成DDL操作。

Instant:

快速修改,MySQL8.0开始引入的,可以实现快速给大表添加字段。

性能依次是,Instant > Inplace > Copy。

LOCK可以指定执行过程中,是否加锁,可选项有:

NONE

不加锁,允许DML操作。

SHARED

加读锁,允许读操作,禁止DML操作。

DEFAULT

默认锁模式,在满足DDL操作前提下,默认锁模式会允许尽可能多的读操作和DML操作。

EXCLUSIVE

加写锁,禁止读操作和DML操作。

Online DDL并不是支持所有DDL操作,看一下到底支持哪些操作?


设置列not null No Yes Yes Yes No
像最常见的添加列就可以使用Instant,而像删除列、重命名列、更改列数据类型就只能使用Inplace了。

标签:给表,加锁,DML,Inplace,死锁,DDL,操作,执行
From: https://www.cnblogs.com/cloudHui/p/16792634.html

相关文章

  • 处理机调度与死锁(二)
    1、死锁的概念2、产生死锁的原因3、产生死锁的必要条件互斥条件请求和保持条件不剥夺条件环路等待条件 ......
  • 处理机调度与死锁(一)
    1、处理机调度的层次高级调度(作业调度、长程调度)低级调度(进程调度、短程调度)中级调度(中程调度)2、进程调度的两种调度方式非抢占方式抢占......
  • MySQL——锁的类型以及加锁原理、死锁
    前言使用insertintoonduplicatekeyupdate语句进行插入去重,但是在测试过程中发现了死锁现象:ERROR1213(40001):Deadlockfoundwhentryingtogetlock;tryre......
  • MySQL——并发insert on duplicate key update遇见死锁
    前言数据库死锁问题,是一个老生常谈且很常见的问题,网上也有非常多对于各类死锁场景的解析和复现,但凡和死锁有关,无外乎不涉及数据库隔离等级、索引、以及innodb锁等相关原因......
  • sql server中如何查看被死锁的表和进程
    --查看被锁表:selectrequest_session_idspid,OBJECT_NAME(resource_associated_entity_id)tableNamefromsys.dm_tran_lockswhereresource_type='OBJECT'orderby......
  • mysql给表的字段加索引
    1、添加普通索引ALTERTABLE`table_name`ADDINDEXindex_name(`column`)2、添加主键索引ALTERTABLE`table_name`ADDPRIMARYKEY(`column`)3、添加唯一索引(UNIQ......
  • linux 定时任务 加锁
    ​​*/3****flock-xn/home/work/fupeng/oem_apk_new.lock-c'sh/home/work/fupeng/oem_apk_new.sh>/dev/null2>&1'>/dev/null2>&1......
  • 性能测试线程死锁问题分析和定位【杭州多测师】【杭州多测师_王sir】
    1、死锁的概念:有2个线程、一个线程锁住了资源A、又想去锁定资源B、另外一个线程锁定了资源B、又想去锁定资源A、2个线程都想去得到对方的资源、而又不愿释放自己的的资源......
  • 1.3w字,一文详解死锁!
    死锁(DeadLock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁。1.死锁演示死锁的形成分为两个方......
  • java多线程--6 死锁问题 锁Lock
    java多线程--6死锁问题锁Lock死锁问题多个线程互相抱着对方需要的资源,然后形成僵持死锁状态packagecom.ssl.demo05;publicclassDeadLock{publicstatic......