• MySQL 5.7怎么爬出暂时表空间的坑


    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/n88Lpo/article/details/78126267

    导读

    怎样确认暂时表是由哪个用户连接创建的?

    上次我们介绍了MySQL 5.7暂时表空间怎么玩才干不掉坑里,这次我们来介绍怎样确认是哪个用户连接创建的暂时表。以及怎样释放暂时表。

    首先,我们查看当前的连接ID:

    yejr@imysql.com>SELECT CONNECTION_ID();
    +-----------------+
    | CONNECTION_ID() |
    +-----------------+
    |            2470 |
    +-----------------+

    在当前会话中创建暂时表:

    yejr@imysql.com [test]>create temporary table tmp1
     select * from I_S.global_status;

    备注:上面的I_S是information_schema的简写。下同。

    马上查看暂时表信息:

    yejr@imysql.com [test]>select TABLE_ID, NAME from
    I_S.innodb_temp_table_info; +----------+-----------------------+
    | TABLE_ID | NAME                  |
    +----------+-----------------------+
    |      505 | #sql17ab5_4000003a6_4 |
    +----------+-----------------------+

    我们观察到 NAME 列的值是 #sql17ab5_4000003a6_4,它由3部分构成:

    1. 第1部分,由“#sql”字符串開始,并加上随机值。

    2. 第2部分,一串”疑似”16进制字符。

    3. 第3部分,单调递增的数值;

    这当中的第2部分,我们注意到是“疑似”16进制,我们把“3a6“从16进制转成10进制试试看:

    yejr@imysql.com [test]>select conv('3a6', 16, 10);
    +---------------------+
    | conv('3a6', 16, 10) |
    +---------------------+
    | 934                 |
    +---------------------+

    能够看到,正好和当前的连接ID是一样的,这证实了我们的设想。

    我手上有两个MySQL 5.7版本号,以下是多次、不定时创建暂时表的整个观察过程记录。 

    首先是Linux系统下的5.7.18版本号:

    Server version:    5.7.18-log MySQL Community Server (GPL)
    
    yejr@imysql.com[test]> select connection_id();
    +-----------------+
    | connection_id() |
    +-----------------+
    |            1737 |
    +-----------------+
    
    yejr@imysql.com[test]> select conv(1737, 10 ,16);
    +--------------------+
    | conv(1737, 10 ,16) |
    +--------------------+
    | 6C9                |
    +--------------------+
    
    yejr@imysql.com[test]> select TABLE_ID, NAME from
    I_S.innodb_temp_table_info where NAME like ‘%6C9%’;

    +----------+----------------+
    | TABLE_ID | NAME           |
    +----------+----------------+
    |      121 | #sql7e95_6c9_5 |
    |      120 | #sql7e95_6c9_4 |
    |      119 | #sql7e95_6c9_3 |
    |      118 | #sql7e95_6c9_2 |
    +----------+----------------+

    以及Mac系统下的MySQL 5.7.16版本号:

    Server version:    5.7.16-log MySQL Community Server (GPL)
    
    
    yejr@imysql.com[test]> select connection_id();
    +-----------------+
    | connection_id() |
    +-----------------+
    |            934  |
    +-----------------+
    
    yejr@imysql.com[test]> select conv(934, 10 ,16);
    +--------------------+
    | conv(1737, 10 ,16) |
    +--------------------+
    | 3A6                |
    +--------------------+
    
    yejr@imysql.com[test]> select TABLE_ID, NAME from
    I_S.innodb_temp_table_info where NAME like ‘%3A6%’; +----------+-------------------------+ | TABLE_ID | NAME                    | +----------+-------------------------+ |      518 | #sql17ab5_31000003a6_31 | |      517 | #sql17ab5_29000003a6_29 | |      516 | #sql17ab5_26000003a6_26 | |      515 | #sql17ab5_23000003a6_23 | |      514 | #sql17ab5_1e000003a6_1e | |      513 | #sql17ab5_1b000003a6_1b | |      512 | #sql17ab5_18000003a6_18 | |      511 | #sql17ab5_16000003a6_16 | |      510 | #sql17ab5_14000003a6_14 | |      509 | #sql17ab5_12000003a6_12 | |      508 | #sql17ab5_10000003a6_10 | |      507 | #sql17ab5_d000003a6_d   | |      506 | #sql17ab5_a000003a6_a   | |      505 | #sql17ab5_4000003a6_4   | +----------+-------------------------+

    从这个结果能看到暂时表的 NAME 的第三部分数值在两个版本号中的表现不一样。

    • 在5.7.16版本号上,尽管也是单调递增,但并非顺序的,而是有跳跃,跳跃规则未知;

    • 在5.7.18版本号上,在保持单调递增的基础上,每次值都是顺序增长的。未跳跃,这个规则看起来更合理些。

    好了,如今我们知道仅仅要依据当前的用户连接ID。就能找到该会话里创建的全部暂时表。想要释放这些暂时表。仅仅须要查询 I_S.INNODB_TEMP_TABLE_INFO 表的 NAME 列值全部包括当前用户连接ID的记录。杀掉相应的用户连接ID就可以(注意:这会释放该用户连接创建的全部暂时表)。

  • 相关阅读:
    二叉树【基础算法题】
    大话数据结构笔记——第五章 串
    大话数据结构笔记——第四章 栈与队列
    矩阵【基础算法题】
    大话数据结构笔记——第三章 线性表
    十大经典排序算法(Javascript版)
    比较器
    荷兰国旗问题
    好听的字
    mongodb 命令
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9923585.html
Copyright © 2020-2023  润新知