单个ibdata1文件包含MySQL数据库中的所有表和索引

2020-11-20 09:32:46 来源: INeng财经

在本教程中,我们将说明如何重建整个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,如下所示。

3.设置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提取到它自己的单独文件中,则必须优化该表。

假设您在thegeekstuff数据库下有一个名为Benefits的表。该收益表是在我们在my.cnf中设置innodb_file_per_table之前创建的。

因此,收益表仍将位于ibdata1文件下。要将其从ibdata1中移出到它自己的IBD文件中,我们必须优化表,如下所示。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。