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部分,由“#sql”字串開始,並加上隨機值;
-
第2部分,一串”疑似”16進位制字元;
-
第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
知識無界限,不再加原創
喜歡就轉走,鐵粉加密圈
好鐵觀音盡在
「老葉茶館」
http://yejinrong.com
相關推薦
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二、安裝