• 线上mysql表字段加不了Fail to get MDL on replica during DDL synchronize,排查记录


    某天接近业务高峰期想往表里加字段加不了,报错:Fail to get MDL on replica during DDL synchronize
    遂等到业务空闲时操作、还是加不了,
    最后怀疑是相关表被锁了,或者有事务一直进行(可能这俩是一个意思),
    于是通过查看当前正在执行的线程和事务ID,kill掉遂解决问题
    最后还有两个疑问没解决:
    1.kill线程ID时只能由对应的sql执行者删除,让运维删都删不了,会显示没有该线程号;
    2.kill掉的线程ID正在执行的sql里貌似没有包含我要操作的表,这样居然也会互相影响吗
    另外,其他同事也给了我一些更改表结构但不会锁表的语句(对于我这个场景不适应),但还是备份下

    查当前mysql的线程和事务信息

    SHOW FULL PROCESSLIST 是一个用于查看MySQL服务器当前运行的所有线程和它们的状态的SQL命令。通过执行这个命令,你可以获取有关MySQL服务器上运行的所有连接和线程的详细信息,包括SQL语句、连接时间、执行时间等。
    
    以下是执行 SHOW FULL PROCESSLIST 命令后可能返回的一些信息字段:
    
    Id:线程的唯一ID。
    User:连接的用户名。
    Host:连接的主机名。
    db:当前正在使用的数据库。
    Command:线程正在执行的命令(例如,Sleep、Query、Connect)。
    Time:线程运行的时间(秒)。
    State:线程的当前状态。
    Info:线程执行的SQL语句。
    
    
    
    -- 显示mysql正在运行的线程
    SHOW FULL PROCESSLIST
    
    
    -- 查询当前事务的线程号、事务ID,执行状态,sql
    SELECT
    trx_mysql_thread_id,
        trx_id,
        trx_started AS start_time,
        trx_state AS state,
        trx_query AS query
    FROM
        information_schema.innodb_trx;
    		
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    加字段但不锁表

    ALTER TABLE `user` ADD `age` int NOT NULL DEFAULT '0' COMMENT '年龄', 
    ALGORITHM=Inplace, 
    LOCK=NONE;
    
    • 1
    • 2
    • 3
  • 相关阅读:
    golang - new和make的区别
    基于单片机设计的水平仪(STC589C52+MPU6050)
    Elementui使用resetFields不生效解决方案
    华为od德科面试数据算法解析 2022-8-29 24按身高和体重排队
    电机控制::理论分析::延迟环节对系统的影响
    eclipse配置Tomcat和Tomcat出现无效端口解决办法
    掌握分布式环境缓存更新策略,提高缓存与数据库数据一致性
    Spring MVC
    Linux 内核(Kernel)组成分析
    [JavaScript]构造函数创造对象,基本包装类型
  • 原文地址:https://blog.csdn.net/xianyu_x/article/details/133686161