中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

記一次生產MySQL服務器根目錄滿了的異常情況--DB臨時表使用異常

發布時間:2020-08-04 15:52:15 來源:ITPUB博客 閱讀:331 作者:caoyutingtjpu 欄目:MySQL數據庫

tmp空間增長異常說明

 作者:sylar版權所有[文章允許轉載,但必須以鏈接方式注明源地址,否則追究法律責任.]

一、背景說明

     近日 zabbix總是如下報警信息:
  記一次生產MySQL服務器根目錄滿了的異常情況--DB臨時表使用異常

二、問題分析

     根據zabbix報警,立即查詢空間,此時根目錄空間較大,不至于報警
 記一次生產MySQL服務器根目錄滿了的異常情況--DB臨時表使用異常

      查看mysql的錯誤日志,發現該時間點有如下錯誤信息
 記一次生產MySQL服務器根目錄滿了的異常情況--DB臨時表使用異常

       根據上圖錯誤提示,是tmp空間增長異常,并且是往里添加表(.myi格式結尾,且提及myisam,故做此判斷)

       查詢數據庫,確認是否有目錄指向/tmp,根據下面截圖得知/tmp目錄是mysql臨時表所在的目錄
 記一次生產MySQL服務器根目錄滿了的異常情況--DB臨時表使用異常

       /tmp目錄16M,最多可以創建32個,這個量完全夠普通事物使用,需要具體定位什么情況需要這么大量的臨時表,以至于超過該大小,使用到磁盤空間。

三、mysql內部臨時表(in-memory和on-disk)

3.1內部臨時表的定義
  • 不同于手工創建的臨時表,在sql執行過程中可能會用到臨時文件存儲查詢結果,稱為internal temporary table;該過程由Mysql自動完成,用戶無法手工干預;

  • 這些表或使用memory引擎存于內存,或使用MyISAM引擎存于磁盤;

  • 當某些SQL命令在MySQL數據庫中被執行的時候,它可能需要先創建一些內部的臨時表來完成比較復雜的排序或分組查詢。MySQL的臨時表分為 in-memory 和 on-disk 兩種。 如有可能,MySQL 總是首先使用 in-memory 的臨時表, 而當臨時表變得太大的時候,也可能被轉存為on-disk 的臨時表。

3.2內部臨時表創建的源代碼展示

       MySQL源碼如下所示

五、內部臨時表優化以及建議

關于MySQL內部臨時表(internal temporary table)的優化:

  • (1) 盡可能考慮如何避免SQL命令創建臨時表  

      對于一個查詢連接非常繁忙的數據庫,頻繁地使用需要創建臨時表的查詢本身就已經是一個性能瓶頸。需要重新檢視您的數據表的結構以及各表之間的關聯, 重新考慮主鍵和索引,重組數據結構以減少應用中需不同的ORDER BY和GROUP BY的情況。

      拆分為較少關聯層次的多次查詢,或使用View表。

      因為目前線上發生的環境已經使用了view表,建議view表創建時候,根據業務需求,再創建,以減少 tmp消耗

  • (2)盡量設法確保臨時表被創建于內存而非磁盤之中  

      如果實在是無法避免創建臨時表,那么退而求其次,則需要盡量確保這些臨時表能夠被創建在內存之中。避免在結構設計和查詢命令中使用BLOB和TEXT類型字段,或可考慮用 SUBSTRRING(colum,length)函數將其轉換為字符串類型;用SQLSMALLRESULT選項通知數據庫使用in-memory臨時表;使用View來簡化查詢;使用RAM disk內存盤來存儲MySQL 數據庫的臨時表(需確保無使用BLOB和TEXT字段)。  

  • (3)如何避免 On-Disk Temporary Tables

    下面是官方說明:

 The best solution is to avoid using the BLOB and TEXT types unless you really need them.
  If you can't avoid them, you may be able to use the ORDER BY SUBSTRRING(colum,length) trick to convert the values to character strings. wihich will permit in-memory temporary tables. 
  Just be sure that you are using a short engough substring that the temporary table doesn't grow larger than max_heap_table_size or tmp_table_size, or MySQL will convert the table to an on-disk MyISAM table. 
  If the Extra column of EXPLAIN contains "Using temporary",the query uses an implicit temporary table. 
  --------------下面是中文翻譯
  最好的解決方案是避免使用BLOB和文本類型,除非你真的需要他們。如果無法避免它們,您可以使用ORDER BY SUBSTRRING(colum,length)將值轉換為字符串。將允許使用內存臨時表。
  只是確保你使用的是短engough臨時表的子串,不用增長到超過max_heap_table_size tmp_table_size的大小,否則會創建一個磁盤MyISAM表
  如果解釋的額外的列包含“使用臨時”,查詢使用隱式臨時表。  

