• 您現在的位置是:首頁 >要聞 > 2021-08-27 00:43:10 來源:

    一個單獨的ibdata1文件包含了MySQL數據庫中的所有表和索引

    導讀 在本教程中,我們將解釋如何重建整個MySQL數據庫,以及如何將一個大的MySQL系統表空間文件分解成一個較小的MySQL表文件。在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文件,我們必須優化該表,如下所示。

    猜你喜歡

  • 成人app