程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL InnoDB共享表空間和獨立表空間

MySQL InnoDB共享表空間和獨立表空間

編輯:MySQL綜合教程

MySQL InnoDB共享表空間和獨立表空間



共享表空間

某一個數據庫的所有的表數據,索引文件全部放在一個文件中,默認這個共享表空間的文件路徑在data目錄下。 默認的文件名為ibdata1, 初始化為10M。

由於是默認的方式,就暫且理解為Mysql官方推薦的方式。相對而言所有的數據都在一個(或幾個)文件中,比較利於管理,而且在操作的時候只需要open這一個(或幾個)文件即可,相對來說代價很低。但問題是在數據達到以G為單位來計算的時候優劣逆轉。一個過大的文件很不利於管理,而且對於一個如此巨大的文件來說,讀寫它需要耗費的資源一樣巨大。更加令人費解的是,INNODB引擎竟然將索引和數據保存於同一個文件中,索引和數據之間尚存在資源爭用,不利於性能的提升。你當然可以通過innodb_data_file_path的配置規劃多個表空間文件,但MySQL的邏輯是“用滿後增加”,僅僅是一個文件的拆分而已,不能從根本上分離數據和索引。

獨占表空間

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

共享表空間 和 獨立表空間的優缺點

共享表空間優缺點

優點

可以將表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分布在不同步的文件上)。數據和文件放在一起方便管理。

缺點

所有的數據和索引存放到一個文件中意味著將有一個很大的文件,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,這樣對於一個表做了大量刪除操作後表空間中將會有大量的空隙,特別是對於統計分析,日值系統這類應用最不適合用共享表空間。

共享表空間管理會出現表空間分配後不能回縮的問題,當出現臨時建索引或是創建一個臨時表的操作表空間擴大後,就是刪除相關的表也沒辦法回縮那部分空間了。在磁盤監控時,也許就報警不斷了,但實際上MySQL還可以運行良好。另外,當磁盤上占用較多時性能也不是太好。這種情況處理只能是是建一個新的Slave從主庫上Dump出來,然後在Dump到從庫中,動作較大。對於InnoDB Hot Backup備份的操作(或是直接冷備),每次需要拷貝的文件比較大。如果現在有180G的表空間,但實際數據只有50多G,那麼我們將面對每次需要拷180G的數據。

獨立表空間優缺點

優點

每個表都有自已獨立的表空間。 每個表的數據和索引都會存在自已的表空間中。
可以實現單表在不同的數據庫中移動。 空間可以回收(除drop table操作外,不能自已回收表空間)。
Drop table操作會自動回收表空間,如果對於統計分析或是日值表,刪除大量數據後可以通過:alter table TableName engine=innodb;回縮不用的空間。

對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。
對於使用獨立表空間的表,不管怎麼刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。

缺點

單表增加過大,如超過100個G。

注:獨立表空間時,ibdata1文件中存儲著字典信息和undo 頁。所以冷備份的時候仍然需要備份ibdata1文件。如果ibdata1文件丟失,則會提示innodb表不存在,但其實其數據文件和表結構是存在的。

Innodb共享表空間轉化為獨立表空間

1.查看當前表空間情況:

mysql> show variables like '%per_table';
Variable_name Value innodb_file_per_table OFF

1 row in set (0.00 sec)

表示當前是共享表空間。

也可以通過觀察含有innodb類型的表的文件來了解:

[root@localhost Idx]# pwd
/home/mysql/data/Idx
[root@localhost Idx]# ls
album.frm  artist.frm   db.opt  Track.frm  Track.MYD  Track.MYI

想要將共享表空間轉化為獨立表空間有兩種方法:

先邏輯備份,然後修改配置文件my.cnf中的參數innodb_file_per_table參數為1,重啟服務後將邏輯備份導入即可。

修改配置文件my.cnf中的參數innodb_file_per_table參數為1,重啟服務後將需要修改的所有innodb表都執行一遍:alter table table_name engine=innodb;

使用第二種方式修改後,原來庫中的表中的數據會繼續存放於ibdata1中,新建的表才會使用獨立表空間.

查看當前的數據文件為:
[root@localhost Idx]# ls
album.frm  album.ibd  artist.frm  artist.ibd  db.opt  Track.frm  Track.MYD  Track.MYI
這樣就已經將共享表空間轉化為獨立表空間。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved