您现在的位置是:首页 >要闻 > 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文件,我们必须优化该表,如下所示。

猜你喜欢