版权声明:本文为博主原创文章。未经博主同意不得转载。 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就可以(注意:这会释放该用户连接创建的全部暂时表)。

MySQL 5.7怎么爬出暂时表空间的坑的更多相关文章

  1. Mysql怎样删除以“#sql-”开头的暂时表

    author:skate time:2014/09/28 Mysql怎样删除以"#sql-"开头的暂时表 现象:在重建索引后,发现Mysqlserver的磁盘空间快满了 在用例如以 ...

  2. oracle暂时表空间 ORA-01652:无法通过16(在表空间XXX中)扩展 temp 字段

    今天在查数据的时候报错  ORA-01652:无法通过16(在表空间temp1中)扩展 temp 字段 查看表空间使用明细 SELECT b.tablespace,        b.segfile# ...

  3. oracle表空间查询维护命令大全之三(暂时表空间)史上最全

    --UNDO表空间汇总 --查看全部的表空间名字 SELECT NAME FROM V$TABLESPACE; --创建新的UNDO表空间,并设置自己主动扩展參数; CREATE UNDO TABLE ...

  4. ORACLE-015:ora-25153 暂时表空间为空,ora01652 无法通过128

    写了一个复杂的select语句,突然oracle就报了:ora-25153 暂时表空间为空,这个错误,于是网上查了下.发现了例如以下解决方法:创建一个新的暂时表空间. 首先要有system权限.登录进 ...

  5. MySQL Server参数优化 - innodb_file_per_table(独立表空间)

    1 简介    Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.    共享表空间以及独立表空间都是针对数据的存储方式而言的.    ...

  6. 表空间_暂时表空间引起的错误:ora-01652 小例

    原创作品,出自 "深蓝的blog" 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46888243 报暂 ...

  7. Oracle中暂时表空间的清理

    作者:iamlaosong Oracle暂时表空间主要用来做查询和存放一些缓冲区数据. 暂时表空间消耗的主要原因是须要对查询的中间结果进行排序.暂时表空间的主要作用: 索引create或rebuild ...

  8. MySQL 独立表空间恢复案例

    创建表的时候就会得到元数据.可以通过定义的方式对表的元数据进行生成 这个地方要注意的是 独立表空间当中   ibd & frm分别存储的是什么数据? 表空间:文件系统,为了更好的扩容数据库的存 ...

  9. mysql表空间加密 keyring encryption

    从5.7.11开始,mysql开始支持物理表空间的加密,它使用两层加密架构.包括:master key 和 tablespace key master key用于加密tablespace key,加密 ...

随机推荐

  1. vc下项目的头文件包含目录以及库导入预计库目录设置

    1.包含目录:include 头文件包含目录设置: project->setting->C/C++->常规: Additional include directories(附加包含目 ...

  2. 使用JDBC插入数据到ORACLE,使用标识列自增列

    不同于SQL Server的是,Oracle中插入数据的时候,没有自增列或者是标识列,但是,我们又不想显式的进行主键的插入,这里,必须在Oracle数据库中指定一个标识列,或者说是一个序列.具体方法如 ...

  3. 用layer插件实现tp3.2的分页

    主要需要用到  /layer/layer.js  这个, 现在一个tp前端视图/article/index.html <!DOCTYPE html> <html lang=" ...

  4. Geoserver

    Geoserver是一个功能齐全,遵循OGC开放标准的开源WFS-T和WMS服务器.利用Geoserver可以把数据作为maps/images来发布(利用WMS来实现)也可以直接发布实际的数据(利用W ...

  5. 一些有用的java 框架

    jwt  用于生成web toke的类库 http://jwt.io/ jasypt java加密类库 http://www.jasypt.org/

  6. Python pyQt4/pyQt5 学习笔记2(状态栏、菜单栏和工具栏)

    例子:状态栏.菜单栏和工具栏 import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(sel ...

  7. 【JVM译文】JVM问题定位前的准备工作有哪些

    一.序 最近在学习jvm工具时,不少链接直指oracle官网.才发现有不少好东西. 本文翻译自: https://docs.oracle.com/javase/8/docs/technotes/gui ...

  8. 服务器部署nginx报错 nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored

    nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored 修改nginx配置参数后,使用ng ...

  9. 23种设计模式之抽象工厂(Abstract Factory)

    抽象工厂模式又称为Kit模式,属于对象创建型模式.抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.在抽象工厂模 ...

  10. 为什么局域网里有ip为10.10.10.1

    10.0.0.1 是私有地址,用来给局域网络分配主机地址的. A类地址 (1)A类地址第1字节为网络地址,其它3个字节为主机地址.它的第1个字节的第一位固定为0. (2)A类地址网络号范围:1.0.0 ...