1. 程式人生 > >MySQL INNODB表空間兩種配置闡述

MySQL INNODB表空間兩種配置闡述

在mysql中,也出現了類似oracle中的表空間概念。

      開啟了Innodb的innodb_file_per_table這個引數之後【innodb_file_per_table = 1】,也就是啟用InnoDB的獨立表空間模式,便於管理。此時,在新建的innodb表的資料庫目錄下會多出來一個.ibd這個檔案。mysql會把這個innodb表的資料存放在這個檔案中。並且每個innodb表此時都會對應這麼一個ibd檔案。

mysql手冊說明很清楚:

      If innodb_file_per_table is disabled (the default), InnoDB creates tables in the 

system tablespace. Ifinnodb_file_per_table is enabled, InnoDB creates each new table using its own .ibd file for storing data and indexes, rather than in the system tablespace. 

      很搞不懂為什麼innodb_file_per_table預設是不開啟的。      

      開啟之後有什麼好處呢?

      可以實現單表在不同的資料庫之間移動。

      InnoDB 預設會將所有的資料庫InnoDB引擎的表資料儲存在一個共享空間

中:ibdata1,這樣就感覺很不方便,增刪資料庫的時候,ibdata1檔案不會自動收縮,ibdata1檔案增長到幾十G都有可能,單個數據庫的備份也將成為問題。通常只能將資料使用mysqldump 匯出,然後再匯入解決這個問題。共享表空間在Insert操作上有優勢。其它都沒獨立表空間表現好。當啟用獨立表空間時,請合理設定innodb_open_files 的值。

-------------------------------------------------------------------------------

需要說明的是:

1、設定了獨立表空間之後,如果改成了共享表空間,那麼,此時如果執行表的插入操作,資料會存放在哪裡呢?

對於之前已經存在了的表,還是存放在獨立表空間。對於新建的表,就會存放在共享表空間了。

2、如果一開始用了共享表空間,後來改了innodb_file_per_table變數的值,改成獨立表空間了,那麼資料如何儲存?

對於已經存在了的innodb引擎的表來說,資料還是存放在共享表空間的,而此時如果建立了新的表,那麼就會在資料庫的目錄中多出一個.ibd的檔案用於儲存這個新表的資料。

總結上面的1、2,就是:原來的還是按照原來的方式儲存。新的表按照新的規則來儲存。

3、mysql在第二點上處理的不太妥當,新舊資料為什麼要分開存放,為什麼不能自動把共享表空間裡的資料匯入到獨立表空間中?