六、BLOB和TEXT導致的內部磁盤臨時表說明

  • 1、因為 Memory 存儲引擎不支持 BLOB和TEXT 類型,所以包含有 BLOB和TEXT 類型字段的查詢,當它需要用到隱式臨時表的時候,就不得不使用 on-disk的MyISAM臨時表,即使它的查詢結果可能只有很簡單的幾行數據。

       這會導致一個嚴重的性能瓶頸,即使您能配置將MySQL的臨時表存儲到RAM disk上,依然還是會需要用到許多昂貴的操作系統的調用函數。 在實用中還發現,某些SQL語句的臨時表甚至根本連RAM disk都不能使用(此時SQL查詢命令會因為不能創建臨時表而失敗)。

  • 2、BLOB和TEXT這兩個數據類型。這兩個數據類型都用來存儲大容量的數據。前者是采用二進制的形式來保存,而后者是采用字符形式來保存。

       這兩個數據類型與其他數據類型有本質的不同。在MYSQL數據庫中,是將這兩個數據類型當做有實體的對象來處理。存儲引擎也會采用特別的方式來保存他們。BLOB數據類型是采用二進制的方式來存儲數據。而采用二進制來存儲數據時,系統沒有字符集的要求,也不會設置排序規則。相反,TEXT采用字符形式來存儲數據,為此有字符集和排序規則的限制。

  • 3、因為這兩種數據類型的容量比較大,為此對對這些類型的字段進行操作時,臨時表就會一下子變得很大。

       此時就很容易超過上面兩個參數的限制。系統就會將內存臨時表轉換為磁盤臨時表。為此這兩種數據類型會增加產生磁盤臨時表的幾率。

  • 4、不同的存儲類型對于數據類型的支持力度是不同的。

       如果某種存儲類型不支持某些數據類型,那么系統就會直接采用磁盤臨時表,即使數據沒有超過其規定的大小。

       簡單的說,就是對于存儲引擎,如果其不支持某些數據類型,那么對這些數據類型進行操作時,系統只能夠使用磁盤臨時表,而不能夠使用磁盤臨時表。如對于Memory存儲引擎來說,其不支持BLOB和TEXT數據類型。在系統運行中,如果使用了BLOB和TEXT列,并且需要隱式臨時表時,查詢將不會使用內存臨時表,而直接采用磁盤臨時表。即使兩個數據類型中的列存儲的數據不多,也是如此。顯然這會大大的降低數據庫的性能。

七、小結

【小結】

  • 1、如果事物超過tmptablesize 會使用 磁盤臨時表,沒操作則用內存臨時表。
  • 2、如果使用了BLOB和TEXT列,“并且需要隱式臨時表時”,直接用磁盤臨時表,不會用到內存。即使沒有超過maxheaptable_size的限制<他們的類型決定的>,(varchar,char 都會用內存臨時表)。
  • 3、用explain查看,其實你可以在每次執行前用 explain 分析下,要是讓你使用臨時表 會在extra里面現實出來的。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤壁市| 五寨县| 吐鲁番市| 桂东县| 湘阴县| 栖霞市| 镇平县| 宝应县| 尖扎县| 亳州市| 隆德县| 上虞市| 米脂县| 根河市| 遂平县| 芦山县| 关岭| 通河县| 白城市| 井研县| 玛曲县| 安国市| 桃园市| 囊谦县| 梓潼县| 赤水市| 宁国市| 石台县| 科技| 焦作市| 明光市| 邯郸市| 利川市| 万全县| 大渡口区| 封开县| 台东市| 霍山县| 潼南县| 清徐县| 枞阳县|