1. 程式人生 > >MySQL 5.7怎麼爬出臨時表空間的坑

MySQL 5.7怎麼爬出臨時表空間的坑

導讀

如何確認臨時表是由哪個使用者連線建立的?

上次我們介紹了MySQL 5.7臨時表空間怎麼玩才能不掉坑裡,這次我們來介紹如何確認是哪個使用者連線建立的臨時表,以及如何釋放臨時表。

首先,我們檢視當前的連線ID:

[email protected]>SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|            2470 |
+-----------------+

在當前會話中建立臨時表:

[email protected] [test]>create temporary table tmp1
 select * from I_S.global_status;

備註:上面的I_S是information_schema的簡寫,下同。

立即檢視臨時表資訊:

[email protected] [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進位制試試看:

[email protected] [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)

[email protected][test]> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|            1737 |
+-----------------+

[email protected][test]> select conv(1737, 10 ,16);
+--------------------+
| conv(1737, 10 ,16) |
+--------------------+
| 6C9                |
+--------------------+

[email protected][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)


[email protected][test]> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|            934  |
+-----------------+

[email protected][test]> select conv(934, 10 ,16);
+--------------------+
| conv(1737, 10 ,16) |
+--------------------+
| 3A6                |
+--------------------+

[email protected][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即可(注意:這會釋放該使用者連線建立的所有臨時表)。

延伸閱讀

  • https://dev.mysql.com/doc/refman/5.7/en/innodb-temp-table-info-table.html

  • https://dev.mysql.com/doc/refman/5.7/en/innodb-information-schema-temp-table-info.html

知識無界限,不再加原創

喜歡就轉走,鐵粉加密圈

640?wx_fmt=png

好鐵觀音盡在

「老葉茶館」

http://yejinrong.com

640?wx_fmt=png

相關推薦

MySQL 5.7怎麼臨時空間

導讀 如何確認臨時表是由哪個使用者連線建立的? 上次我們介紹了MySQL 5.7臨時表空間怎麼玩才能不掉坑裡,這次我們來介紹如何確認是哪個使用者連線建立的臨時表,以及如何釋放臨時表。 首先,我們檢視當前的連線ID: [email protected]>SELECT CONNECTIO

MySQL 5.7怎麽暫時空間

comm ace borde track strong trac style 保持 tex 版權聲明:本文為博主原創文章。未經博主同意不得轉載。 https://blog.csdn.net/n88Lpo/article/details/78126267 導讀 怎樣確

MySQL-5.7設置InnoDB數據文件存儲位置

pid file buffer 就是 like 位置 orm for inno [root@localhost data]# ls a1 a2 a3 auto.cnf ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1

MySQL 5.7新增sys.session檢視系統執行狀態

在MySQL 5.6以前,我們通過show processlist\G命令檢視系統中正在執行的所有程序,從5.7開始,我們又可以通過sys.session表來檢視系統正在執行的所有程序,而且該表中的記錄相對processlist比較完善:mysql> SELECT

MySQL 5.7臨時空間怎麼玩才能不掉

導讀 MySQL 5.7起支援獨立臨時表空間,但個別時候也可能會踩坑的。 MySQL 5.7起,開始採用獨立的臨時表空間(和獨立的undo表空間不是一回事喲),命名ibtmp1檔案,初始化12M,且預設無上限。 選項 innodb_temp_data_file_

MySQL 5.7新支持--------通用空間實戰

mysql dba general tablespace 1. 背景  * 一個通用的表空間是一個共享的InnoDB表空間。 * 與系統表空間類似,一般的表空間是共享的表空間,可以存儲多個表的數據 * 一般的表空間比文件表的表空間具有潛在的內存優勢。 * MySQL 將表空間元數據保存

MySQL 5.7新特性之線上收縮undo空間

1. MySQL 5.5時代的undo log 在MySQL5.5以及之前,大家會發現隨著資料庫上線時間越來越長,ibdata1檔案(即InnoDB的共享表空間,或者系統表空間)會越來越大,這會造成2個比較明顯的問題: (1)磁碟剩餘空間越來越小,到後期往往要加磁碟;

Mysql 5.7.20 mysql innodb 系統損壞帶來的問題

sha use linux系統 type log tle blob b- 資料 早上上班後,mysql服務器遇到點小問題,在排查故障過程查看mysql錯誤日誌過程中發現有幾個innodb 表無法打開,使用desc查看有關表的表結構提示表不存在,show tables 可以查

JDBC與MySQL臨時空間的分析

文章來源:愛可生雲資料庫 作者:秦沛、胡呈清 背景 應用 JDBC 連線引數採用 useCursorFetch=true,查詢結果集存放在 mysqld 臨時表空間中,導致ibtmp1 檔案大小暴增到90多G,耗盡伺服器磁碟空間。為了限制臨時表空間的大小,設定了

mysql 5.7 undo redo 空間回收

undo redo 空間回收 InnoDB儲存引擎中,Undo log一直都是事務多版本控制中的核心元件,它具有以下的核心功能:     事務的回退:事務在處理過程中遇到異常的時候可以rollback(撤銷)所做的全部修改。     事務的恢復:資料庫例項崩潰時,將磁碟

資料庫mysql-5.7.17的極速賽_車平臺_售安裝詳解

資料庫極速賽_車平臺出_售的安裝詳解 Q1157880099 1、安裝前的準備工作 1.1、系統基本資訊 為給安裝過程減少麻煩,我這裡已經提前關閉了防火牆和selinux。我這裡是純淨的系統,沒有安裝過MySQL和mariadb,如果機器上有安裝過MySQL

一個MySQL 5.7分割槽效能下降的案例分析與排查

作者介紹 姜宇祥,2012年加入攜程,10年資料庫核心程式碼開發經驗,相關開發涉及達夢、MySQL資料庫。現致力於攜程MySQL的底層研發,為特殊問題定位和處理提供技術支援。 前言:希望通過本文,使MySQL5.7.18的使用者知曉分割槽表使用中存在的陷阱,避免在該版本上繼續踩坑。同時通過對原始碼的

MySQL 5.7 分割槽效能下降的案例分析

告知MySQL5.7.18的使用者分割槽表使用中存在的陷阱,避免在該版本上繼續踩坑。同時通過對原始碼的講解,升級MySQL5.7.18時分割槽表效能下降的根本原因,向MySQL原始碼愛好者展示分割槽表實現中鎖的運用。 問題描述 MySQL 5.7版本中,效能相關的改進非常多。包括臨時表相關的效能改進,連線

MySQL 5.7 從零開始學》筆記-資料基本操作

在資料庫中,資料表是資料庫中最重要、最基本的操作物件,是資料儲存的基本單位。資料表被定義為列的集合,資料在表中是按照行和列的格式來儲存的。每一行代表一條唯一的記錄,每一列代表記錄中的一個域。 建立資料表 所謂建立資料表,指的是在已經建立好的資料庫中建立新

mysql 5.7.14+ 版本更改密碼, 原來user的password程式設計了authentication_string

1、首先停止正在執行的MySQL程序 Linux下,執行 killall -TERM MySQLd Windows下,如果寫成服務的 可以執行:net stop MySQL,如未載入為服務,可直接在程序管理器中進行關閉。 2、以安全模式啟動MySQL Linux

mysql 5.7.3.0-m13安裝教程

com 處理 技術分享 mysql 5.7 bench aid target 驗證 htm 安裝mysql百度經驗地址:(默認安裝,除了選擇不更新和選擇保存路徑,其它基本是下一步下一步) http://jingyan.baidu.com/article/7e4409

windows下mysql 5.7的配置全過程

希望 圖片 all str success ans bst alt database 這是一套在好多次的安裝下總結出來的經驗,包括很多種遇到的問題,查過很多資料,特此總結一下。 一、從官網下載MySQL的zip(免安裝的) 解壓mysql-5.7.11-winx64.zip

在CentOS 7上源碼編譯安裝MySQL 5.7

mysql source cmake 1.系統環境[[email protected]/* */ ~]# uname -r3.10.0-514.el7.x86_64 [[email protected]/* */ ~]# cat /etc/redhat-release

yum && 編譯 安裝mysql 5.7 多實例

name mon symbol server-id service lin extra safe min yum安裝 [[email protected]/* */ ~]# wget http://repo.mysql.com/mysql57-community

MySql-5.7.17 -winx64的安裝配置

mysql一、下載軟件1. 進入mysql官網,登陸自己的Oracle賬號(沒有賬號的自己註冊一個),下載Mysql-5.7.17,下載地址:http://dev.mysql.com/downloads/mysql/2.將下載好的文件解壓到指定目錄,解壓在E:\mysql-5.7.17-winx64二、安裝