【重点文章】服务升级惨痛教训

文章目录

    • 事故解析:
    • 避免方法
    • 涉及知识

  以前怎么接触过大表,所以alter操作我都是一次性执行好几条的,这几条一下子干过去了
在这里插入图片描述
在这里插入图片描述
  结果就是一直在转圈执行,因为alter产生的是表级排它锁,所以有关这几个表的查询更新操作全部处于阻塞状态,运营那边查询全部失效。
  去数据库SHOW FULL PROCESSLIST,发现State列出现大量“Waiting for table metadata lock”,紧张感拉满了。马上寻找这几个alter语句的进程id,在对应的“Info”列可以查看到对应表的操作,找到正在对该表进行操作的会话,记住“Id”, 执行KILL ID。必须找对这几个,不然kill的其他的是没用的。还有一种解决方法就是重启你的mysql数据库实例(如果试过或者你胆子大的话)
  紧张的要死,脑子都难以思考,遇到这种情况尽量让自己的同事也参与进来,或者给技术经理报告,看看怎么解决
在这里插入图片描述

事故解析:

  在MySQL中,ALTER TABLE 语句通常会对表进行锁定以执行结构修改操作。具体而言,ALTER TABLE 语句会获取一个排他锁(Exclusive Lock),这意味着其他并发的写操作和读操作都将被阻塞,直到 ALTER TABLE 完成。因此,在执行 ALTER TABLE 期间,其他对该表的写操作(如 INSERT、UPDATE、DELETE)和读操作(如 SELECT)可能会被阻塞,直到 ALTER TABLE 完成。
  这里有个注意的点:添加新列或修改列的数据类型通常需要较短的锁定时间,而重命名表或删除列可能需要更长的锁定时间。

避免方法

  1.在执行 ALTER TABLE 之前,尽量预估该操作需要的时间,并在低峰期执行,以减少对其他事务的影响。如果你用的是大厂的云服务器,在数据库的实例中找到DBA助手(以华为云为例,其他厂家名字可能不同),可以查看实时的活跃会话有多少个,如果比较少那说明处于低峰期;或者去高级运维信息里查看数据库连总接数,根据数量多少去判断
  2.如果对一个表有多个字段要修改或者删除,则分割成几条sql一个个去执行
  3.调整事务隔离级别:在某些情况下,将事务隔离级别调整为较低的级别(如读已提交)可能会减少对锁的需求,从而减少对 SELECT 查询的阻塞。(不推荐,拆东墙补西墙罢了)

涉及知识

  1.乐观锁不是mysql自带的要自己去实现,悲观锁涉及排它锁和共享锁。读(select)操作产生的是共享锁,其他的读操作可以继续加共享锁(但不能加排它锁,也就是不能增删改),通俗来说就可以一直select不会产生阻塞,而写操作( update/delete/insert)加的是排它锁,只允许自己一个锁,在它执行完其他操作都处于阻塞状态。

  2.MySQL中InnoDB加锁机制
select… :不加锁
select… lock in share mode:加共享锁
select… for update:加排它锁
update/delete/insert默认加排它锁

   3.在数据库中,"加锁"和"获取锁"通常是指同一个概念,即在执行操作之前,通过某种方式将锁应用于数据或资源,以控制并发访问和维护数据的一致性。
   "加锁"是指在执行操作之前,显式地将锁应用于数据或资源。这意味着在进行读取或写入操作之前,需要先获取相应的锁。
   "获取锁"是指在执行操作时,尝试获取已经存在的锁。如果锁可用且没有被其他事务持有,那么获取锁的操作会成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/184689.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux动静态库

文章目录 1. 静态库2. 动态库3. 动态库的加载 本章代码gitee仓库:动静态库 1. 静态库 Linux开发工具gcc/g篇,此篇文章讲过动静态库的基本概念,不了解的可以先看一下这篇文章。 现在我们先来制作一个简单的静态库 mymath.h #pragma once#i…

Apache阿帕奇安装配置

目录 一、下载程序 1. 点击Download 2. 点击Files for Microsoft Windows 3. 点击Apache Lounge 4. 点击httpd-2.4.54-win64-VSI6.zip ​5. 下载压缩包 6.解压到文件夹里 二、配置环境变量 1. 右键我的电脑 - 属性 2. 高级系统设置 3. 点击环境变量 4. 点击系统变…

springboot326校园体育场馆(设施)使用管理网站

交流学习: 更多项目: 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示: ————————————————

【Java】详解多线程通信

🌺个人主页:Dawn黎明开始 🎀系列专栏:Java ⭐每日一句:什么都不做,才会来不及 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️ 文章目录 🔐多…

12v24v60v高校同步降压转换芯片推荐

12V/24V/60V 高校同步降压转换芯片推荐: 对于需要高效、稳定、低噪音的降压转换芯片,推荐使用WD5030E和WD5105。这两款芯片都是采用同步整流技术,具有高效率、低噪音、低功耗等优点,适用于各种电子设备。 WD5030E是一款高效率…

Scrapy----Scrapy简介

文章目录 概述与应用背景架构和组件功能和特点社区生态概述与应用背景 Scrapy,一个高效、灵活、且强大的Web爬取框架,被广泛应用于数据抓取和网页内容的结构化提取。它是用Python编写的,支持多平台运行,适用于数据挖掘、在线零售信息收集、历史数据存档等多种场景。Scrapy…

交换排序详讲:冒泡排序+快速排序(多方法+思路+图解+代码)

文章目录 交换排序一.冒泡排序二.快速排序1.挖坑法2.Hoare法 交换排序 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 一.冒泡排序 /*** 冒泡排序* 时间复杂度 n^2* 空间复杂…

R语言——taxize(第二部分)

taxize(第二部分) 3. taxize 文档中译3.10. classification(根据类群ID检索分类阶元层级)示例1:传递单个ID值示例2:传递多个ID值示例3:传递单个名称示例4:传递多个名称示例5&#xf…

nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)

文章目录 一、完全卸载旧的nodejs1、打开系统的控制面板,点击卸载程序,卸载nodejs(1)打开系统的控制面板,点击程序下的卸载程序(2)找到node.js,鼠标右击出现下拉框,点卸载…

yolov5模型代码怎么修改

yaml配置文件 深度乘积因子 宽度乘积因子 所有版本只有这两个参数的不同,s m l x逐渐加宽加深 各种类型层参数对照 backbone里的各层,在这里解析,只需要改.yaml里的各层参数就能控制网络结构 修改网络结构 第一步:把新加的模块…

【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis

目录 【7】Spring Boot 3 集成组件:缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…

GUI编程--PyQt5--QTreeWidget

文章目录 树型控件展示数据修改节点数据获取所有节点的数据 Qt模组参考 QWidgets QTreeWidget 树型控件展示数据 展示数据的同时,每个节点标注数据类型。 class MyWindow(QWidget):def __init__(self, title):super(MyWindow, self).__init__()self.setWindowTitl…