使用過MySQL的同學,剛開始接觸最多的莫過於MyISAM表引擎了,這種引擎的數據庫會分別創建三個文件:表結構、表索引、表數據空間。我們可以將某個數據庫目錄直接遷移到其他數據庫也可以正常工作。然而當你使用InnoDB的時候,一切都變了。
InnoDB 默認會將所有的數據庫InnoDB引擎的表數據存儲在一個共享空間中:ibdata1,這樣就感覺不爽,增刪數據庫的時候,ibdata1文件不會自動收縮,單個數據庫的備份也將成爲問題。通常只能將數據使用mysqldump 導出,然後再導入解決這個問題。
在MySQL的配置文件[mysqld]部分,增加innodb_file_per_table參數。
可以修改InnoDB爲獨立表空間模式,每個數據庫的每個表都會生成一個數據空間。
獨立表空間:
優點:
1. 每個表都有自已獨立的表空間。
2. 每個表的數據和索引都會存在自已的表空間中。
3. 可以實現單表在不同的數據庫中移動。
4. 空間可以回收(除drop table操作處,表空不能自已回收)
a) Drop table操作自動回收表空間,如果對於統計分析或是日值表,刪除大量數據後可以通過:alter table TableName engine=innodb;回縮不用的空間。
b) 對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。
c) 對於使用獨立表空間的表,不管怎麼刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。
缺點:
單表增加過大,如超過100個G。
對於單表增長過大的問題,如果使用共享表空間可以把文件分開,但有同樣有一個問題,如果訪問的範圍過大同樣會訪問多個文件,一樣會比較慢。對於獨立表空間也有一個解決辦法是:使用分區表,也可以把那個大的表空間移動到別的空間上然後做一個連接。其實從性能上出發,當一個表超過100個G有可能響應也是較慢了,對於獨立表空間還容易發現問題早做處理。
共享表空間:
優點:
可以放表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分佈在不同步的文件上)。數據和文件放在一起方便管理。
所有的數據和索引存放到一個文件中以爲着將有一個很常大的文件,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,這樣對於一個表做了大量刪除操作後表空間中將會有大量的空隙,特別是對於統計分析,日值系統這類應用最不適合用共享表空間。
我們知道共享表空間管理會出現表空間分配後不能回縮的問題,當出現臨時建索引或是創建一個臨時表的操作表空間擴大後,就是刪除相關的表也沒辦法回縮那部分空間了。我們存在磁盤監控時,也許就報警不斷了,但實際上MySQL還可以運行良好。另外,當磁盤上佔用較多時性能也不是太好。
這種情況處理只能是是建一個新的Slave從主庫上Dump出來,然後在Dump到從庫中,動作較大。
對於InnoDB Hot Backup備份的操作(或是直接冷備),每次需要CP的文件比較大。如果現在有180G的表空間,但實際數據只有50多G,那麼我們將面對每次需要拷180G的數據。
這種方式也許mysqldump是一個好的處理方式了。
結論:
共享表空間在Insert操作上少有優勢。其它都沒獨立表空間表現好。當啓用獨立表空間時,請合理調整一下:innodb_open_files 。
InnoDB Hot Backup(冷備)的表空間cp不會面對很多無用的copy了。而且利用innodb hot backup及表空間的管理命令可以實現單現移動。
1.innodb_file_per_table設置.開啓方法:
在my.cnf中[mysqld]下設置
innodb_file_per_table=1
2.查看是否開啓:
mysql> show variables like ‘%per_table%’;
3.關閉獨享表空間
innodb_file_per_table=0關閉獨立的表空間
mysql> show variables like ‘%per_table%’;