亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

關于JDBC與MySQL臨時表空間的深入解析

2024-07-25 19:08:57
字體:
來源:轉載
供稿:網友

背景

臨時表空間用來管理數據庫排序操作以及用于存儲臨時表、中間排序結果等臨時對象,相信大家在開發中經常會遇到相關的需求,下面本文將給大家詳細JDBC與MySQL臨時表空間的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧

應用 JDBC 連接參數采用 useCursorFetch=true,查詢結果集存放在 mysqld 臨時表空間中,導致ibtmp1 文件大小暴增到90多G,耗盡服務器磁盤空間。為了限制臨時表空間的大小,設置了:

innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:2G

問題描述

在限制了臨時表空間后,當應用仍按以前的方式訪問時,ibtmp1文件達到2G后,程序一直等待直到超時斷開連接。 SHOW PROCESSLIST顯示程序的連接線程為sleep狀態,state和info信息為空。 這個對應用開發來說不太友好,程序等待超時之后要分析原因也缺少提示信息。

問題分析過程

為了分析問題,我們進行了以下測試

測試環境:

mysql:5.7.16

java:1.8u162

jdbc 驅動:5.1.36

OS:Red Hat 6.4

1.手工模擬臨時表超過最大限制的場景

模擬以下環境:

ibtmp1:12M:autoextend:max:30M

將一張 500萬行的 sbtest 表的 k 字段索引刪除

運行一條 group by 的查詢,產生的臨時表大小超過限制后,會直接報錯:

select sum(k) from sbtest1 group by k; 
ERROR 1114 (HY000): The table '/tmp/#sql_60f1_0' is full

2.檢查驅動對 mysql 的設置

我們上一步看到,sql 手工執行會返回錯誤,但是 jdbc 不返回錯誤,導致連接一直 sleep,懷疑是 mysql 驅動做了特殊設置,驅動連接 mysql,通過 general_log 查看做了哪些設置。未發現做特殊設置。

3.測試 JDBC 連接

問題的背景中有對JDBC做特殊配置:useCursorFetch=true,不知道是否與隱藏報錯有關,接下來進行測試:

JDBC,MySQL,臨時表空間

發現以下現象:

·加參數 useCursorFetch=true時,做同樣的查詢確實不會報錯

這個參數是為了防止返回結果集過大而采用分段讀取的方式。即程序下發一個 sql 給 mysql 后,會等 mysql 可以讀結果的反饋,由于 mysql 在執行sql時,返回結果達到 ibtmp 上限后報錯,但沒有關閉該線程,該線程處理 sleep 狀態,程序得不到反饋,會一直等,沒有報錯。如果 kill 這個線程,程序則會報錯。

·不加參數 useCursorFetch=true時,做同樣的查詢則會報錯

JDBC,MySQL,臨時表空間

結論

1.正常情況下,sql 執行過程中臨時表大小達到 ibtmp 上限后會報錯;

2.當JDBC設置 useCursorFetch=true,sql 執行過程中臨時表大小達到 ibtmp 上限后不會報錯。

解決方案

進一步了解到使用 useCursorFetch=true 是為了防止查詢結果集過大撐爆 jvm;

但是使用 useCursorFetch=true 又會導致普通查詢也生成臨時表,造成臨時表空間過大的問題;

臨時表空間過大的解決方案是限制 ibtmp1 的大小,然而 useCursorFetch=true 又導致JDBC不返回錯誤。

所以需要使用其它方法來達到相同的效果,且 sql 報錯后程序也要相應的報錯。除了 useCursorFetch=true 這種段讀取的方式外,還可以使用流讀取的方式。流讀取程序詳見附件部分。

·報錯對比

·段讀取方式,sql 報錯后,程序不報錯

·流讀取方式,sql 報錯后,程序會報錯

·內存占用對比

這里對比了普通讀取、段讀取、流讀取三種方式,初始內存占用 28M 左右:

·普通讀取后,內存占用 100M 多

·段讀取后,內存占用 60M 左右

·流讀取后,內存占用 60M 左右

補充知識點

MySQL共享臨時表空間知識點

MySQL 5.7在 temporary tablespace上做了改進,已經實現將 temporary tablespace 從 ibdata(共享表空間文件)中分離。并且可以重啟重置大小,避免出現像以前 ibdata 過大難以釋放的問題。
其參數為:innodb_temp_data_file_path

1.表現

MySQL啟動時 datadir 下會創建一個 ibtmp1 文件,初始大小為 12M,默認值下會無限擴展:

通常來說,查詢導致的臨時表(如group by)如果超出 tmp_table_size、max_heap_table_size 大小限制則創建 innodb 磁盤臨時表(MySQL5.7默認臨時表引擎為 innodb),存放在共享臨時表空間;

如果某個操作創建了一個大小為100 M的臨時表,則臨時表空間數據文件會擴展到 100M大小以滿足臨時表的需要。當刪除臨時表時,釋放的空間可以重新用于新的臨時表,但 ibtmp1 文件保持擴展大小。

2.查詢視圖

可查詢共享臨時表空間的使用情況:

SELECT FILE_NAME, TABLESPACE_NAME, ENGINE, INITIAL_SIZE, TOTAL_EXTENTS*EXTENT_SIZE AS TotalSizeBytes, DATA_FREE,MAXIMUM_SIZE FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME = 'innodb_temporary'/G*************************** 1. row ***************************    FILE_NAME: /data/mysql5722/data/ibtmp1TABLESPACE_NAME: innodb_temporary      ENGINE: InnoDB    INITIAL_SIZE: 12582912   TotalSizeBytes: 31457280    DATA_FREE: 27262976  MAXIMUM_SIZE: 314572801 row in set (0.00 sec)

3.回收方式

重啟 MySQL 才能回收

4.限制大小

為防止臨時數據文件變得過大,可以配置該 innodb_temp_data_file_path (需重啟生效)選項以指定最大文件大小,當數據文件達到最大大小時,查詢將返回錯誤:

innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:2G

5. 臨時表空間與 tmpdir 對比

共享臨時表空間用于存儲非壓縮InnoDB臨時表(non-compressed InnoDB temporary tables)、關系對象(related objects)、回滾段(rollback segment)等數據;

tmpdir 用于存放指定臨時文件(temporary files)和臨時表(temporary tables),與共享臨時表空間不同的是,tmpdir存儲的是compressed InnoDB temporary tables。

可通過如下語句測試:

CREATE TEMPORARY TABLE compress_table (id int, name char(255)) ROW_FORMAT=COMPRESSED;CREATE TEMPORARY TABLE uncompress_table (id int, name char(255)) ;

附件

