关于更新表结构时碰到的DDL锁导致数据库无法连接

记一次更新表结构时语句一直处于等待无法执行的解决办法

我们在更新数据库表结构的时候,当数据库有连接正在进行中的事务时,那么你的更新请求会处于一个等待的状态,一直等待到当前未提交的事务完成之后才会进行更新操作,但是这个未提交的事务会需要多久时间完成对我们来讲是一个未知数,(自己第一次碰到这个情况的时候,竟然以为是数据记录太多需要等待更新,等了半个小时... 愚蠢)在这个等待期间,所有的后续连接请求都会被挂起,等待事务提交完成后更新操作完成才会执行,逻辑是这样的:有个事务1在查询表a,一直占着不释放,那么这个时候执行ddl操作,就会被事务1阻塞,直到事务1被提交或者被kill。如果当你在更新表结构时碰到了这种情况,不要等,等的越久你会发现自己越蠢。

首先说一下我们在执行ddl操作前需要注意的几点:

第一点:

  不要使用navicat进行该操作,在你使用sql语句时,卡死掉我们ctrl+c结束正在执行的语句就好了,但是当我们利用navicat这种第三方工具连接时,一旦语句卡死,navicat这个程序也会无响应,并且!你将程序进程结束掉仍然无法停止正在执行的语句!(大坑!)

第二点:

  在更新前要挑选一个业务的低峰期进行更新,这个是在询问阿里怎样避免因为更新时出现此机制影响线上环境时阿里告诉我的办法,emmm...

接下来说一下碰到这种问题时我们应该怎么去解决:

第一点:

  我们在执行ddl操作前可以执行一下 select * from information_schema.innodb_trx 来看一下我们当前有没有未提交的事务,可根据结果中的trx_state来看当前线程的状态

第二点:

  在上条语句的查询结果中我们可以找到有一个trx_mysql_thread_id列,这个列名对应的值我们可以在show processlist中找到对应的记录,找到后可以查看对应记录的host列以及对应的用户和库,说明该主机还有连接没有断开

第三点:

  在找到这些信息之后我们判断该条连接是否可以kill,如果可以,我们可以 kill id(替换为对应连接的trx_mysql_thread_id) 之后再进行ddl操作

  这时没有了未提交需要等待的事务,我们的表结构更新语句便会顺利执行成功。

原文地址:https://www.cnblogs.com/zzwlinux/p/9922883.html

时间: 2024-07-29 01:34:55

关于更新表结构时碰到的DDL锁导致数据库无法连接的相关文章

Sqlite嵌入式数据库的安装、建库、建表、更新表结构以及数据导入导出等等详细过程记录

简介: SQLite 是实现了SQL 92标准的一个大子集的嵌入式数据库.其以在一个库中组合了数据库引擎和接口,能将所有数据存储于单个文件中而著名.我觉得SQLite的功能一定程度上居于MySQL 和PostgreSQL之间.尽管如此,在性能上面,SQLite常常快2-3倍 (甚至更多).这利益于其高度调整了的内部架构,因为它除去了服务器端到客户端和客户端到服务器端的通信. 而令人印象深刻的特点是你可将你的整个数据库系统放在其中.利用非常高效的内存组织,SQLite只需在很小的内存中维护其很小的

如何解决修改SQLServer表结构时 ,Timeout 时间已到

背景:最近修改一张有海量数据的SQLServer表结构,报错[无法修改表. Timeout 时间已到. 在操作完成之前超时时间已过或服务器未响应. ] [解决办法]:  工具->选项>设计器->表设计器和数据库设计器->右侧勾选"为表设计器更新重写连接字符串的超时值",在它下面的"事务超时时间"默认应该是 30 秒,改得稍微大一些,不过好像不能超过65535.

Mybatis自动创建表/更新表结构

最近有小伙伴问我mybatis有没有自动创建表结构的功能,因为他们之前一直使用hibernate用习惯了,理所当然的认为,在实体类上配置下注解或者写写映射文件,系统启动后就可以自动创建表. 我只能很遗憾的告诉他,mybatis并没有这个功能,看他兴致阑珊的样子,我只能安慰他,就算没有这功能,我们可以自己开发啊~~ 所以就有了下面这套系统,已开源大家可以下来看看~~ Mybatis_BuildTable_V0.2 https://git.oschina.net/sunchenbin/Mybatis

MySQL在创建相同表结构时as和like 使用的区别

1.MySQL的复制相同表结构方法: 1)create table table_name as select * from table1 where 1=2 (或者limit  0): 2) create table table_name like table1_name; 二者的用途: as :用来创建相同表结构并复制源表数据.(可根据后面的条件来控制要不要复制源表数据) like:用来创建完整表结构和全部索引. 二者的区别: as :创建出来的table_name缺少table1的索引信息,

利用反射处理多个表结构相同的数据的查询和数据库表的关联

最近做一个项目,需要对人口数据进行查询,但是人口数据分布在不同的街道表中,首先进行了数据表结构的统一,每个数据表以街道名开头,然后其他的名字都一样 前期将各个表中的字段也进行了统一 抽象出一张字典表 将街道编号和街道的名字的首字母连接起来,因为查询的时候是利用街道编号来的,这样可以根据街道标号拼出相对于的街道表的名字,(每个人口相关的表不止一张,因此需要统一):在查询过程中,将查询到的结构返回一个LIST,(不同的表在dao中当然对于不同的类啊,返回来再判断是哪一类),然后利用反射Field[]

EntityFramework 更新表结构到数据库

在程序包管理器控制台 1.执行:Enable-Migrations -Force  生成:Migrations 2 修改AutomaticMigrationsEnabled默认为false改为true 3.执行:Update-Database -Verbose

EF-使用迁移技术让程序自动更新数据库表结构

承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与之对应的表结构. 无论承不承认,都要使用到visual studio的"程序包管理器控制台"执行相关的命令. 1.使用"程序包管理器控制台" 工具>NuGet程序包管理器>程序包管理器控制台 这货的界面是这样子的: 选中默认项目为DAL,因为我们在DAL项目

MySQL使用pt-online-change-schema工具在线修改1.6亿级数据表结构

摘  要:本文阐述了MySQL DDL 的问题现状.pt-online-schema-change的工作原理,并实际利用pt-online-schema-change工具在线修改生产环境下1.6亿级数据表结构. 在一个软件生命周期中,我们都知道,前期的表结构设计是非常重要的,因为当表数据量一上来后再进行表结构修改危险性比较大,而且要操作的时间也比较长. 在笔者参与的项目中,就曾遇到这样一个问题,首先上去查看了一下该表的信息,已有约2亿的数据量,而且每分钟还要并发写入4万条记录,而由于这个表有一个

在线修改表结构mysql5.5版本和pt-online-schema-change

一.测试环境 系统:Centos 6.2 数据库:mysql Ver 14.14 Distrib 5.5.18, for Linux (x86_64) using readline 5.1 percona工具:percona-toolkit-2.2.12 测试数据库大小:tx_ljxz_71--16G.t_log_item--3G 二.在线修改表结构的过程 mysql在线修改表结构 1 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_table)