您現在的位置是:首頁 >要聞 > 2021-08-27 00:43:10 來源:
一個單獨的ibdata1文件包含了MySQL數據庫中的所有表和索引
在本教程中,我們將解釋如何重建整個MySQL數據庫,以及如何將一個大的MySQL系統表空間文件分解成一個較小的MySQL表文件。在MySQL中,當您使用InnoDB時,所有表和索引都存儲在MySQL系統表空間中。MySQL系統表空間是ibdata1,位于/var/lib/mysql下
一個單獨的ibdata1文件包含MySQL數據庫中的所有表和索引。因此,如果您的數據庫很大,文件大小將非常大。
針對MySQL的Ibdata1
1.大型MySQL(和MariaDB)系統表空間
大型MySQL系統的默認表空間方法有一個主要缺點。
以這個案例為例:你已經上傳了價值100GB的數據到MySQL的幾個表中。
現在,ibdata1文件大小將超過100GB。
幾天后,您從所有這些表中刪除了大約50GB的數據。ibdata1的文件大小不會減少到50GB以上,但會保持在100GB以上。
問題是,從ibdata1文件中刪除50GB數據后,您將無法回收未使用的空間。有一種方法可以做到這一點,但是它太復雜了(解釋如下),并且需要關閉MySQL數據庫。
在上述情況下,當以后向表中添加10GB的數據時,ibdata1文件大小不會增加到110GB,而是保持在100GB。該文件在上述50GB已刪除數據中仍有未使用的空間。
因此,如何避免將所有表和索引存儲在單個ibdata1文件中?相反,它們存儲在多個表文件中?
2.將新表(和索引)視為一個單獨的文件
從現在開始,當您創建一個新的MySQL表時,您將獲得一個文件。
在這個例子中,我創建了一個名為employee的新表,并向其中上傳了大約20GB的數據。
這里會發生兩件事:
首先,它將在/var/lib/mysql目錄中創建一個名為“thegeekstuff”的子目錄。
其次,在數據庫目錄名下(即在thegeekstuff目錄下),您將看到一個單獨的文件EMPLOYEE。IBD正在被創造。文件的大小將是您只上傳到表中的數據的大小。在這種情況下,因為我們將價值20GB的數據上傳到表中,所以EMPLOYEE的大小。IBD文件約為20GB,如下圖所示。
設置innodb_file_per_table參數
為此,您應該在/etc/my.cnf文件的“mysqld”部分下使用innodb_file_per_table參數,如下所示:
注意:如果您使用的是MySQL 5.6.6(或MariaDB)及更高版本,以上是默認設置。
在本例中,在CentOS 6上,從yum存儲庫安裝時獲得的默認MySQL仍然是5.1.73,如下所示。
因此,在這種情況下,我們應該在my.cnf文件中設置innodb_file_per_table。
每當您對my.cnf進行任何更改時,都應該重新啟動MariaDB MySQL數據庫.
4.從ibdata1中提取現有表
接下來,如果您想從ibdata1中提取一個現有的表到它自己的單獨文件中,您必須優化該表。
假設在geekstuff數據庫下有一個名為“收益”的表。損益表是在我們在my.cnf中設置innodb_file_per_table之前創建的
因此,損益表仍將位于ibdata1文件下。要將其從ibdata1移動到自己的IBD文件,我們必須優化該表,如下所示。