Mysql新增字段到大数据表导致锁表

article/2025/10/6 0:53:56

  昨天晚上7点左右,对一张表进行加字段,大概200多万条记录,字段90多个的大表,结果造成mysql锁表,进而导致服务不可用。执行语句如下:

[sql]  view plain copy
  1. ALTER TABLE `sc_stockout_order` ADD `route_remarks` VARCHAR(1024)  CHARACTER SET utf8mb4  NULL  DEFAULT   
   

     mysql配置如下:



打开服务期日志,发现有如下报错:

[java]  view plain copy
  1. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection;   
  2.         nested exception is org.apache.tomcat.jdbc.pool.PoolExhaustedException:   
  3.         [DubboServerHandler-10.162.99.129:20880-thread-105] Timeout: Pool empty.   
  4.         Unable to fetch a connection in 50 seconds, none available[size:80; busy:79; idle:0; lastwait:50000].  
  5.         at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26) ~[mybatis-3.2.8.  


我们发现数据库jdbc拿不到链接,虽然没有到300最大数据库连接数,但是两台服务器80*2=160个链接数已经达到配置的客户端最大连接数。这边也说明我们客户端配置的链接数不太合理,可以再稍微调大一点。

        发现这个问题后,为了尽快恢复线上服务,用show processlist发现ALTER TABLE这条语句导致大量查询语句处于等待状态,赶紧kill 掉修改表格语句的进程,此时系统恢复正常。在这个当中,发现了一条语句如下:

[sql]  view plain copy
  1. Waiting for table metadata lock  


从图中也可以看到活跃连接数到160之后就不变了,kill掉进程后恢复。


事后查找资料:

Mysql在5.6版本之前,直接修改表结构的过程中会锁表,具体的操作步骤如下:
(1)首先创建新的临时表,表结构通过命令ALTAR TABLE新定义的结构
(2)然后把原表中数据导入到临时表
(3)删除原表
(4)最后把临时表重命名为原来的表名

具体ddl如何工作

参考:http://www.cnblogs.com/cchust/p/4639397.html


Mysql 5.6 虽然引入了Online DDL,但是并不是修改表结构的时候,一定不会导致锁表,在一些场景下还是会锁表的,比如
①某个慢SQL或者比较大的结果集的SQL在运行,执行ALTER TABLE时将会导致锁表发生;
②存在一个事务在操作表的时候,执行ALTER TABLE也会导致修改等待;
查看我们mysql的版本:SELECT VERSION();  给出:5.6.16-log
我们通过Mysql的慢SQL控制台,也在发生问题的时间段内没有出现慢SQL,所以需要排除第一种可能性;
由于当时没有保留现场,所以当时是不是由于事物导致的锁表,现在也无从查起,这只能下次查看分析了。


根据这次教训,得到注意项:

1、尽量选择流量小的事后执行。当天20:00要大促,所以19:00大量供应商在操作。当我们选择在22:00左右再次执行时,就没再出现这个问题

2、执行时先看一下有没有未提交的事务,注意查看事物information_schema.innodb_trx表

3、随时关注服务器日志状况,已有问题要先行解决。

4、后续可现在预发环境或测试环境先行模拟,评估风险


http://chatgpt.dhexx.cn/article/AotitqWp.shtml

相关文章

MySQL 新增字段(alter table add column),报错:Duplicate entry

问题 执行一个增加字段的DDL语句脚本时,报错,错误如下: Error 1062: Duplicate entry c51d3db8-59a5 2022-06-28 17:59:59 for key uniq_material_date重复执行报相同的错误。根据错误提示的条件去数据库中查询却只能查到一条记录,并没有重…

mysql新增、修改表字段

一、新增字段 说明:以下语句关键字COLUMN,都可以省略,“ACT_AAA”是表名 格式 ALTER TABLE 表名 ADD COLUMN 字段名称 字段类型(字段长短-选填) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL&#xf…

ln命令使用

Linux中ln是一个非常重要的一个命令,主要是将两个文档进行连接,创建一个连接关系 连接档:ln 使用ln可以在两个文件之间建立关联,就类似Windows下的快捷方式,连接有两种方式 Hard Link(硬式连接或实际连接…

Linux ln 命令是什么?C/C++代码实现

在Linux中,在命令行上工作时,需要在文件之间创建链接,将文件名与文件数据相关联。这可以使用名为 ln 的专用命令来实现。 什么是链接? 在讨论 ln 命令之前,让我们先讨论一下链接命令,什么是链接&#xff…

Linux命令详解(13)- ln命令

ln是英文“link files”的缩写,命令不算复杂,但是非常重要。 语法: ln option Source file or directory Destination file or directory 这里先讲下两个概念。 1.软连接 软链接类似于windows系统中的快捷方式。创建之后&#xff0c…

linux ln 远程,Linux 软连接 (ln命令)

这是linux中一个非常重要命令。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个…

linux 中的 ln 命令,Linux ln命令操作指南

ln是Linux系统中一个重要的命令,能够为文件建立链接,保持链接文件的同步性,下面小编就给大家介绍下Linux下如何使用ln命令,通过实例来详细了解。 1. 使用ln命令给档案创建symbolic link。 linux系统下的symbolic link类似于window…

Linux ln命令详解

ln命令来自于英文单词link的缩写,中文译为“链接”,其功能是用于为某个文件在另外一个位置建立同步的链接。Linux系统中的链接文件有两种形式,一种是硬链接(hard link),另一种是软链接(symbolic…

ln命令应用

记录:352 场景:在CentOS 7.9操作系统上,使用ln命令创建软链接(symbolic links)和硬链接(hard links)。解决:Too many levels of symbolic links。 版本: 操作系统:CentOS 7.9 1.命令应用 (1)目录创建软…

linux ln命令

ln 命令的功能是在不同的位置创建一个链接,又分软链接和硬链接,一般软链接使用较多。 硬链接:ln 源文件 链接文件 是在选定的位置生成一个文件的镜像,镜像文件与源文件同样大小 软连接:ln –s 源文件 链接文件 是…

ln命令详解

Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个文件可以有多个名称,而软链接的方式则是产生一个特殊的文件&…

ubuntu18.04虚拟机崩掉导致硬盘错误,提示fsck manually

问题描述: 可能是一次性复制的文件太大了,导致内存吃紧,Windows10直接崩掉,接着就进入了我经常看到的那个蓝屏错误提示界面,有个正在恢复的百分数进度提示。 这个问题我经常碰到,或许是网页开多了吧&…

dos磁盘管理命令

dos磁盘管理命令 前言 磁盘管理命令用于日常的磁盘维护。DOS命令行提供了多种文件管理命令用于设置和管理磁盘列表。由于很多磁盘在没有安装图形界面的时候就需要对其进行操作,所以掌握DOS命令行下的磁盘管 理命令对系统管理员是十分必要的。 磁盘管理命令 以下…

centos 硬盘 修复

xfs_repair -n /dev/sdb centos 硬盘 修复 sudo parted -l sudo parted -l [localhost home]$ sudo parted -l Model: Dell VIRTUAL DISK (scsi) Disk /dev/sda: 1000GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags:Number Start End…

电脑修复损坏文件--修复命令;系统盘磁盘空间不足

目录 sfc/scannow--修复损坏的系统文件命令解析command parse步骤 命令修复磁盘;磁盘空间的释放输入“sfc /purgecache”命令(不含双引号,下同)输入“cleanmgr”命令输入“CHKDSK D:/F”,修复D驱动器号 sfc/scannow–修…

mac 磁盘修复

1、使用磁盘工具 2、终端查看并修复 diskutil listdiskutil verifyVolume disknamediskutil repairDisk diskname

如何扫描和修复 Linux 磁盘错误

在本文中,将学习如何使用 fsck 和 xfs_repair 命令修复 Linux 磁盘错误。 什么是FSCK? fsck(文件系统一致性检查)是用于检查Linux操作系统文件系统一致性的工具。 列出 Linux 磁盘分区和类型: 首先,需要…

计算机磁盘修复工具,chkdsk磁盘修复工具

chkdsk磁盘修复工具是一款非常具有专业性、权威的工具,使用chkdsk磁盘修复工具时你不可以有任何其他操作(停止运行任何程序),只能锁定磁盘(也就是强制卸下该卷),如果出现其他程序在修复时运行,就需要你重启电脑后重新修复了。硬盘坏道修复工具使用简单且安全性高,推荐使用…

ubuntu磁盘修复

输入命令ls的时候遇到错误 ls: reading directory .: Input/output error 用 dmesg 查看,发现io错误 先umount磁盘 cd /mnt umount diske 遇到 umount: /mnt/diske: target is busy. 查看谁在用 ,并kill掉,再次umount lsof /mnt/disk 然…

磁盘检查清理修复命令

Cmd命令在桌面版windowsPC和大多数windows server下都是通用的,所以掌握命令对于使用者非常重要; 经常会遇到检查硬盘、清理磁盘的时候,但是使用360、金山等杀毒软件会有一些安全隐患,尤其是大企业有自己的杀毒软件不允许使用其他的带有插件或广告的杀毒…