MySQL數據庫系列(四)- InnoDB下的共享表空間和獨立表空間詳解

1、概念mysql

共享表空間: Innodb的全部數據保存在一個單獨的表空間裏面,而這個表空間能夠由不少個文件組成,一個表能夠跨多個文件存在,因此其大小限制再也不是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中能夠看到,其表空間的最大限制爲64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,固然這個大小是包括這個表的全部索引等其餘相關數據。sql

獨立表空間:每個表都將會生成以獨立的文件方式來進行存儲,每個表都有一個.frm表描述文件,還有一個.ibd文件(這個文件包括了單獨一個表的數據內容以及索引內容)。數據庫

2、共享表空間和獨佔表空間的區別
一、共享表空間:bash

優勢:
1)能夠放表空間分紅多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表能夠分佈在不一樣的文件上)。
因此其大小限制再也不是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中能夠看到,其表空間的最大限制爲64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,固然這個大小是包括這個表的全部索引等其餘相關數據。
2)表數據和表描述放在一塊兒方便管理。 服務器

缺點:
1)全部的數據和索引存放到一個文件中,將有一個很常大的文件,雖然能夠把一個大文件分紅多個小文件,可是多個表及索引在表空間中混合存儲,這樣對於一個表作了大量刪除操做後表空間中將會有大量的空隙,特別是對於統計分析,日誌系統這類應用最不適合用共享表空間。性能

二、獨立表空間(在配置文件(my.cnf)中設置innodb_file_per_table=1):spa

優勢:
1)每一個表都有自已獨立的表空間。
2)每一個表的數據和索引都會存在自已的表空間中。
3)能夠實現單表在不一樣的數據庫中移動。
4)空間能夠回收。
對於使用獨立表空間的表,無論怎麼刪除,表空間的碎片不會太嚴重的影響性能,並且還有機會處理(表空不能自已回收),處理方式以下:
Drop table操做自動回收表空間
若是對於統計分析或是日誌表,刪除大量數據後能夠經過:alter table TableName engine=innodb;回縮不用的空間
對於使innodb-plugin的Innodb使用turncate table也會使空間收縮
5)使用獨佔表空間的效率以及性能會更高一點。日誌

缺點:
1)單表增長過大,如超過100個G:
當使用獨享表空間來存放Innodb的表的時候,每一個表的數據以一個單獨的文件來存放,這個時候的單表限制,又變成文件系統的大小限制了。blog

三、共享表空間以及獨佔表空間之間的轉化索引

修改獨佔空表空間配置,如下幾個參數必須在一塊兒加入
innodb_data_home_dir = "/usr/local/mysql/var/"  數據庫文件所存放的目錄
innodb_log_group_home_dir = "/usr/local/mysql/var" 日誌存放目錄
innodb_data_file_path=ibdata1:10M:autoextend  設置配置一個可擴展大小的尺寸爲10MB的單獨文件(共享數據文件),名爲ibdata1。沒有給出文件的位置,因此默認的是在MySQL的數據目錄內(如 /db/mysql/ibdata1)。
innodb_file_per_table=1  是否使用共享以及獨佔表空間(1 爲使用獨佔表空間,0 爲使用共享表空間)
innodb_file_per_table 經過這個參數來實現的轉化,若是爲OFF說明所使用的是共享表空間【默認狀況下,所使用的表空間爲共享表空間】
innodb_file_per_table值來進行修改便可,可是對於以前使用過的共享表空間則不會影響,除非手動的去進行修改

注意:
InnoDB不建立目錄,因此在啓動服務器以前請確認」所配置的路徑目錄」的確存在。作數據的移植以及備份時,要注意數據文件的完整性.

3、查看數據庫表空間  

(root@3306-10:19:58:)[(none)]> show variables like 'innodb_data%';   
+-----------------------+--------------------------------------+
| Variable_name         | Value                                |
+-----------------------+--------------------------------------+
| innodb_data_file_path | ibdata1:512M;ibdata2:512M:autoextend |
| innodb_data_home_dir  | /data/mysql_3306_gpbigdata/data      |
+-----------------------+--------------------------------------+
2 rows in set (0.00 sec)

表空間有四個文件組成:ibdata一、ibdata2,每一個文件的設置爲大小512M,當每一個文件都滿了的時候,ibdata2會自動擴展;
當前的存儲空間滿的時候,能夠在其餘的磁盤添加數據文件,語法以下:語法以下所示:
pathtodatafile:sizespecification;pathtodatafile:sizespec;.;pathtodatafile:sizespec[:autoextend[:max:sizespecification]]
若是用 autoextend 選項描述最後一個數據文件,當 InnoDB 用盡全部表自由空間後將會自動擴充最後一個數據文件。
不論是共享表空間和獨立表空間,都會存在innodb_data_file文件,由於這些文件不只僅要存放數據,並且還要充當着相似於ORACLE的UNDO表空間等一些角色。

4、共享表空間和獨立表空間之間的轉換

一、查看當前數據庫的表空間管理類型

(root@3306-10:30:52:)[(none)]> show variables like "innodb_file_per_table";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

ON表明獨立表空間管理,OFF表明共享表空間管理;(查看單表的表空間管理方式,須要查看每一個表是否有單獨的數據文件)  

二、修改數據庫的表空間管理方式

修改innodb_file_per_table的參數值便可,可是修改不能影響以前已經使用過的共享表空間和獨立表空間;

innodb_file_per_table=1 爲使用獨佔表空間

innodb_file_per_table=0 爲使用共享表空間

三、共享表空間轉化爲獨立表空間的方法(參數innodb_file_per_table=1須要設置)
單個表的轉換操做,腳本:alter table table_name engine=innodb;

當有大量的表須要操做的時候,先把數據庫導出,而後刪除數據再進行導入操做,該操做能夠用mysqldump進行操做

 

 -----------------------------------------------------------書山有路勤爲徑,學海無涯苦做舟-------------------------------------------------------------

相關文章
相關標籤/搜索