當前位置:成語大全網 - 書法字典 - linux如何修改mysql數據庫的臨時表空間大小?

linux如何修改mysql數據庫的臨時表空間大小?

先說壹下臨時表的概念。顧名思義,臨時表是臨時的,銷毀的表就用完了。數據可以存儲在臨時文件系統或固定磁盤文件系統中。臨時表如下:

1全局臨時表

這個臨時表在數據庫實例啟動後生效,在數據庫實例銷毀後失效。在MySQL中,這個臨時表對應的是內存表,也就是內存引擎。

2會話級臨時表

該臨時表在用戶成功登錄系統後生效,在用戶退出時失效。MySQL中的臨時表是指用create temporary table等關鍵字創建的表。

3事務級臨時表

這個臨時表在事務開始時生效,在事務提交或回滾後失效。MySQL中沒有這種臨時表,必須使用會話級臨時表間接實現。

4檢索級別臨時表

這個臨時表是在SQL語句執行之間生成的,執行之後就失效了。在MySQL中,這個臨時表不是很固定,隨著MySQL默認的存儲引擎而變化。比如默認的存儲引擎是MyISAM,臨時表的引擎是MyISAM,文件生成形式和數據操作形式和MyISAM壹樣,只是數據存儲在內存中;如果默認引擎是INNODB,那麽臨時表的引擎就是INNODB,它的所有信息都存儲在* * *表空間ibdata中。

MySQL 5.7優化了InnoDB存儲引擎的臨時表空間。在MySQL 5.7之前,INNODB引擎的臨時表都存儲在ibdata中,ibdata貪婪的磁盤占用導致臨時表的創建和刪除對其他正常表產生了很大的性能影響。在MySQL5.7中,以下兩個重要方面針對臨時表進行了優化:

MySQL5.7將臨時表數據和回滾信息(僅限未壓縮的表)從* * *共享表空間中分離出來,形成自己獨立的表空間,參數為innodb_temp_data_file_path。

在MySQL5.7中,臨時表的相關檢索信息保存在系統信息表中:information _ schema。innodb _ temp _ table _ info在MySQL 5.7之前,沒有什麽好的方法可以查看臨時表的系統信息。

需要註意的是,INNODB臨時表雖然有自己的表空間,但是目前還不能自己定義臨時表空間文件的存儲路徑,只能繼承innodb_data_home_dir。這時候如果要用其他磁盤,比如內存磁盤,作為臨時表空間的存儲地址,只能用老方法,做軟鏈。舉個小例子:

我現在用的OS是Ubuntu12。我想使用tmpfs文件系統作為臨時表空間。

root @ ytt-master-VirtualBox:/usr/local/MySQL/data #?ln-s/run/shm//usr/local/MySQL/data/tmp _ space 2

root @ ytt-master-VirtualBox:/usr/local/MySQL/data # ls-l | grep ' shm '

lrwxrwxrwx 1 root root 9 Nov 13 10:28 tmp _ space 2->;/run/shm/

然後把

innodb _ temp _ data _ file _ path = tmp _ space 2/ibtmp 2:200m:auto extend

添加到my.cnf中[mysqld]下面的行

重啟MySQL服務後,

mysql & gtselect @ @ innodb _ temp _ data _ file _ path \ G

***************************1.第*************************行

@ @ innodb _ temp _ data _ file _ path:tmp _ space 2/ibtmp 2:200m:auto extend

1集合中的行(0.00秒)

編寫壹個存儲過程來批量創建臨時表:

分隔符$$

使用` t_girl`$$

drop procedure IF EXISTS ` sp _ create _ temporary _ table ` $ $

create definer = ` root `@ ` localhost `過程` sp_create_temporary_table `(

IN f_cnt INT UNSIGNED)

開始

聲明i INT無符號默認值1;

而我& lt= f_cnt

防禦命令(Defense Order)

SET @ stmt = CONCAT(' create temporary table tmp ',I,'(id int,tmp _ desc varchar(60));');

從@stmt準備s 1;

執行s 1;

集合I = I+1;

結束WHILE

降備s 1;

結束$$

分隔符;

現在創建10個臨時表:

mysql & gt調用sp _ create _ temporary _ table(10);

QueryOK,0行受影響(0.07秒)

如果在以前,我們只知道創建了10個臨時表,卻只能靠記憶或者手工記錄臨時表的名稱等信息。

現在,您可以直接從數據字典中檢索相關數據。

mysql & gt?select * from information _ schema . innodb _ temp _ table _ info;

+ - + - + - + - + - + - +

| TABLE _ ID | NAME | N _ COLS | SPACE | PER _ TABLE _ TABLESPACE | IS _ COMPRESSED |

+ - + - + - + - + - + - +

| 56 | # SQL 1705 _ 2 _ 9 | 5 | 36 | FALSE | FALSE |

| 55 | # SQL 1705 _ 2 _ 8 | 5 | 36 | FALSE | FALSE |

| 54 | # SQL 1705 _ 2 _ 7 | 5 | 36 | FALSE | FALSE |

| 53 | # SQL 1705 _ 2 _ 6 | 5 | 36 | FALSE | FALSE |

| 52 | # SQL 1705 _ 2 _ 5 | 5 | 36 | FALSE | FALSE |

| 51 | # SQL 1705 _ 2 _ 4 | 5 | 36 | FALSE | FALSE |

| 50 | # SQL 1705 _ 2 _ 3 | 5 | 36 | FALSE | FALSE |

| 49 | # SQL 1705 _ 2 _ 2 | 5 | 36 | FALSE | FALSE |

| 48 | # SQL 1705 _ 2 _ 1 | 5 | 36 | FALSE | FALSE |

| 47 | # SQL 1705 _ 2 _ 0 | 5 | 36 | FALSE | FALSE |

+ - + - + - + - + - + - +

集合中的10行(0.00秒)

功能性我就講到這裏。如果對性能感興趣,可以找時間測試壹下。