SimpleExample.java

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import java.util.concurrent.CountDownLatch;import java.util.concurrent.atomic.AtomicLong;public class SimpleExample { public static void main(String[] args) throws Exception {  Class.forName("com.mysql.jdbc.Driver");  Properties props = new Properties();  props.setProperty("user", "root");  props.setProperty("password", "root");  SimpleExample engine = new SimpleExample();//  engine.execute(props,"jdbc:mysql://10.186.24.31:3336/hucq?useSSL=false");  engine.execute(props,"jdbc:mysql://10.186.24.31:3336/hucq?useSSL=false&useCursorFetch=true"); } final AtomicLong tmAl = new AtomicLong(); final String tableName="test"; public void execute(Properties props,String url) {  CountDownLatch cdl = new CountDownLatch(1);  long start = System.currentTimeMillis();  for (int i = 0; i < 1; i++) {   TestThread insertThread = new TestThread(props,cdl, url);   Thread t = new Thread(insertThread);   t.start();   System.out.println("Test start");  }  try {   cdl.await();   long end = System.currentTimeMillis();   System.out.println("Test end,total cost:" + (end-start) + "ms");  } catch (Exception e) {  } }  class TestThread implements Runnable {  Properties props;  private CountDownLatch countDownLatch;  String url;  public TestThread(Properties props,CountDownLatch cdl,String url) {   this.props = props;   this.countDownLatch = cdl;   this.url = url;  }  public void run() {   Connection connection = null;   PreparedStatement ps = null;   Statement st = null;   long start = System.currentTimeMillis();   try {    connection = DriverManager.getConnection(url,props);    connection.setAutoCommit(false);    st = connection.createStatement();         //st.setFetchSize(500);    st.setFetchSize(Integer.MIN_VALUE); //僅修改此處即可         ResultSet rstmp;         st.executeQuery("select sum(k) from sbtest1 group by k");    rstmp = st.getResultSet();    while(rstmp.next()){          }   } catch (Exception e) {    System.out.println(System.currentTimeMillis() - start);    System.out.println(new java.util.Date().toString());    e.printStackTrace();   } finally {    if (ps != null)     try {      ps.close();     } catch (SQLException e1) {      e1.printStackTrace();     }    if (connection != null)     try {      connection.close();     } catch (SQLException e1) {      e1.printStackTrace();     }    this.countDownLatch.countDown();   }  } }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美国产成人| 色综合视频一区中文字幕| 美女扒开尿口让男人操亚洲视频网站| 伊人精品在线观看| 亚洲欧美日韩一区二区在线| 亚洲男人第一网站| 热久久视久久精品18亚洲精品| 91精品国产高清| 韩日精品中文字幕| 色樱桃影院亚洲精品影院| 8x海外华人永久免费日韩内陆视频| 亚洲电影成人av99爱色| 国产精品久久久精品| 欧美视频13p| 欧美在线视频免费播放| 国产精品国模在线| 国产精品69久久久久| 欧美黑人xxx| 亚洲有声小说3d| 日韩av电影免费观看高清| 日韩精品免费一线在线观看| 爱福利视频一区| 亲爱的老师9免费观看全集电视剧| 精品美女国产在线| 亚洲国产精品视频在线观看| 97在线视频国产| 欧美性xxxxx极品娇小| 欧美成人免费在线视频| 日韩电影在线观看永久视频免费网站| 久久综合伊人77777| 亚洲天堂av在线免费| 欧美日韩国产二区| 中日韩美女免费视频网站在线观看| 精品中文字幕乱| 992tv在线成人免费观看| 亚洲伊人久久综合| 色综合91久久精品中文字幕| 久久夜精品va视频免费观看| 亚洲精品国产福利| 国产成人在线精品| 亚洲午夜久久久影院| 国产一区二区三区在线看| 欧美国产精品va在线观看| 这里只有精品在线观看| 亚洲qvod图片区电影| 91精品国产九九九久久久亚洲| 国产日韩在线看片| 国产欧美精品日韩精品| 夜夜狂射影院欧美极品| 亚洲色图日韩av| 国产精品视频久久久| 欧美电影免费观看大全| 欧美激情手机在线视频| 亚洲社区在线观看| 亚洲欧洲自拍偷拍| 亚洲品质视频自拍网| 有码中文亚洲精品| 国产精品免费观看在线| 亚洲成人999| 欧美精品一本久久男人的天堂| 国产日韩在线精品av| 国产剧情久久久久久| 欧洲美女7788成人免费视频| 欧美激情第一页xxx| 91久久久国产精品| 日本国产一区二区三区| 亚洲欧洲一区二区三区在线观看| 精品视频在线观看日韩| 亚洲www在线观看| 亚洲国产中文字幕久久网| 久久免费精品日本久久中文字幕| 尤物精品国产第一福利三区| 亚洲男子天堂网| 国产精品永久免费观看| 国产精品一区二区av影院萌芽| 欧美男插女视频| 欧美精品日韩www.p站| 亚洲在线免费观看| 国产日韩欧美在线看| 国产最新精品视频| 2020欧美日韩在线视频| 精品自在线视频| 欧美综合在线第二页| 亚洲国产精品女人久久久| 北条麻妃在线一区二区| 久久久99免费视频| 热久久视久久精品18亚洲精品| 精品久久久久久久久久久久久| 久久精品中文字幕免费mv| 欧美精品久久久久久久久| 55夜色66夜色国产精品视频| 国产精品久久久久7777婷婷| 成人激情视频小说免费下载| 欧美老少配视频| 懂色av一区二区三区| 国产精品久久久久久久久久新婚| 欧美国产在线视频| 久久久www成人免费精品张筱雨| 色多多国产成人永久免费网站| 色偷偷av一区二区三区乱| 欧美性xxxxx| 亚洲一区二区三区乱码aⅴ蜜桃女| 2020久久国产精品| 亚洲性视频网站| 91爱视频在线| 亚洲国产中文字幕在线观看| 亚洲国产精品电影在线观看| 亚洲男人天堂手机在线| 亚洲国产天堂久久国产91| 欧美黄网免费在线观看| 国内自拍欧美激情| 国产色婷婷国产综合在线理论片a| 精品亚洲男同gayvideo网站| 久久久在线观看| 欧美日韩国产二区| 国产综合在线视频| 91中文字幕在线| 精品亚洲精品福利线在观看| 色综合天天综合网国产成人网| 久久噜噜噜精品国产亚洲综合| 91手机视频在线观看| 国产精品日韩欧美综合| 久久久人成影片一区二区三区观看| 26uuu亚洲国产精品| 亚洲欧美中文字幕| 欧美日韩在线视频首页| 欧美激情女人20p| 色一区av在线| 色狠狠av一区二区三区香蕉蜜桃| 国产主播喷水一区二区| 亚洲香蕉av在线一区二区三区| 亚洲国产欧美在线成人app| 欧美性猛交丰臀xxxxx网站| 日韩电影在线观看永久视频免费网站| 在线观看日韩视频| 国产在线视频欧美| 亚洲japanese制服美女| 久久成人人人人精品欧| 在线亚洲午夜片av大片| 亚洲国产成人久久综合一区| 国产成人精品视频在线观看| 欧美精品激情在线观看| 国内精品国产三级国产在线专| 欧美高清在线视频观看不卡| xxxx性欧美| 91免费电影网站| 激情av一区二区| 国产精品入口日韩视频大尺度| 亚洲黄色有码视频| 91在线视频导航| 久久777国产线看观看精品| 亚洲国产黄色片| 欧美日韩一区二区三区在线免费观看| 91沈先生在线观看| 亚洲人成在线观看| 日韩经典中文字幕| 国产一区二区三区直播精品电影| 亚洲第一福利视频| 俺去亚洲欧洲欧美日韩| 久久精品国产一区二区电影| 黄色成人在线播放| 国产深夜精品福利| 青青在线视频一区二区三区| 欧美另类老女人|